diff --git a/.env.example b/.env.example index 991604d..0653646 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,6 @@ REACT_APP_API_URL= OPENAI_API_KEY= +GEMINI_API_KEY= DB_HOST= DB_USER= DB_PASS= diff --git a/backend/package-lock.json b/backend/package-lock.json index 50159e2..c05b552 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -9,9 +9,10 @@ "version": "0.1.0", "license": "MIT", "dependencies": { + "@google/generative-ai": "^0.2.1", "bcrypt": "^5.1.1", "cors": "^2.8.5", - "express": "^5.0.0-alpha.8", + "express": ">5.0.0-alpha", "faker": "^6.6.6", "jsonwebtoken": "^9.0.2", "mongodb": "^5.9.2", @@ -23,6 +24,14 @@ "node": "16.x" } }, + "node_modules/@google/generative-ai": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.2.1.tgz", + "integrity": "sha512-gNmMFadfwi7qf/6M9gImgyGJXY1jKQ/de8vGOqgJ0PPYgQ7WwzZDavbKrIuXS2zdqZZaYtxW3EFN6aG9x5wtFw==", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@mongodb-js/saslprep": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz", diff --git a/backend/package.json b/backend/package.json index 6b3c476..619462a 100644 --- a/backend/package.json +++ b/backend/package.json @@ -8,10 +8,10 @@ "start": "node server.js" }, "dependencies": { + "@google/generative-ai": "^0.2.1", "bcrypt": "^5.1.1", "cors": "^2.8.5", "express": ">5.0.0-alpha", - "faker": "^6.6.6", "jsonwebtoken": "^9.0.2", "mongodb": "^5.9.2", "mongoose": "^8.1.1", diff --git a/backend/server.js b/backend/server.js index c654db6..62ad0af 100644 --- a/backend/server.js +++ b/backend/server.js @@ -1,24 +1,28 @@ const express = require("express"); const cors = require("cors"); -const { set } = require("mongoose"); -// const mongoose = require("mongoose"); +const mongoose = require("mongoose"); // const bcrypt = require("bcrypt"); // const validator = require("validator"); // const jwt = require("jsonwebtoken"); +const { + GoogleGenerativeAI, + HarmCategory, + HarmBlockThreshold, +} = require("@google/generative-ai"); const app = express(); // connect to DB -// const mongoDB = -// "mongodb+srv://" + -// process.env.USERNAME + -// ":" + -// process.env.PASSWORD + -// "@" + -// process.env.HOST + -// "/" + -// process.env.DATABASE; -// mongoose.connect(mongoDB); +const mongoDB = + "mongodb+srv://" + + process.env.DB_USER + + ":" + + process.env.DB_PASS + + "@" + + process.env.DB_HOST + + "/" + + process.env.DB_NAME; +mongoose.connect(mongoDB); app.use(cors()); app.use(express.json()); @@ -31,12 +35,53 @@ app.post("/api/chat", async (req, res) => { if (!req.body.message) { return res.status(400).json({ message: "No message provided" }); } - // add a delay for testing - await new Promise((resolve) => setTimeout(resolve, 10000)); - res.status(200).json({ - message: `[backend] under construction. You sent: ${req.body.message}`, - }); + // node --version # Should be >= 18 + // npm install @google/generative-ai + const MODEL_NAME = "gemini-1.0-pro"; + const AI_API_KEY = process.env.GEMINI_API_KEY; + + async function runChat() { + const genAI = new GoogleGenerativeAI(AI_API_KEY); + const model = genAI.getGenerativeModel({ model: MODEL_NAME }); + + const generationConfig = { + temperature: 0.9, + topK: 1, + topP: 1, + maxOutputTokens: 2048, + }; + + const safetySettings = [ + { + category: HarmCategory.HARM_CATEGORY_HARASSMENT, + threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH, + }, + { + category: HarmCategory.HARM_CATEGORY_HATE_SPEECH, + threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH, + }, + { + category: HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT, + threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH, + }, + { + category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, + threshold: HarmBlockThreshold.BLOCK_ONLY_HIGH, + }, + ]; + + const chat = model.startChat({ + generationConfig, + safetySettings, + history: req.body.history || [], + }); + + const result = await chat.sendMessage(req.body.message); + const response = result.response; + res.status(400).json({ message: response }); + } + // todo api request via node @link https://platform.openai.com/docs/quickstart?context=node });