本文详解 OpenAI Embeddings API 响应结构,解决因错误解构导致的 TypeError: undefined is not iterable 问题,并提供可靠、可复用的向量提取方法。
本文详解 openai embeddings api 响应结构,解决因错误解构导致的 `typeerror: undefined is not iterable` 问题,并提供可靠、可复用的向量提取方法。
OpenAI 的 Embeddings API(如 text-embedding-ada-002)返回的响应结构为标准 JSON 格式,其嵌套层级为:{ data: [{ embedding: [...], index: 0, object: "embedding" }] }。关键点在于:embeddingResponse.data 是一个数组,且每个请求(即使只传入单个字符串)都对应数组中的一个元素——它不是 { data: { embedding: [...] } } 或 embeddingResponse.data.data 这样的双层嵌套。
你原代码中使用了:
const [{ embedding }] = embeddingResponse.data.data; // ❌ 错误:data 没有 data 属性
这会导致 embeddingResponse.data.data 为 undefined,进而触发 TypeError: undefined is not iterable。正确做法是直接访问 embeddingResponse.data[0].embedding(因为单次请求仅生成一个 embedding 对象):
const documents = [ "Cooper codes is a youtuber with 5,300 subscribers", "Cooper codes likes clam chowder", "Cooper codes has a video", "Cooper codes has a web site called coopercodes.com"];for (const document of documents) { const input = document.replace(/n/g, ''); const parameters = { model: 'text-embedding-ada-002', input }; const embeddingResponse = await openai.embeddings.create(parameters); // ✅ 正确提取:data 是数组,取首项的 embedding 字段 const embedding = embeddingResponse.data[0].embedding; console.log('Embedding vector length:', embedding.length); // 通常为 1536(ada-002) console.log('First 5 values:', embedding.slice(0, 5)); // 示例:插入 Supabase(取消注释前请确保已配置 client) // await supabaseClient.from('documents').insert({ // content: document, // embedding // });}
⚠️ 注意事项:
✅ 总结:牢记 embeddingResponse.data 是数组,用 embeddingResponse.data[0].embedding 安全取值;避免解构赋值时对未定义属性进行迭代。此模式适用于所有 OpenAI v1.x SDK 版本(@openai/openai)。