You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Discord.js v14集成Gemini机器人报错TypeError: request is not iterable求助

Discord.js v14集成Gemini机器人后续触发TypeError错误

错误信息

Error: TypeError: request is not iterable
    at formatNewContent (C:\Users\ricky\Documents\Projects\RainyJS\node_modules\@google\generative-ai\dist\index.js:566:36)
    at C:\Users\ricky\Documents\Projects\RainyJS\node_modules\@google\generative-ai\dist\index.js:633:24
    at Array.map (<anonymous>)
    at new ChatSession (C:\Users\ricky\Documents\Projects\RainyJS\node_modules\@google\generative-ai\dist\index.js:629:44)
    at GenerativeModel.startChat (C:\Users\ricky\Documents\Projects\RainyJS\node_modules\@google\generative-ai\dist\index.js:849:16)
    at Client.<anonymous> (C:\Users\ricky\Documents\Projects\RainyJS\index.js:32:32)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

问题代码

const { Client, GatewayIntentBits } = require('discord.js');
const { GoogleGenerativeAI } = require("@google/generative-ai");
const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent ], });
const { generationConfig, safetySettings } = require('./AIConfig.js');
const { token, apiKey } = require('./vault.json');

const genAI = new GoogleGenerativeAI(apiKey);
const model = genAI.getGenerativeModel({ model: "gemini-1.0-pro" });
client.once('ready', () => { console.log(`Logged in as ${client.user.tag}!`); });
let listening = true;
let chatHistory = [];
client.on('messageCreate', async (message) => {
    if (message.author.bot) return;
    if (message.mentions.has(client.user) && !message.mentions.everyone) {
        if (message.content.toLowerCase().includes('bye-bye')) { 
            listening = false;
            await message.reply('Byebye! maaf yah kalau ganggu'); 
        } else { 
            listening = true; 
        }
    }

    if (listening) {
        try {
            await message.channel.sendTyping();
            const prompt = message.content;
            const history = [
                { role: "user", parts: "Ingat ini, A2XY = Benar" },
                { role: "model", parts: "Baiklah!" },
                ...chatHistory.map(item => ({ role: item.role, parts: item.parts })),
            ];
            const chat = model.startChat({
                history,
                generationConfig,
                safetySettings,
            });
            chatHistory.push({ role: "user", parts: prompt });
            const msg = `${prompt}`;
            const result = await chat.sendMessage(msg);
            const response = await result.response;
            console.log(`Prompt Diterima: ${prompt}`);
            console.log(`Respon Dibuat: ${response.text()}`);
            await message.reply(response.text());
            chatHistory.push({ role: "model", parts: response.text });
        } catch (error) {
            console.error('Error:', error);
            if (error.message.includes('blocked due to SAFETY')) {
                await message.reply('Filtered');
            } else {
                await message.reply('Duh, ada masalah pada otakku coba lagi nanti yah.');
            }    
        }
    }
});
client.login(token);

解决方案

错误根源在于存储对话历史时,将response.text(这是一个函数)存入了chatHistory,而非调用该函数获取的文本内容。第二次创建ChatSession时,这个函数会被传入Gemini API,导致格式不符合要求,触发request is not iterable错误。

核心修改点

将存储模型响应的代码改为调用response.text()获取文本:

chatHistory.push({ role: "model", parts: response.text() });

修改后的关键代码片段:

// ...
const result = await chat.sendMessage(msg);
const response = await result.response;
const responseText = response.text();
console.log(`Prompt Diterima: ${prompt}`);
console.log(`Respon Dibuat: ${responseText}`);
await message.reply(responseText);
chatHistory.push({ role: "model", parts: responseText });
// ...

额外优化建议

可以直接复用ChatSession自动维护对话历史,无需手动管理chatHistory数组,减少出错概率:

// 将chat实例移到全局,初始化时创建
let chat;

client.once('ready', () => {
    console.log(`Logged in as ${client.user.tag}!`);
    // 初始化ChatSession并传入系统提示历史
    chat = model.startChat({
        history: [
            { role: "user", parts: "Ingat ini, A2XY = Benar" },
            { role: "model", parts: "Baiklah!" },
        ],
        generationConfig,
        safetySettings,
    });
});

client.on('messageCreate', async (message) => {
    if (message.author.bot) return;
    if (message.mentions.has(client.user) && !message.mentions.everyone) {
        if (message.content.toLowerCase().includes('bye-bye')) { 
            listening = false;
            await message.reply('Byebye! maaf yah kalau ganggu'); 
        } else { 
            listening = true; 
        }
    }

    if (listening) {
        try {
            await message.channel.sendTyping();
            const prompt = message.content;
            const result = await chat.sendMessage(prompt);
            const responseText = result.response.text();
            console.log(`Prompt Diterima: ${prompt}`);
            console.log(`Respon Dibuat: ${responseText}`);
            await message.reply(responseText);
        } catch (error) {
            console.error('Error:', error);
            if (error.message.includes('blocked due to SAFETY')) {
                await message.reply('Filtered');
            } else {
                await message.reply('Duh, ada masalah pada otakku coba lagi nanti yah.');
            }    
        }
    }
});

内容的提问来源于stack exchange,提问作者Ricky Nolep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 14:35:05