LangChain
Penyepaduan LangChain
Sepadukan CrawlForge MCP dengan LangChain untuk membina ejen AI yang berkuasa dengan keupayaan web scraping. Gunakan sebagai pemuat dokumen, alat, atau rantaian perolehan tersuai.
Kes Penggunaan
Pemuat Dokumen
Muatkan halaman web sebagai dokumen untuk vector store dan aplikasi RAG
Ejen AI
Beri ejen alat web scraping untuk mengambil data masa nyata
Rantaian Perolehan
Bina rantaian tersuai yang mengambil dan memproses kandungan web
Saluran Paip Penyelidikan
Cipta aliran kerja penyelidikan automatik dengan alat deep_research
Pemasangan
Pasang LangChain. CrawlForge tiada pakej penyesuai — pemuat dan alat di bawah ialah kelas biasa yang anda salin ke dalam projek anda.
Bash
npm install langchain @langchain/core @langchain/openai zodAnda juga memerlukan API key CrawlForge daripada dashboard.
Pemuat Dokumen
Gunakan CrawlForge sebagai pemuat dokumen untuk mengambil halaman web bagi aplikasi RAG.
crawlforge.tsTypescript
import { BaseDocumentLoader } from '@langchain/core/document_loaders/base';
import { Document } from '@langchain/core/documents';
const CRAWLFORGE_API = 'https://www.crawlforge.dev/api/v1/tools';
/** Every CrawlForge tool is a POST to /api/v1/tools/<tool_name>. */
export async function callTool<T>(
tool: string,
params: Record<string, unknown>,
): Promise<T> {
const response = await fetch(`${CRAWLFORGE_API}/${tool}`, {
method: 'POST',
headers: {
'X-API-Key': process.env.CRAWLFORGE_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify(params),
});
const payload = await response.json();
if (!payload.success) {
throw new Error(payload.error?.message ?? 'CrawlForge request failed');
}
return payload.data as T;
}
interface ExtractedContent {
url: string;
title: string;
content: string;
author: string | null;
publish_date: string | null;
}
/** Loads each URL through extract_content (2 credits per URL). */
export class CrawlForgeLoader extends BaseDocumentLoader {
constructor(private readonly urls: string[]) {
super();
}
async load(): Promise<Document[]> {
return Promise.all(
this.urls.map(async (url) => {
const data = await callTool<ExtractedContent>('extract_content', { url });
return new Document({
pageContent: data.content,
metadata: {
source: data.url,
title: data.title,
author: data.author,
publishedAt: data.publish_date,
},
});
}),
);
}
}
// ---------- usage ----------
const docs = await new CrawlForgeLoader([
'https://example.com/page1',
'https://example.com/page2',
]).load();
console.log(docs[0].pageContent);
console.log(docs[0].metadata.title);Amalan Terbaik: Gunakan
extract_text untuk kandungan bersih atau extract_content untuk pengekstrakan artikel.Saluran Paip RAG dengan Vector Store
Bina saluran paip RAG yang lengkap dengan pemuat dokumen CrawlForge dan vector store.
Typescript
import { ChatPromptTemplate } from '@langchain/core/prompts';
import { StringOutputParser } from '@langchain/core/output_parsers';
import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai';
import { MemoryVectorStore } from 'langchain/vectorstores/memory';
import { CrawlForgeLoader } from './crawlforge';
// 1. Load web pages as LangChain documents (2 credits per URL)
const docs = await new CrawlForgeLoader([
'https://example.com/doc1',
'https://example.com/doc2',
'https://example.com/doc3',
]).load();
// 2. Embed them into a vector store
const store = await MemoryVectorStore.fromDocuments(docs, new OpenAIEmbeddings());
const retriever = store.asRetriever({ k: 4 });
// 3. Retrieve the relevant chunks, then answer over them
const prompt = ChatPromptTemplate.fromTemplate(
'Answer using only this context:\n\n{context}\n\nQuestion: {question}',
);
const model = new ChatOpenAI({ model: 'gpt-4o-mini' });
const question = 'What are the key points from these documents?';
const context = (await retriever.invoke(question))
.map((doc) => doc.pageContent)
.join('\n\n');
const answer = await prompt
.pipe(model)
.pipe(new StringOutputParser())
.invoke({ context, question });
console.log(answer);Alat Ejen
Beri ejen LangChain keupayaan web scraping dengan alat CrawlForge.
tools.tsTypescript
import { DynamicStructuredTool } from '@langchain/core/tools';
import { ChatOpenAI } from '@langchain/openai';
import { z } from 'zod';
import { callTool } from './crawlforge';
interface SearchResults {
results: { title: string; url: string; snippet: string }[];
}
export const searchWeb = new DynamicStructuredTool({
name: 'search_web',
description: 'Search the web and return ranked results. Costs 5 credits.',
schema: z.object({
query: z.string().describe('What to search for'),
limit: z.number().optional().describe('How many results, 1-100 (default 10)'),
}),
func: async ({ query, limit }) => {
const data = await callTool<SearchResults>('search_web', { query, limit });
return JSON.stringify(data.results);
},
});
export const readPage = new DynamicStructuredTool({
name: 'extract_content',
description: 'Extract the main article text from one URL. Costs 2 credits.',
schema: z.object({
url: z.string().url().describe('The page to read'),
}),
func: async ({ url }) => {
const data = await callTool<{ title: string; content: string }>(
'extract_content',
{ url },
);
return `${data.title}\n\n${data.content}`;
},
});
// ---------- usage ----------
// These are ordinary LangChain tools, so they also drop straight into an
// agent executor or a LangGraph node.
const model = new ChatOpenAI({ model: 'gpt-4o-mini', temperature: 0 })
.bindTools([searchWeb, readPage]);
const reply = await model.invoke('Which CrawlForge plan includes 50,000 credits?');
for (const call of reply.tool_calls ?? []) {
console.log(call.name, call.args);
}Petua Ejen: Gunakan nama dan penerangan alat yang deskriptif untuk membantu LLM memilih alat yang betul. Setiap panggilan alat membelanjakan credits —
search_web berkos 5 dan extract_content berkos 2 — jadi pastikan penerangan cukup spesifik supaya ejen tidak perlu meneka.Rantaian Perolehan Tersuai
Bina rantaian tersuai yang mencari, mengambil dan meringkaskan kandungan web.
Typescript
import { ChatPromptTemplate } from '@langchain/core/prompts';
import { StringOutputParser } from '@langchain/core/output_parsers';
import { RunnableSequence } from '@langchain/core/runnables';
import { ChatOpenAI } from '@langchain/openai';
import { callTool } from './crawlforge';
interface ResearchResult {
research_report: {
title: string;
sections: { executive_summary?: string; findings?: unknown };
};
}
// deep_research costs 10 credits per call, so put it behind a chain step
// rather than calling it per retrieved chunk.
const research = async (question: string) => {
const data = await callTool<ResearchResult>('deep_research', {
research_query: question,
research_scope: { depth_level: 'moderate' },
});
return data.research_report.sections.executive_summary ?? '';
};
const prompt = ChatPromptTemplate.fromTemplate(
'Based on this research, answer the question.\n\n{context}\n\nQuestion: {question}',
);
const chain = RunnableSequence.from([
{
context: (input: { question: string }) => research(input.question),
question: (input: { question: string }) => input.question,
},
prompt,
new ChatOpenAI({ model: 'gpt-4o-mini' }),
new StringOutputParser(),
]);
const result = await chain.invoke({
question: 'What are the latest AI safety research findings?',
});
console.log(result);Amalan Terbaik
- Pilih Alat yang Betul — Gunakan
extract_text(1 credit) untuk kandungan ringkas,deep_research(10 credits) untuk analisis menyeluruh - Laksanakan Caching — Cache dokumen yang diambil untuk mengelakkan panggilan API berulang dan menjimatkan credits
- Kendalikan Had Kadar — Laksanakan logik cuba semula dengan backoff eksponen untuk aplikasi pengeluaran
- Pantau Penggunaan Credit — Semak metadata dokumen untuk penggunaan credit dan sediakan amaran dalam dashboard anda
Bersedia untuk membina dengan LangChain?
Terokai kesemua 29 alat CrawlForge atau lihat penyepaduan lain.