使用React和google gemini api 打造一个google gemini应用

实现一个简单的聊天应用,用户可以通过输入问题或点击“Surprise me”按钮获取随机问题,并从后端API获取回答。

import { useState } from "react";
function App() {const [ value, setValue] = useState(""); // 存储用户输入的问题。const [error, setError] = useState(""); // 存储错误信息。const [chatHistory, setChatHistory] = useState([]); // 存储聊天记录,格式为一个数组,每个元素是一个包含 role(用户或模型)和 parts(消息内容)的对象。const surpriseOptions = ['Who won the latest Nobel Peace Prize?','Where does pizza come from?','Who do you make a sandwich?'] // 一个包含随机问题的数组const surprise = () => {const randomValue = surpriseOptions[Math.floor(Math.random() * surpriseOptions.length)];setValue(randomValue);} // 从 surpriseOptions 中随机选择一个问题,并将其设置为 value// getResponse 是一个异步函数,用于向后端API发送请求并获取回答const getResponse = async () => {if (!value){setError("Please enter a question");return;} // 如果 value 为空,设置错误信息并返回。try {const options = {method: 'POST',body: JSON.stringify({history: chatHistory,message: value}), // 转换为 JSON 字符串headers: {'Content-Type': 'application/json'}}const response = await fetch('http://localhost:8000/gemini', options); // 使用 fetch 发送POST请求,请求体包含 chatHistory 和用户输入的 valueconst data = await response.text();console.log(data);setChatHistory(oldChatHistory => [...oldChatHistory, {role: "user",parts: [{text: value}],},{role: "model",parts: [{text: data}],}]) // 将API返回的回答添加到 chatHistory 中setValue("") // 清空输入框}catch (error) {console.error(error);setError("Something went wrong! Please try again later.");} // 如果发生错误,设置错误信息}const clear = () => {setValue("")setError("")setChatHistory([])} // 清空输入框、错误信息和聊天记录。return (<div className="app"><p>What do you want to know?<button className="surprise" onClick={surprise} disabled={!chatHistory}>Surprise me</button></p><!-- 如果 disabled 为 true,按钮不可点击;如果 disabled 为 false,按钮可点击。 如果 chatHistory 为空([]),它仍然是一个对象,而所有对象在布尔上下文中都被视为 true!chatHistory 返回 false--><div className="input-container"><inputvalue={value}placeholder="When is Christmas...?"onChange={(e) => setValue(e.target.value)}/><!-- e.target.value 用于获取事件目标(通常是输入框、下拉框等表单元素)的当前值。它通常与 onChange 事件一起使用,以便在用户输入时实时获取输入内容。 -->{!error && <button onClick={getResponse}>Ask me</button>}{error && <button onClick={clear}>Clear</button>}</div>{error && <p>{error}</p>}<div className="search-result">{chatHistory.map((chatItem, _index) => <div key={_index}><p className="answer">{chatItem.role}: {chatItem.parts.map(part => part.text).join(" ")}</p></div>)}</div></div>);
}export default App;

渲染一个包含以下内容的界面:

  • 一个标题和“Surprise me”按钮(仅在 chatHistory 不为空时可用)。
  • 一个输入框和“Ask me”按钮(如果无错误)或“Clear”按钮(如果有错误)。
  • 错误信息(如果有)。
  • 聊天记录,每条记录显示用户问题和模型回答。

实现一个基于 Express 的 Node.js 服务器,用于与 Google 的 Generative AI 模型(Gemini)进行交互

