PawanOsman / GoogleBard

GoogleBard - A reverse engineered API for Google Bard chatbot for NodeJS
https://bard.google.com
MIT License
415 stars 58 forks source link

How to use contextual dialogue #16

Closed boygoboy closed 1 year ago

boygoboy commented 1 year ago

Hello, this is my case of trying to use contextual dialog:

const  chatjson=require('../../chatjson/conversations.json')

const bardUnofficalChat=async (req,res)=>{
      let {message,isfirst}=req.body
      const {Bard} = await import("googlebard")

let cookies = `__Secure-1PSID=${process.env.BARD_AUTH}`;

let bot = new Bard(cookies, {
    inMemory: false, // optional: if true, it will not save conversations to disk
    savePath: "./chatjson/conversations.json", // optional: path to save conversations
    // proxy: {
    //  // optional: proxy configuration
    //  host: process.env.PROXY_HOST,
    //  port: process.env.PROXY_PORT,
    //  auth: {
    //      username: process.env.PROXY_USERNAME,
    //      password: process.env.PROXY_PASSWORD,
    //  },
    //  protocol: "http",
    // },
});

let conversationId = ''; // optional: to make it remember the conversation
if(isfirst){
    conversationId=Date.now()
}else{
    conversationId=chatjson.conversations.rows[chatjson.conversations.rows.length-1].id
}

let response = await bot.ask(message,conversationId); // conversationId is optional
console.log(response);
res.json({
    data:response
})

// Simulating response streaming
// await bot.askStream(
//  (res) => {
//      console.log(res);
//  },
//  message,
//  conversationId,
// );
}

module.exports={
    bardUnofficalChat
}

But it is not possible to carry out contextual dialogue. Please tell me how to use the correct usage. The cases in the document are not very clear.

mehul-srivastava commented 1 year ago

Hi @boygoboy! The contextual dialogue feature works just fine with me. Let me have a look at your code.

boygoboy commented 1 year ago

Hi @boygoboy! The contextual dialogue feature works just fine with me. Let me have a look at your code.

Thank you, haha ​​I understand, the conversationId of the same group of contextual conversations cannot be changed, I thought this conversationId was the id of the previous conversation

mehul-srivastava commented 1 year ago

Thank you, haha ​​I understand, the conversationId of the same group of contextual conversations cannot be changed, I thought this conversationId was the id of the previous conversation

So now is it fixed?

PawanOsman commented 1 year ago

this is an example on how you can get conversations, you don't need to load the saved file, also, you must create the bot instance a single time, so you need to create it outside the bardUnofficalChat function

const { Bard } = await import("googlebard")

let cookies = `__Secure-1PSID=${process.env.BARD_AUTH}`;

let bot = new Bard(cookies, {
  inMemory: false, // optional: if true, it will not save conversations to disk
  savePath: "./chatjson/conversations.json", // optional: path to save conversations
});

const bardUnofficalChat = async (req, res) => {
  let { message, isfirst } = req.body

  let conversationId = ''; // optional: to make it remember the conversation

  if (isfirst) {
    conversationId = Date.now()
  } else {
    let allConversations = bot.getAllConversations()
    conversationId = allConversations[allConversations.length - 1].id
  }

  let response = await bot.ask(message, conversationId); // conversationId is optional
  console.log(response);
  res.json({
    data: response
  })
}

module.exports = {
  bardUnofficalChat
}

however its better to use a static conversation id instead of getting the last conversation id like this example, instead of isfirst it will send a unique id with the request and it will be remain in the same conversation

const { Bard } = await import("googlebard")

let cookies = `__Secure-1PSID=${process.env.BARD_AUTH}`;

let bot = new Bard(cookies, {
  inMemory: false, // optional: if true, it will not save conversations to disk
  savePath: "./chatjson/conversations.json", // optional: path to save conversations
});

const bardUnofficalChat = async (req, res) => {
  let { message, convId } = req.body

  let response = await bot.ask(message, convId); // conversationId is optional
  console.log(response);
  res.json({
    data: response
  })
}

module.exports = {
  bardUnofficalChat
}
boygoboy commented 1 year ago

Thank you, I understand. I read the usage of bing before (https://github.com/waylaidwanderer/node-chatgpt-api/blob/main/demos/use-bing-client.js) and misunderstood that bard also needs a dialogue messageId

boygoboy commented 1 year ago

Sorry for the delay @boygoboy! I refactored your code a bit and the contextual dialogue things works for me. Let me know if it does for you too.

const chatjson = require("../../chatjson/conversations.json");

const bardUnofficalChat = async (req, res) => {
  let { message, isfirst } = req.body;
  const { Bard } = await import("googlebard");

  let cookies = `__Secure-1PSID=${process.env.BARD_AUTH}`;

  let bot = new Bard(cookies, {
    inMemory: false,
    savePath: "../../chatjson/conversations.json", //both paths should be same
  });

  let conversationId = "";
  if (isfirst) {
    conversationId = Date.now();
  } else {
    conversationId =
      chatjson.conversations.rows[chatjson.conversations.rows.length - 1].id;
  }

  let response = await bot.ask(message, conversationId);
  console.log(response);
  res.json({
    data: response,
  });
};

module.exports = {
  bardUnofficalChat,
};

One improvement I can think of is to use the built-in bot.getAllConversations() as mentioned by @/PawanOsman method instead of using the json file yourself.

Hope this answer resolves your issue!

chatjson.conversations.rows[chatjson.conversations.rows.length - 1].id;

The conversationId obtained by the above writing method is always the first conversation id, which is actually equivalent to the static conversation id written by the author. It is better to use the static conversation id written by the author.