golang简单实现chatgpt网页聊天

news2024/9/23 1:24:31

效果如图:

在这里插入图片描述

安装openai的sdk:

go get github.com/sashabaranov/go-gpt3

go代码:

main.go

package main

import (
	"fmt"
	"net/http"
	"os"
	gogpt "github.com/sashabaranov/go-gpt3"
)

var client = gogpt.NewClient("自己账号的apikey")

func main() {
	// 第一个接口,返回html文件内容
	http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
		f, _ := os.ReadFile("index.html")
		w.Write([]byte(f))
	})

	// 第二个接口,请求chatgpt的接口
	http.HandleFunc("/api", func(w http.ResponseWriter, req *http.Request) {
		text := req.FormValue("text")
		fmt.Println(text)

		if text == "" {
			w.WriteHeader(400)
			w.Write([]byte("请输入文本"))
			return
		}

		// 发起请求
		ret, err := client.CreateCompletion(req.Context(), gogpt.CompletionRequest{
			Model:            "text-davinci-003",
			MaxTokens:        512,
			TopP:             1,
			FrequencyPenalty: 0,
			PresencePenalty:  0.6,
			Prompt:           text,
		})

		if err != nil {
			w.WriteHeader(400)
			w.Write([]byte(err.Error()))
			return
		}

		w.Write([]byte(ret.Choices[0].Text))
	})

	// 启动http服务
	fmt.Println("Listen on :8080")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		fmt.Println(err)
	}
}

html代码

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.staticfile.org/vue/3.2.47/vue.global.min.js"></script>
    <title>ChatGpt助手</title>
</head>
<body style="margin:0;">
    <div id="app">
        <div class="chatRoot">
            <div class="header">ChatGpt助手</div>
            <div class="content">
                <div v-for="(item, index) in msgs" :key="index" class="round">
                    <div class="send">
                        <div class="bubble" v-if="item.send">{{ item.send }}</div>
                    </div>
                    <div class="back">
                        <div class="bubble backBubble">
                            <span v-if="item.loading">Loading...</span>
                            <span v-else>{{ item.back }}</span>
                        </div>
                    </div>
                </div>
            </div>
            <div class="footer">
                <input type="text" v-model="text" @keyup.enter="sendText">
                <button @click="sendText">发送</button>
            </div>
        </div>
    </div>
    <script>
        const { createApp } = Vue
        createApp({
            data() {
                return {
                    msgs: [{
                        id: "0",
                        send: "",
                        back: "欢迎使用ChatGpt助手!",
                        loading: false,
                    }],
                    text: "",
                }
            },
            methods: {
                sendText() {
                    if (!this.text) { return }
                    var id = String(new Date().getTime())
                    var msg = {
                        id: id,
                        send: this.text,
                        back: "",
                        loading: true,
                    }
                    this.msgs.push(msg)
                    let formData = new FormData()
                    formData.append('text', this.text)
                    fetch('/api', {
                        method: "post",
                        body: formData
                    })
                        .then((resp) => resp.text())
                        .then(data => {
                            for (const item of this.msgs) {
                                if (item.id === id) {
                                    item.loading = false
                                    item.back = data
                                }
                            }
                        })
                        .catch((error) => {
                            console.error('Error:', error);
                        })
                    this.text = ''
                },
            }
        }).mount('#app')
    </script>
</body>
<style>
    .chatRoot {
        height: 100vh;
        background-color: #f3f3f3;
        display: flex;
        flex-direction: column;
        font-size: 1.1rem;
    }
    .header {
        background-color: #eee;
        color: #333;
        padding: 10px;
        box-shadow: 0 1px 2px #ddd;
        text-align: center;
        position: sticky;
        top: 0;
    }
    .content {
        height: 100%;
        overflow-y: scroll;
    }
    .bubble {
        display: inline-block;
        background: #fff;
        border-radius: 4px;
        padding: 10px;
        margin: 10px;
        max-width: 60%;
        overflow-wrap: break-word;
        text-align: left;
    }
    .send {
        text-align: right;
    }
    .backBubble {
        background-color: #5bf596;
    }
    .back {
        text-align: left;
    }
    .footer {
        display: flex;
        position: sticky;
        bottom: 0;
        padding: 5px;
        background-color: #eee;
    }
    input {
        flex: 1;
        border: none;
        padding: 10px;
        font-size: 1.1rem;
    }
    button {
        border: none;
        padding: 10px 20px;
        font-size: 1.1rem;
        margin-left: 5px;
    }