const PORT = 8000
const express = require('express') // Node.js 的 Web 框架,用于构建服务器。
const cors = require('cors') // 用于处理跨域资源共享(CORS),允许前端与后端跨域通信。const app = express()
app.use(cors()) // 启用 CORS 中间件,允许跨域请求。
app.use(express.json()) // 启用 JSON 解析中间件,以便服务器可以解析请求体中的 JSON 数据。require('dotenv').config()const { GoogleGenerativeAI } = require('@google/generative-ai') // Google 提供的 Generative AI SDK,用于与 Gemini 模型交互。const genAI = new GoogleGenerativeAI(process.env.GOOGLE_GEN_AI_KEY)// 定义一个 POST 路由 /gemini,用于接收前端发送的请求。
app.post('/gemini', async (req, res) => {const model = genAI.getGenerativeModel({ model: "gemini-1.5-flash" });// 使用聊天历史记录初始化一个 Gemini 聊天会话。const chat = model.startChat({history: req.body.history}) // 从请求体中获取聊天历史记录。const msg = req.body.message // 从请求体中获取用户发送的消息。const result = await chat.sendMessage(msg) // 向 Gemini 模型发送用户的消息。const response = await result.responseconst text = response.text()res.send(text) // 将模型的响应文本发送回前端。
}
)// 启动服务器,监听指定的端口(PORT)。
app.listen(PORT, () => console.log(`Server running on port ${PORT}`))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898312.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入探讨TK矩阵系统:创新的TikTok运营工具

TK矩阵的应用场景 TK矩阵系统适用于多个场景&#xff0c;尤其是在以下几个方面有显著优势&#xff1a; 批量账号管理与内容发布&#xff1a;对于需要管理多个TikTok账号的内容创作者或营销人员&#xff0c;TK矩阵提供了高效的账号管理工具&#xff0c;支持批量发布视频、评论、…

MTK Android12 应用在最顶端时,禁止拉起其他某个应用(一)

1、需求 近期&#xff0c;客户要求应用在最顶端时&#xff0c;禁止拉起其他某个应用2、解决方法 diff --git a/frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java b/frameworks/base/services/core/java/com/android/server/wm/ActivityStarte…

论文阅读笔记:Deep Unsupervised Learning using Nonequilibrium Thermodynamics

1、来源 论文连接1&#xff1a;http://ganguli-gang.stanford.edu/pdf/DeepUnsupDiffusion.pdf 论文连接2(带appendix)&#xff1a;https://arxiv.org/pdf/1503.03585v7 代码链接&#xff1a;https://github.com/Sohl-Dickstein/Diffusion-Probabilistic-Models 代码的环境配置…

7种数据结构

7种数据结构 顺序表sqlite.hseqlite.c 单链表linklist.clinklist.h 双链表doulinklist.cdoulinklist.h 链式栈linkstack.clinkstack.h 队列SeqQueue.cSeqQueue.h 树tree.c 哈希表hash.c 顺序表 sqlite.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ typedef struct person…

Linux 查看及测试网络命令

使用 ifconfig 命令查看网络接口地址 查看指定的网络接口信息 执行 ifconfig ens33 命令可以只查看网卡 ens33 的配置信息

ABAP语言的动态编程(4) - 综合案例:管理费用明细表

本篇来实现一个综合案例&#xff1a;管理费用明细表。报表在实际项目中&#xff0c;也有一定的参考意义&#xff0c;一方面展示类似的报表&#xff0c;比如管理费用、研发费用等费用的明细&#xff0c;使用业务比较习惯的展示格式&#xff1b;另一方面正好综合运用前面学习的动…

【Redis】Redis的数据删除(过期)策略,数据淘汰策略。

如果问到&#xff1a;假如Redis的key过期之后&#xff0c;会立即删除吗&#xff1f; 其实就是想问数据删除(过期)策略。 如果面试官问到&#xff1a;如果缓存过多&#xff0c;内存是有限的&#xff0c;内存被占满了怎么办&#xff1f; 其实就是问&#xff1a;数据的淘汰策略。…

Linux配置yum仓库,服务控制,防火墙

一、yum仓库 1.在安装软件时&#xff0c;首先第一步就是要考虑软件的版本的问题&#xff01; 2.软件的安装&#xff1a;最安全可靠的方法就是去软件对应的官网上查看安装手册&#xff08;包括的软件的下载&#xff09; 红帽系软件安装的常见的3种方式 &#xff08;1&#x…

[从零开始学习JAVA] Stream流

前言&#xff1a; 本文我们将学习Stream流&#xff0c;他就像流水线一样&#xff0c;可以对我们要处理的对象进行逐步处理&#xff0c;最终达到我们想要的效果&#xff0c;是JAVA中的一大好帮手&#xff0c;值得我们了解和掌握。&#xff08;通常和lambda 匿名内部类 方法引用相…

设计模式(创建型)-抽象工厂模式

