NextJS 14项目Pinecone调用报错:this.pineconeIndex.namespace is not a function
解决PineconeStore报错:
this.pineconeIndex.namespace is not a function 这个错误的核心原因是Pinecone SDK版本与LangChain的PineconeStore实现不兼容:旧版Pinecone SDK(v1.x)的Index对象提供namespace()方法,而新版SDK(v2.x)已经移除了这个方法,改用index.namespace("namespace-name")的方式获取命名空间对象。
方案一:降级Pinecone SDK到兼容版本(最快解决)
如果不想改动现有代码,可以直接降级到Pinecone v1.x SDK:
- 卸载当前SDK:
npm uninstall @pinecone-database/pinecone
- 安装v1.x兼容版本:
npm install @pinecone-database/pinecone@1.1.0
降级后,你的现有代码(包括pinecone.ts和API路由)无需修改,即可正常运行。
方案二:升级到Pinecone v2 SDK并适配代码(推荐长期方案)
如果想使用最新版Pinecone SDK,需要同步调整代码:
1. 更新依赖
确保安装最新版的LangChain相关包和Pinecone v2 SDK:
npm update @langchain/community @langchain/openai @langchain/core npm install @pinecone-database/pinecone
2. 修改pinecone.ts初始化代码
新版Pinecone SDK不再需要指定environment,API密钥已包含环境信息:
import { Pinecone } from "@pinecone-database/pinecone"; const getPineconeClient = async () => { const pinecone = new Pinecone({ apiKey: process.env.PINECONE_API_KEY!, }); return pinecone; }; export default getPineconeClient;
3. 调整API路由中的PineconeStore调用
在创建索引对象时直接指定命名空间,不再将namespace作为参数传给fromDocuments:
/* eslint-disable import/prefer-default-export, @typescript-eslint/no-unused-vars */ import { PDFLoader } from "langchain/document_loaders/fs/pdf" import { NextRequest, NextResponse } from "next/server" import { OpenAIEmbeddings } from "@langchain/openai" // 确保从@langchain/community导入PineconeStore import { PineconeStore } from "@langchain/community/vectorstores/pinecone" import getPineconeClient from "@/lib/pinecone" async function streamToArrayBuffer(stream: ReadableStream) { return new Uint8Array(await new Response(stream).arrayBuffer()) } export async function POST(request: NextRequest) { const data = await request.body if (!data) return NextResponse.json({ success: false }) const arrayBuffer = await streamToArrayBuffer(data) const blob = new Blob([arrayBuffer]) const loader = new PDFLoader(blob) const pageLevelDocs = await loader.load() const pagesAmt = pageLevelDocs.length // Vectorize and index document const pinecone = await getPineconeClient() // 直接获取带命名空间的索引对象 const pineconeIndex = pinecone.Index("poco").namespace("pdf") const embeddings = new OpenAIEmbeddings({ openAIApiKey: process.env.OPENAI_API_KEY, }) // 不再传递namespace参数 await PineconeStore.fromDocuments(pageLevelDocs, embeddings, { pineconeIndex, }) return NextResponse.json({ success: true, pages: pagesAmt }) }
内容的提问来源于stack exchange,提问作者Ubiquitous Ubuntu
相关产品推荐
相关产品推荐