</style>
</html>

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

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

相关文章

高可用 - 02 Keepalived_VRRP工作原理

文章目录Keepalived VS HeartbeatKeepalived的用途VRRP与工作原理物理路由器和虚拟路由器Keepalived VS Heartbeat Keepalived是Linux下一个轻量级的高可用解决方案&#xff0c;它与Heartbeat、RoseHA实现的功能类似&#xff0c;都可以实现服务或者网络的高可用&#xff0c;但…

SmS-Activate一款好用的短信验证码接收工具

前言 有些国外应用在使用应用上的功能时需要注册账号&#xff0c;由于某种不可抗因素&#xff0c;我们的手机号一般不支持注册&#xff0c;接收不到信息验证码&#xff0c;于是我们可以使用SmS-Activate提供的服务&#xff0c;使用$实现我们的需求&#xff08;大概一次验证1-5…

Python练习系统

用python给自己做个练习系统刷题吧&#xff01; #免费源码在文末公众号哈# 选择题 def xuanze():global flag2if flag21:def insert():numvar1.get()questionvar2.get()choicevar3.get()answervar4.get()with open(d:\\练习系统\\练习三3.1.pickle,rb) as file:lst1pickle.lo…

golang入门笔记——内存管理和编译器优化

静态分析 静态分析&#xff1a;不执行程序代码&#xff0c;推导程序的行为&#xff0c;分析程序的性质 控制流&#xff08;control flow&#xff09;&#xff1a;程序的执行流程 数据流&#xff08;data flow&#xff09;&#xff1a;数据在控制流上的传递 通过分析控制流和…

网络安全应急响应服务方案怎么写?包含哪些阶段?一文带你了解!

文章目录一、服务范围及流程1.1 服务范围1.2 服务流程及内容二、准备阶段2.1 负责人准备内容2.2 技术人员准备内容&#xff08;一&#xff09;服务需求界定&#xff08;二&#xff09;主机和网络设备安全初始化快照和备份2.3市场人员准备内容&#xff08;1&#xff09;预防和预…

全网最新的软件测试/自动化测试必问的面试题合集

1.你为什么选择软件测试行业因为之前有了解软件测试这个行业&#xff0c;觉得他的发展前景很好。2.根据你以前的工作经验描述一下软件开发、测试过程&#xff0c;由那些角色负责&#xff0c;你做什么要有架构师、开发经理、测试经理、程序员、测试员。我在里面主要是负责所分到…

曙光超算平台 如何使用 Tensorboard (乌镇中心)

在E-Shell中执行 1. salloc -p 队列名 -N 1 -n 32 --gresdcu:4 salloc -p wzhdtest -N 1 -n 32 --gresdcu:4 2. ssh 节点名 ssh g01r3n07 3. conda deactivate 4. 查看当前所有模块 module ava compiler 从上图中加载某个dtk模块 module load compiler/dtk/21.10 注&…

第九章 vue 进阶篇 Element Plus 基本使用

Element Plus 基本使用 element-ui 是基于vue 开发的一套ui组件库&#xff0c;提供丰富的网页开发组件&#xff0c;可用快速开发网站&#xff0c;降低前端开发成本 版本 element目前有两个版本 element-ui&#xff1a;基于vue2 element-plus: 基于vue3官网地址 https://elem…

JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)

文章目录前言一、了解JVM常用命令行参数1、命令行参数概述2、常用命令3、通过案例学命令行参数(Linux)4、区分概念二、GC日志详解1、打印详细日志2、日志描述3、解析案例三、调优前的基础概念四、调优是什么&#xff1f;1、调优1&#xff1a;JVM规划和预调优a、涨知识时刻b、概…

