安装与设置
Copy
Ask AI
npm install @langchain/openai @mendable/firecrawl-js
.env 文件:
Copy
Ask AI
FIRECRAWL_API_KEY=your_firecrawl_key
OPENAI_API_KEY=your_openai_key
注意: 如果使用 Node 版本低于 20,请安装dotenv,并在代码中添加import 'dotenv/config'。
抓取 + 对话
Copy
Ask AI
import FirecrawlApp from '@mendable/firecrawl-js';
import { ChatOpenAI } from '@langchain/openai';
import { HumanMessage } from '@langchain/core/messages';
const firecrawl = new FirecrawlApp({ apiKey: process.env.FIRECRAWL_API_KEY });
const chat = new ChatOpenAI({
model: 'gpt-5-nano',
apiKey: process.env.OPENAI_API_KEY
});
const scrapeResult = await firecrawl.scrape('https://firecrawl.dev', {
formats: ['markdown']
});
console.log('抓取内容长度:', scrapeResult.markdown?.length);
const response = await chat.invoke([
new HumanMessage(`总结: ${scrapeResult.markdown}`)
]);
console.log('摘要:', response.content);
Chains
Copy
Ask AI
import FirecrawlApp from '@mendable/firecrawl-js';
import { ChatOpenAI } from '@langchain/openai';
import { ChatPromptTemplate } from '@langchain/core/prompts';
import { StringOutputParser } from '@langchain/core/output_parsers';
const firecrawl = new FirecrawlApp({ apiKey: process.env.FIRECRAWL_API_KEY });
const model = new ChatOpenAI({
model: 'gpt-5-nano',
apiKey: process.env.OPENAI_API_KEY
});
const scrapeResult = await firecrawl.scrape('https://stripe.com', {
formats: ['markdown']
});
console.log('抓取内容长度:', scrapeResult.markdown?.length);
// 创建处理链
const prompt = ChatPromptTemplate.fromMessages([
['system', '你是分析公司网站的专家。'],
['user', '从以下内容中提取公司名称和主要产品: {content}']
]);
const chain = prompt.pipe(model).pipe(new StringOutputParser());
// 执行链
const result = await chain.invoke({
content: scrapeResult.markdown
});
console.log('链执行结果:', result);
工具调用
Copy
Ask AI
import FirecrawlApp from '@mendable/firecrawl-js';
import { ChatOpenAI } from '@langchain/openai';
import { DynamicStructuredTool } from '@langchain/core/tools';
import { z } from 'zod';
const firecrawl = new FirecrawlApp({ apiKey: process.env.FIRECRAWL_API_KEY });
// 创建网页抓取工具
const scrapeWebsiteTool = new DynamicStructuredTool({
name: 'scrape_website',
description: '从任意网站 URL 抓取内容',
schema: z.object({
url: z.string().url().describe('要抓取的 URL')
}),
func: async ({ url }) => {
console.log('正在抓取:', url);
const result = await firecrawl.scrape(url, {
formats: ['markdown']
});
console.log('抓取内容预览:', result.markdown?.substring(0, 200) + '...');
return result.markdown || '未抓取到内容';
}
});
const model = new ChatOpenAI({
model: 'gpt-5-nano',
apiKey: process.env.OPENAI_API_KEY
}).bindTools([scrapeWebsiteTool]);
const response = await model.invoke('什么是 Firecrawl?访问 firecrawl.dev 并告诉我相关信息。');
console.log('响应:', response.content);
console.log('工具调用:', response.tool_calls);
结构化数据提取
Copy
Ask AI
import FirecrawlApp from '@mendable/firecrawl-js';
import { ChatOpenAI } from '@langchain/openai';
import { z } from 'zod';
const firecrawl = new FirecrawlApp({ apiKey: process.env.FIRECRAWL_API_KEY });
const scrapeResult = await firecrawl.scrape('https://stripe.com', {
formats: ['markdown']
});
console.log('抓取内容长度:', scrapeResult.markdown?.length);
const CompanyInfoSchema = z.object({
name: z.string(),
industry: z.string(),
description: z.string(),
products: z.array(z.string())
});
const model = new ChatOpenAI({
model: 'gpt-5-nano',
apiKey: process.env.OPENAI_API_KEY
}).withStructuredOutput(CompanyInfoSchema);
const companyInfo = await model.invoke([
{
role: 'system',
content: '从网站内容中提取公司信息。'
},
{
role: 'user',
content: `提取数据: ${scrapeResult.markdown}`
}
]);
console.log('提取的公司信息:', companyInfo);

