diff --git a/web-app/package-lock.json b/web-app/package-lock.json index b874e30..f8bd6ba 100644 --- a/web-app/package-lock.json +++ b/web-app/package-lock.json @@ -81,6 +81,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -1078,6 +1079,7 @@ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -1812,6 +1814,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -1870,6 +1873,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2321,6 +2325,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -3104,6 +3109,7 @@ "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -5770,6 +5776,7 @@ "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", "license": "MIT", + "peer": true, "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", @@ -5865,6 +5872,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -6098,6 +6106,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6138,6 +6147,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -7395,6 +7405,7 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.10.tgz", "integrity": "sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -7767,6 +7778,7 @@ "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/web-app/src/components/layouts/chat-layout.jsx b/web-app/src/components/layouts/chat-layout.jsx index 1193aa8..78dff4f 100644 --- a/web-app/src/components/layouts/chat-layout.jsx +++ b/web-app/src/components/layouts/chat-layout.jsx @@ -3,6 +3,20 @@ import ChatHeader from "src/components/ui/chat/chat-header"; import ChatWindow from "src/components/ui/chat/chat-window"; import MessageInput from "src/components/ui/chat/message-input"; +import { GoogleGenAI } from "@google/genai" + +const ai = new GoogleGenAI({ apiKey: import.meta.env.GEMINI_API_KEY }) + +async function AIRepsponse(userInputArray) { + const response = await ai.models.generateContent({ + model: "gemini-2.5-flash", + contents: userInputArray + }) + return response.text + } + +let userInput = [] + export default function ChatLayout() { const [messages, setMessages] = useState([ { @@ -11,15 +25,17 @@ export default function ChatLayout() { }, ]); - function handleSend(text) { + async function handleSend(text) { + userInput.push(text) + const res = await AIRepsponse(userInput) + const userMsg = { role: "user", content: text }; setMessages((s) => [...s, userMsg]); - // fake assistant reply after short delay setTimeout(() => { setMessages((s) => [ ...s, - { role: "assistant", content: `You said: ${text}` }, + { role: "assistant", content: res }, ]); }, 600); } diff --git a/web-app/src/features/gemini/gemini.js b/web-app/src/features/gemini/gemini.js index 4e2d761..2fe2de8 100644 --- a/web-app/src/features/gemini/gemini.js +++ b/web-app/src/features/gemini/gemini.js @@ -1,8 +1,7 @@ -import { createPartFromUri, GoogleGenAI } from "@google/genai" -import 'dotenv/config' +import { GoogleGenAI } from "@google/genai" import fs from "fs" -const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY }) +const ai = new GoogleGenAI({ apiKey: import.meta.env.GEMINI_API_KEY }) async function uploadLocalPDFs() { var pdfList = fs.readdirSync("public/pdfs") @@ -45,21 +44,4 @@ async function uploadLocalPDFs() { return file } }) -} - -async function main() { - const prompts = [ - "If possible, using Gemini's Javascript API, how would you grab an image from a PDF sent to the API?" - ] - - const response = await ai.models.generateContent({ - model: "gemini-2.5-flash", - contents: prompts - }) - - console.log(response.text) -} - -uploadLocalPDFs() -main() - +} \ No newline at end of file diff --git a/web-app/vite.config.js b/web-app/vite.config.js index db0ad28..ae3babd 100644 --- a/web-app/vite.config.js +++ b/web-app/vite.config.js @@ -3,6 +3,12 @@ import react from "@vitejs/plugin-react"; import jsconfigPaths from "vite-jsconfig-paths"; import tailwindcss from "@tailwindcss/vite"; +try { + process.loadEnvFile(".env") +} catch (error) { + console.log("Env file not found!\n" + error) +} + // https://vite.dev/config/ export default defineConfig({ plugins: [tailwindcss(), react(), jsconfigPaths()], @@ -11,4 +17,8 @@ export default defineConfig({ src: "/src", }, }, + // Defines envrionmental files across all src code b/c prefix is usually "VITE" + define: { + 'import.meta.env.GEMINI_API_KEY': JSON.stringify(process.env.GEMINI_API_KEY), + } });