摘要 在软件开发的复杂世界中,设计模式作为解决常见问题的最佳实践方案,一直扮演着至关重要的角色。抽象工厂模式,作为一种强大的创建型设计模式,在处理创建一系列或相关依赖对象的场景时,展现出了独特的优势和灵活性。它通过提供一个创建对象的接口,让开发者能够在不指定…

【JavaEE】-- SpringBoot快速上手

文章目录 1. Maven1.1 什么是Maven1.2 为什么要学Maven1.3 创建一个Maven项目1.4 Maven核心功能1.4.1 项目创建1.4.2 依赖管理1.4.3 Maven Help插件 1.5 Maven仓库1.5.1 本地仓库1.5.2 中央仓库1.5.3 私有服务器&#xff08;私服&#xff09; 1.6 Maven设置国内源1.6.1 配置当前…

TCP/IP 协议精讲-精华总结版本

序言 本文旨在介绍一下TCP/IP涉及得所有基础知识&#xff0c;为大家从宏观上俯瞰TCP/IP提供一个基石&#xff0c;文档属于《TCP/IP图解&#xff08;第五版&#xff09;》的精简版本。 专业术语 缩写 全称 WAN Wide area network广域网 LAN Local area network局域网 TC…

Leetcode 160 Intersection of Two Linked Lists

题意 给定两个链表&#xff0c;找这两个链表第一个公共节点&#xff0c;如果没有返回nullptr 题目链接 https://leetcode.com/problems/intersection-of-two-linked-lists/description/ 题解 两个指针分别从两个链表&#xff08;记录为表A&#xff0c;表B&#xff09;的表…

C语言——结构体、联合、枚举

C语言中自定义类型 结构体结构体变量的创建和初始化结构体传参结构体内存对齐(如何存储) 联合体(共用体)联合体创建和初始化联合体大小(如何存储) 枚举类型枚举类型创建枚举类型初始化枚举的优点(相较于define) 前言 C语言中有内置类型和自定义类型&#xff0c;内置类型就像int…

利用pprof对golang进行性能分析

利用pprof进行性能分析 pprof性能分析的5个方面 一、性能分析的五个核心维度 CPU分析 - 剖析程序的CPU使用情况&#xff0c;定位高耗时函数 内存分析 - 追踪内存分配与泄露&#xff0c;优化内存使用模式 IO分析 - 监控文件/网络IO操作&#xff0c;发现瓶颈资源 Goroutine分…

IntelliJ IDEA 调试技巧指南

在日常开发中&#xff0c;调试是不可或缺的一部分。掌握调试工具的使用可以让我们更高效地定位和解决问题。本文将介绍一些在 IntelliJ IDEA 中常用的调试技巧&#xff0c;希望能帮助你在开发过程中更顺畅地解决问题。 1. 方法断点&#xff1a;快速定位实现类 方法断点可以帮…

gitlab 提交pr

在 GitLab 中&#xff0c;提交合并请求&#xff08;Merge Request, MR&#xff09;的大致流程如下&#xff1a; 1. 创建新分支 如果你还没有创建新的功能分支&#xff0c;可以使用以下命令创建并切换到新分支&#xff1a; git checkout -b feature-branch说明&#xff1a;f…

halcon几何测量(二)计算距离和角度的函数

目录 一、计算两条线之间的夹角二、计算一条直线和水平轴之间的夹角三、计算两个轮廓之间的最小距离四、计算两个轮廓之间的最小距离和对应的点五、计算直线和区域之间的最小和最大距离六、计算点到轮廓线之间的距离七、计算点到直线的距离八、计算点到点的距离九、计算点和区域…

【Linux操作系统——学习笔记二】Linux简单导航命令操作

一、前言 学习Linux&#xff0c;本质上是学习在命令行下熟练使用Linux的各类命令。 命令行&#xff1a;是一种通过输入命令和参数与计算机系统进行交互的方式&#xff0c;可以使用各种字符化命令对系统发出操作指令&#xff0c;打开Linux终端&#xff0c;进入命令行界面。 …

新安装的cursor安装不了插件

我安装的cursor版本0.47.5 直接说解决办法 找到安装路径cursor\resources\app下的product.json 修改https://marketplace.cursorapi.com为https://marketplace.visualstudio.com