メインコンテンツへスキップ
Firecrawl を LangChain と連携し、Web データを活用した AI アプリケーションを構築します。

セットアップ

npm install @langchain/openai @mendable/firecrawl-js 
.env ファイルを作成する:
FIRECRAWL_API_KEY=your_firecrawl_key
OPENAI_API_KEY=your_openai_key
注記: Node 20 未満を使用している場合は、dotenv をインストールし、コードに import 'dotenv/config' を追加してください。

スクレイプ + チャット

この例では、ウェブサイトをスクレイピングし、LangChain でコンテンツを処理するというシンプルなワークフローを示します。
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);

チェーン

この例では、スクレイピングしたコンテンツを処理・分析するための LangChain チェーンの作り方を示します。
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);

ツール呼び出し

この例では、モデルがウェブサイトをいつスクレイピングするかを判断できるよう、LangChainのツール呼び出し機能の使い方を示します。
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);

構造化データの抽出

この例では、LangChain の構造化出力機能を使って構造化データを抽出する方法を示します。
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);
さらに詳しい例は、LangChain のドキュメントをご確認ください。