Pada halaman ini
Mastra ialah rangka kerja ejen AI yang mengutamakan TypeScript, direka untuk membina aplikasi AI yang sedia pengeluaran. CrawlForge memberi ejen tersebut keupayaan untuk fetch, ekstrak, dan menganalisis data web langsung. Bersama-sama, ia membolehkan anda membina ejen yang boleh menyelidik topik, memantau pesaing, dan mengekstrak data berstruktur daripada mana-mana laman web.
Panduan ini menunjukkan kepada anda cara menyambungkan tools CrawlForge ke dalam ejen Mastra dengan contoh TypeScript yang berfungsi.
Jadual Kandungan
- Apakah Itu Mastra?
- Prasyarat
- Langkah 1: Sediakan Projek Mastra Anda
- Langkah 2: Cipta Takrifan Tool CrawlForge
- Langkah 3: Bina Ejen Penyelidikan Web
- Langkah 4: Bina Aliran Kerja Pengekstrakan Data
- Langkah 5: Tambah Pengendalian Ralat dan Cubaan Semula
- Rujukan Kos Credit
- Gambaran Keseluruhan Seni Bina
- Langkah Seterusnya
Apakah Itu Mastra?
Mastra ialah rangka kerja TypeScript moden untuk aplikasi dan ejen berkuasa AI. Ia menyediakan primitif untuk penciptaan ejen, integrasi tool, aliran kerja, dan ingatan -- semuanya dengan keselamatan jenis yang penuh. Anggap ia sebagai Express.js untuk ejen AI: minimum, boleh dikarang, dan berorientasikan pengeluaran.
Ejen Mastra boleh menggunakan tools luaran melalui antara muka tool yang diseragamkan. Tools CrawlForge dipetakan terus ke antara muka ini, memberi ejen anda 20 keupayaan web scraping tanpa menulis kod klien HTTP.
Prasyarat
- Node.js 18+ dan TypeScript 5+
- Sebuah akaun CrawlForge dengan API key (1,000 credits percuma)
- Kebiasaan asas dengan TypeScript dan async/await
Langkah 1: Sediakan Projek Mastra Anda
Cipta projek Mastra baharu dan pasang kebergantungan:
npm create mastra@latest my-web-agent
cd my-web-agent
# Install additional dependencies
npm install dotenv node-fetchTambah API key CrawlForge anda ke .env:
CRAWLFORGE_API_KEY=cf_live_your_key_here
ANTHROPIC_API_KEY=sk-ant-your_key_hereLangkah 2: Cipta Takrifan Tool CrawlForge
Cipta fail tools yang membungkus API CrawlForge sebagai tools yang serasi dengan Mastra:
// src/tools/crawlforge.ts
import { createTool } from '@mastra/core';
import { z } from 'zod';
const CRAWLFORGE_BASE = 'https://crawlforge.dev/api/v1/tools';
async function callCrawlForge(tool: string, params: Record<string, unknown>) {
const response = await fetch(`${CRAWLFORGE_BASE}/${tool}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.CRAWLFORGE_API_KEY}`,
},
body: JSON.stringify(params),
});
if (!response.ok) {
throw new Error(`CrawlForge ${tool} failed: ${response.status}`);
}
return response.json();
}
// Extract clean content from a URL (2 credits)
export const extractContent = createTool({
id: 'crawlforge-extract-content',
description: 'Extract clean, readable content from any web page. Costs 2 credits.',
inputSchema: z.object({
url: z.string().url().describe('The URL to extract content from'),
}),
execute: async ({ context }) => {
return callCrawlForge('extract_content', { url: context.url });
},
});
// Search the web (5 credits)
export const searchWeb = createTool({
id: 'crawlforge-search-web',
description: 'Search the web using Google. Returns titles, URLs, and snippets. Costs 5 credits.',
inputSchema: z.object({
query: z.string().describe('Search query string'),
limit: z.number().optional().default(10).describe('Max results to return'),
}),
execute: async ({ context }) => {
return callCrawlForge('search_web', {
query: context.query,
limit: context.limit,
});
},
});
// Fetch raw HTML (1 credit)
export const fetchUrl = createTool({
id: 'crawlforge-fetch-url',
description: 'Fetch raw HTML content from a URL. Cheapest option at 1 credit.',
inputSchema: z.object({
url: z.string().url().describe('The URL to fetch'),
}),
execute: async ({ context }) => {
return callCrawlForge('fetch_url', { url: context.url });
},
});
// Extract structured data with CSS selectors (2 credits)
export const scrapeStructured = createTool({
id: 'crawlforge-scrape-structured',
description: 'Extract data using CSS selectors. Costs 2 credits.',
inputSchema: z.object({
url: z.string().url().describe('The URL to scrape'),
selectors: z.record(z.string()).describe('CSS selectors mapping field names to selectors'),
}),
execute: async ({ context }) => {
return callCrawlForge('scrape_structured', {
url: context.url,
selectors: context.selectors,
});
},
});Langkah 3: Bina Ejen Penyelidikan Web
Cipta ejen yang boleh mencari di web dan mengekstrak kandungan untuk tugas penyelidikan:
// src/agents/researcher.ts
import { Agent } from '@mastra/core';
import { searchWeb, extractContent, fetchUrl } from '../tools/crawlforge';
export const researcherAgent = new Agent({
name: 'Web Researcher',
instructions: `You are a web research agent. When asked to research a topic:
1. Use search_web to find relevant pages (5 credits)
2. Use extract_content on the top 2-3 results (2 credits each)
3. Synthesize findings into a structured summary
Always report the total credits used.
Prefer fetch_url (1 credit) over extract_content (2 credits) when you only need raw HTML.
Never use search_web if the user provides a specific URL.`,
model: {
provider: 'ANTHROPIC',
name: 'claude-sonnet-4-20250514',
},
tools: {
searchWeb,
extractContent,
fetchUrl,
},
});Jalankan ejen:
// src/index.ts
import { researcherAgent } from './agents/researcher';
async function main() {
const result = await researcherAgent.generate(
'Research the current state of MCP protocol adoption. ' +
'Which companies are using it and for what use cases?'
);
console.log(result.text);
// Output: Structured research summary with sources
// Credits used: ~11 (1 search + 3 extractions)
}
main();Langkah 4: Bina Aliran Kerja Pengekstrakan Data
Aliran kerja Mastra membolehkan anda merangkai tools menjadi saluran paip deterministik. Berikut ialah pemantau harga kompetitif:
// src/workflows/pricing-monitor.ts
import { Workflow, Step } from '@mastra/core';
import { searchWeb, scrapeStructured } from '../tools/crawlforge';
const findCompetitors = new Step({
id: 'find-competitors',
execute: async ({ context }) => {
// Search for competitors (5 credits)
const results = await searchWeb.execute({
context: { query: `${context.product} pricing plans`, limit: 5 },
});
return { urls: results.results.map((r: { link: string }) => r.link) };
},
});
const extractPricing = new Step({
id: 'extract-pricing',
execute: async ({ context }) => {
const pricingData = [];
// Extract pricing from each competitor (2 credits each)
for (const url of context.urls.slice(0, 3)) {
try {
const data = await scrapeStructured.execute({
context: {
url,
selectors: {
planNames: '.plan-name, .pricing-tier h3',
prices: '.price, .plan-price',
features: '.feature-list li, .plan-features li',
},
},
});
pricingData.push({ url, ...data });
} catch (error) {
pricingData.push({ url, error: 'Extraction failed' });
}
}
return { pricingData };
// Total: 5 + (3 * 2) = 11 credits
},
});
export const pricingMonitorWorkflow = new Workflow({
name: 'Pricing Monitor',
steps: [findCompetitors, extractPricing],
});Langkah 5: Tambah Pengendalian Ralat dan Cubaan Semula
Ejen pengeluaran memerlukan pengendalian ralat yang berdaya tahan. Berikut ialah corak untuk panggilan tool CrawlForge:
// src/tools/resilient-crawlforge.ts
import { createTool } from '@mastra/core';
import { z } from 'zod';
const CRAWLFORGE_BASE = 'https://crawlforge.dev/api/v1/tools';
async function callWithRetry(
tool: string,
params: Record<string, unknown>,
maxRetries = 2
): Promise<unknown> {
let lastError: Error | null = null;
for (let attempt = 0; attempt <= maxRetries; attempt++) {
try {
const response = await fetch(`${CRAWLFORGE_BASE}/${tool}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.CRAWLFORGE_API_KEY}`,
},
body: JSON.stringify(params),
});
if (response.status === 429) {
// Rate limited -- wait and retry
const retryAfter = parseInt(response.headers.get('Retry-After') || '2');
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
continue;
}
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${await response.text()}`);
}
return response.json();
} catch (error) {
lastError = error as Error;
if (attempt < maxRetries) {
await new Promise(resolve => setTimeout(resolve, 1000 * (attempt + 1)));
}
}
}
throw lastError;
}
export const resilientExtractContent = createTool({
id: 'crawlforge-extract-content-resilient',
description: 'Extract content with automatic retry on failure. 2 credits per successful call.',
inputSchema: z.object({
url: z.string().url(),
}),
execute: async ({ context }) => {
return callWithRetry('extract_content', { url: context.url });
},
});Rujukan Kos Credit
| Credits | Tools | Kes Penggunaan Mastra |
|---|---|---|
| 1 | fetch_url, extract_text, extract_links, extract_metadata | Pengambilan data pantas dalam tools ejen |
| 2 | scrape_structured, extract_content, map_site, process_document, localization | Pengekstrakan aliran kerja, audit laman, pemprosesan dokumen |
| 3 | track_changes, analyze_content | Pengesanan perubahan, analisis kandungan |
| 4 | summarize_content, crawl_deep | Ringkasan, crawling pelbagai halaman |
| 5 | search_web, batch_scrape, scrape_with_actions, stealth_mode | Ejen penyelidikan, operasi pukal |
| 10 | deep_research | Ejen analisis menyeluruh |
Gambaran Keseluruhan Seni Bina
| Komponen | Peranan |
|---|---|
| Ejen Mastra | Mengatur panggilan tool, mengekalkan konteks perbualan |
| Tools Mastra | Pembungkus bertaip di sekeliling titik akhir API CrawlForge |
| Aliran Kerja Mastra | Saluran paip pelbagai langkah deterministik untuk operasi pukal |
| API CrawlForge | Melaksanakan web scraping, memulangkan data berstruktur |
| Sistem Credit | Menjejak penggunaan setiap API key, menguatkuasakan had |
Ejen Mastra memutuskan tool CrawlForge yang hendak dipanggil berdasarkan tugas. Pembungkus tool mengendalikan komunikasi HTTP, dan CrawlForge melaksanakan scraping yang sebenar. Credits ditolak secara atomik pada setiap panggilan tool yang berjaya.
Langkah Seterusnya
- Panduan Mula Pantas Mastra -- dokumentasi rasmi Mastra
- Rujukan API CrawlForge -- dokumentasi titik akhir yang lengkap
- Bina Pembantu Penyelidikan -- corak serupa menggunakan Claude secara langsung
- Automasi Penyelidikan Mendalam -- aliran kerja penyelidikan lanjutan
Bina ejen AI sedar-web pertama anda hari ini. Daftar untuk CrawlForge (1,000 credits percuma), bina rangka projek Mastra, dan beri ejen anda kuasa untuk melakukan scraping pada seluruh web.
Cuba sendiri — tiada pendaftaran diperlukan
Jalankan mana-mana daripada 27 alat scraping dan pengekstrakan CrawlForge dalam playground, kemudian mula secara percuma dengan 1,000 credits.
1,000 credits percuma • Isi semula setiap bulan • Tiada kad kredit diperlukan
Tag
Tentang Penulis
Kekal dikemas kini dengan pandangan terkini
Dapatkan tutorial, kemas kini produk dan petua web scraping terus ke peti masuk anda.
Tiada spam. Berhenti melanggan bila-bila masa.