我在一个React项目中使用Google Gemini API来根据表单收集的输入信息获取数据。然而,当我调用generateContent方法时,出现了以下错误:
Error generating content: TypeError: request is not iterable at formatNewContent (index.mjs:881:36) at formatGenerateContentInput (index.mjs:962:25) at GenerativeModel.generateContent (index.mjs:1309:33) at run (gemini.jsx:32:36) at onSent (Context.jsx:59:64) at handleSubmit (Main.jsx:20:5) at HTMLUnknownElement.callCallback2 (react-dom.development.js:4164:14) at Object.invokeGuardedCallbackDev (react-dom.development.js:4213:16) at invokeGuardedCallback (react-dom.development.js:4277:31) at invokeGuardedCallbackAndCatchFirstError (react-dom.development.js:4291:25)
错误背景这个错误似乎表明请求对象的格式不正确,或者Gemini API方法期望不同的输入格式。以下是我尝试根据表单输入生成内容的相关代码部分。
import { GoogleGenerativeAI, HarmCategory, HarmBlockThreshold,} from "@google/generative-ai";const apiKey = process.env.REACT_APP_GEN_AI_API_KEY; // 确保在环境中设置了这个const genAI = new GoogleGenerativeAI(apiKey);const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash",});const generationConfig = { temperature: 1, topP: 0.95, topK: 64, maxOutputTokens: 8192, responseMimeType: "text/plain",};export async function run({ education, technologies, level, projects, firstCourse }) { try { // 调试时记录输入 console.log("Inputs for career suggestion:", { education, technologies, level, projects, firstCourse }); // 职业建议 const prompt = `Education: ${education}, skills: ${technologies}, Level: ${level}, Projects_done: ${projects}. Based on my education, skills, and level, which career should I opt for ${firstCourse}? Just tell me one branch in one word.`; console.log("Prompt for career suggestion:", prompt); // 确保对generateContent的调用具有正确的结构 const result = await model.generateContent({ prompt, generationConfig }); if (!result || typeof result.text !== 'string') { throw new Error("Invalid response from model for career suggestion"); } const decision = result.text.trim() || "Unable to determine"; // 最佳课程 const prompt_2 = `${decision} was suggested by a friend. Give me the 5 best free courses with links to master this field, ordered from beginner to advanced. Only list 5 links, no description.`; console.log("Prompt for courses:", prompt_2); const result_2 = await model.generateContent({ prompt: prompt_2, generationConfig }); if (!result_2 || typeof result_2.text !== 'string') { throw new Error("Invalid response from model for courses"); } const courseDisplay = result_2.text.trim() || "No courses found"; // 热门项目 const prompt_3 = `For a ${decision} career, suggest 5 trending projects to build my skills at ${level} level.`; console.log("Prompt for projects:", prompt_3); const result_3 = await model.generateContent({ prompt: prompt_3, generationConfig }); if (!result_3 || typeof result_3.text !== 'string') { throw new Error("Invalid response from model for projects"); } const project = result_3.text.trim() || "No projects available"; return { decision, courseDisplay, project }; } catch (error) { console.error("Error generating content:", error); return { decision: "Error", courseDisplay: "Error fetching courses", project: "Error fetching projects" }; }} export default run;
我希望能得到关于职业建议、课程和项目的三种响应,请帮助我解决这个错误。
我尝试过的方法我已经验证了我的REACT_APP_GEN_AI_API_KEY在环境变量中设置正确。检查了generateContent是否接收到了prompt和generationConfig。将prompt和generationConfig打印到控制台,它们看起来格式正确。
回答:
修改点:
- 在你的脚本中,在
const result = await model.generateContent({prompt, generationConfig});
处,属性prompt
不存在。我猜这可能是你当前问题的根本原因。 generationConfig
可以包含在genAI.getGenerativeModel
的参数中。- 此外,
result.text
返回undefined
。
当这些点简单地反映在你展示的脚本中时,它将变成如下所示。
修改后的脚本:
import { GoogleGenerativeAI, HarmCategory, HarmBlockThreshold,} from "@google/generative-ai";const apiKey = process.env.REACT_APP_GEN_AI_API_KEY; // 确保在环境中设置了这个const genAI = new GoogleGenerativeAI(apiKey);const generationConfig = { temperature: 1, topP: 0.95, topK: 64, maxOutputTokens: 8192, responseMimeType: "text/plain",};const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash", generationConfig,});export async function run({ education, technologies, level, projects, firstCourse }) { try { // 调试时记录输入 console.log("Inputs for career suggestion:", { education, technologies, level, projects, firstCourse }); // 职业建议 const prompt = `Education: ${education}, skills: ${technologies}, Level: ${level}, Projects_done: ${projects}. Based on my education, skills, and level, which career should I opt for ${firstCourse}? Just tell me one branch in one word.`; console.log("Prompt for career suggestion:", prompt); // 确保对generateContent的调用具有正确的结构 const result = await model.generateContent(prompt); if (!result || typeof result.response.text() !== "string") { throw new Error("Invalid response from model for career suggestion"); } const decision = result.response.text().trim() || "Unable to determine"; // 最佳课程 const prompt_2 = `${decision} was suggested by a friend. Give me the 5 best free courses with links to master this field, ordered from beginner to advanced. Only list 5 links, no description.`; console.log("Prompt for courses:", prompt_2); const result_2 = await model.generateContent(prompt_2); if (!result_2 || typeof result_2.response.text() !== "string") { throw new Error("Invalid response from model for courses"); } const courseDisplay = result_2.response.text().trim() || "No courses found"; // 热门项目 const prompt_3 = `For a ${decision} career, suggest 5 trending projects to build my skills at ${level} level.`; console.log("Prompt for projects:", prompt_3); const result_3 = await model.generateContent(prompt_3); if (!result_3 || typeof result_3.response.text() !== "string") { throw new Error("Invalid response from model for projects"); } const project = result_3.response.text().trim() || "No projects available"; return { decision, courseDisplay, project }; } catch (error) { console.error("Error generating content:", error); return { decision: "Error", courseDisplay: "Error fetching courses", project: "Error fetching projects", }; }}export default run;
- 当我测试这个修改后的脚本时,我确认它可以无错误地工作。