解決 torch 無法使用GPU

1.使用 import torch torch.cuda.is_available() ------> False print(torch.version) --> 查詢 torch 版本 2.命令行&#xff0c;輸入 nvidia-smi 3.直接去網站找出相對應版本 https://download.pytorch.org/whl/torch_stable.html cuda : 11.7 -> cu117 python3.…

分享95个HTML娱乐休闲模板,总有一款适合您

分享95个HTML娱乐休闲模板&#xff0c;总有一款适合您 95个HTML娱乐休闲模板下载链接&#xff1a;https://pan.baidu.com/s/1nBCV2kTy1csY3z8QRqXrsQ?pwd946p 提取码&#xff1a;946p Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 夜店娱乐网站模板 游戏模板…

mybatis条件构造器(二)

mybatis条件构造器(二) 1 准备工作 1.1 建表sql语句(Emp表) SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CREATE TABLE emp (EMPNO int NOT NU…

2023年安徽省职业院校“磐云杯”网络安全竞赛任务书

2023年安徽省职业院校“磐云杯”网络安全竞赛 任务书 一、竞赛时间 总计&#xff1a;360分钟 三、竞赛任务书内容 &#xff08;一&#xff09;拓扑图 &#xff08;二&#xff09;A模块基础设施设置/安全加固&#xff08;200分&#xff09; 一、项目和任务描述&#xff1a;…

UML-时序图以及PlantUML绘制

介绍 时序图&#xff08;Sequence Diagram&#xff09;&#xff0c;又名序列图、循序图&#xff0c;是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序&#xff0c;当执行一个用例行为时&#xff0c;其中的每条消息…

Python基础4——面向对象

目录 1. 认识对象 2. 成员方法 2.1 成员方法的定义语法 3. 构造方法 4. 其他的一些内置方法 4.1 __str__字符串方法 4.2 __lt__小于符号比较方法 4.3 __le__小于等于符号比较方法 4.4 __eq__等号比较方法 5. 封装特性 6. 继承特性 6.1 单继承 6.2 多继承 6.3 pas…

MySQL数据库调优————ORDER BY语句

ORDER BY调优的核心原理&#xff0c;原则是利用索引的有序性跳过排序环节 关于ORDER BY语句的一些尝试 我们使用employees表进行尝试&#xff0c;索引情况如下 在执行计划的结果中&#xff0c;Extra里如果存在&#xff0c;Using filesort则表示&#xff0c;排序没有使用到索…

JavaScript 代码规范

文章目录JavaScript 代码规范JavaScript 代码规范变量名空格与运算符代码缩进语句规则对象规则每行代码字符小于 80命名规则HTML 载入外部 JavaScript 文件使用 JavaScript 访问 HTML 元素文件扩展名使用小写文件名JavaScript 代码规范 所有的 JavaScript 项目适用同一种规范。…

PADS设计基础

目录 1 PADS设计流程简介 2 快捷键 2.1鼠标指令 2.2快捷键 3元件库概述 3.1元件库分类 3.2创建元件库 3.3新的元件类型的创建 3.3.1 插座的创建 1 PADS设计流程简介 常规PADS设计流程:设计启动→建库→原理图设计→网表调入→布局→布线→验证优化→设计资料输出→加…

VUE3源码分析————rollup打包遇见问题

文章目录一、require无法使用二、The requested module xxx does not provide an export named default三、__filename无法使用四、path.resolve() arguments must be a string一、require无法使用 在使用rullup打包的过程中&#xff0c;我们需要在最外层的package.json文件中…

时间序列分解法

影响时间序列变化的因素通常由长期趋势&#xff0c;季节变动&#xff0c;周期变动&#xff0c;不规则变动几部分组成 长期趋势指现象在较长时期内持续发展变化的一种趋向或状态。季节变动是由于季节的变化引起的现象发展水平的规则变动&#xff08;波动长度固定&#xff09;周…