Git Product home page Git Product logo

liangyang666 / chatgpt-web Goto Github PK

View Code? Open in Web Editor NEW
478.0 12.0 302.0 366 KB

使用GPT-3.5 API创建的ChatGPT聊天页面,支持云部署,多用户使用,多对话管理,公式显示,流式动态显示,windows和linux均可极简部署,网页版 html python flask

License: MIT License

Python 39.97% HTML 16.91% CSS 7.57% JavaScript 35.55%
chatgpt chatgpt-web flask html python railway

chatgpt-web's Introduction

使用GPT-3.5 API创建的ChatGPT聊天页面,模型回复效果与官网的ChatGPT一致

Star the Repository

TODO List
  • 界面优化
  • 代码规范化,请求返回值规范、代码文件划分
  • 实现聊天记录文件下载,以及上传合并
  • 界面适应手机
  • 处理聊天记录更多由本地完成,即js完成聊天记录的请求
  • 添加token设置栏,按钮中设置
  • 在连续对话模式下支持多人同时使用
  • 重载历史记录
  • 切换聊天模式和重置时提示
  • 支持多对话管理
  • 公式显示
  • 流式拉取,逐字词动态实时显示
  • 代码高亮显示
  • 查余额

特性

极简配置
支持Zeabur云部署(推荐,两分钟部署完成)
支持railway云部署
支持多用户使用
多对话管理
公式显示
流式逐字加载显示
代码高亮
查余额
可设置访问密码

演示动图

演示

使用前提

  1. 因国内IP被封或OpenAI API被墙,因此自己需要有代理,稍后需要配置,(若使用railway部署时不需要有代理)
  2. 有openai账号,注册事项可以参考此文章
  3. 创建好api_key, 进入OpenAI链接,右上角点击,进入页面设置
    image

部署方法

分别介绍下面几种部署方法,选择一种即可,部署完成后直接跳转至后面的使用介绍继续即可

1. Zeabur云部署(最为推荐,无需代理,云部署,通过url随时随地访问,聊天记录云同步)
  • 关于Zeabur:Zeabur是云容器提供商,你能够使用它部署你的应用,并使用url链接随时随地访问你的应用,类似于Railway,但无时间限制
  1. 首先将代码fork到你的github中
  2. 点击网址注册账号,Zeabur ,绑定GitHub账号
  3. 进入项目创建链接,点击Create Project,输入名称 ChatGPT-Web创建项目
  4. 创建完成后,点击如图,添加服务 image
  5. 弹出的界面中,点击如下 image
  6. 弹出界面中,左侧选择你的GitHub,如果未绑定,请授权Zeabur访问你GitHub的所有项目,搜索ChatGPT-Web,即你clone的仓库,点击Import image
  7. 选择分支为main,点击部署 image
  8. 等待片刻后,将显示运行中,即部署完成,但此时还需要设置一些环境变量 image 分别设置DEPLOY_ON_ZEABURtrue,PORT5000,以及OPENAI_API_KEY设置为你的apikey即可,如为保证安全性,防止他人使用还可设置PASSWORD以及ADMIN_PASSWORD环境变量(可暂不设置,有需要再设),这两个环境变量分别代表普通访问密码,以及管理员密码,设置后用户访问网页时需要使用访问密码认证,而管理员密码用于下载以及合并所有用户的聊天记录时使用
  9. 设置访问域名,url,点击如下,再填入可用主机名保存url即可,如自己有域名,也可绑定自己的域名 image image
  10. 点击redeploy重新部署,等待片刻后部署完成,一般一分钟以内部署完成,若未刷新可手动刷新网页查看,使用生成的url访问即可使用 image
  11. 使用new:xxx创建用户即可使用,或者上传已有聊天记录,相关使用方式见使用介绍
  12. 请注意,当设置密码或其它环境变量时请在设置后重新部署,每次部署后都会清除聊天记录,可先下载好已有用户记录再重新部署
2. 本地源代码部署(推荐,方便更新,需要有代理)

前提:python3.7及以上运行环境

  1. 执行 pip install -r requirements.txt安装必要包
  2. 打开config.yaml文件,配置HTTPS_PROXY和OPENAI_API_KEY,相关细节已在配置文件中描述,如果在境外部署无需代理,将HTTPS_PROXY行删除即可
  3. 执行python main.py运行程序.若程序中未指定apikey也可以在终端执行时添加环境变量,如执行OPANAI_API_KEY=sk-XXXX python main.py来运行,其中sk-XXXX为你的apikey
  4. 打开本地浏览器访问127.0.0.1:5000,部署完成
  5. 关于更新,当代码更新时,使用git pull更新重新部署即可
  6. 使用linux开机自启动部署 执行vim /etc/systemd/system/chatGpt.service,编辑内容如下
  [Unit]
  Description=my chat-gpt web
  After=syslog.target network.target
  Wants=network.target
  
  [Service]
  Environment="ADMIN_PASSWORD=123456"
  Environment="OPENAI_API_KEY=sk-***"
  Environment="PASSWORD=123456"
  Type=simple
  User=nano
  WorkingDirectory=/home/nano/Project/ChatGPT-Web
  ExecStart=/usr/bin/python3 main.py
  Restart= always
  RestartSec=1min
  
  
  [Install]
  WantedBy=multi-user.target

最后启动

#启动
systemctl daemon-reload
systemctl start chatGpt.service
#设置为开机启动
systemctl enable chatGpt.service
3. Railway部署(无需代理,云部署,通过url随时随地访问)
  • 关于Railway:Railway是云容器提供商,你能够使用它部署你的应用,并使用url链接随时随地访问你的应用,Railway使用前提是你的GitHub账号满180天,绑定并验证后每月送5美元和500小时的使用时长,大概21天,因此如果使用这种方式需要在某些不使用的时段停止你的容器
  1. 首先将代码fork到你的github中
  2. 点击右侧Deploy on Railway,然后选择Deploy from GitHub repo,再选择Configure GitHub App,将会弹出新的窗口,在该窗口中选择Only select repositories,然后到下拉列表中选择刚才fork到你账号的仓库 image
  3. 授权完成后,Configure GitHub App下将会出现授权的项目
    image
  4. 不要点击立即部署,点击添加变量 image
  5. 将会跳转至新页面,依次添加PORT,DEPLOY_ON_RAILWAY以及OPENAI_API_KEY三个环境变量,相应值如下PORT为5000,DEPLOY_ON_RAILWAY为true image
  6. 修改变量后会自动部署,可点击Deployments查看,还可以点击查看日志
    image
  7. 点击查看日志,成功的一般显示如下
    image
  8. 查看访问url,未生成可点击Generate Domain生成即可,当然如果你自己有域名,还可以添加你自己的自定义域名
    image
  9. 进入后如图,任何网络环境下只要输入url即可访问 image
  10. 关于更新,当源仓库更新时,只需要将fork下来的仓库同步更新,railway将会自动部署更新的代码
4. Railway template部署(不推荐,代码迟滞高)
  1. 点击右侧按钮进行部署Deploy on Railway 首次使用railway的用户需要先绑定github账号并登陆,并进行验证,验证后可获得5美元、500小时每月的免费额度,绑定完成后重新点击上方图标,进行部署,如图进入后填写相关信息和api key
    image
  2. 点击部署后,会自动跳转,等待部署完成即可,如图为部署完成
    image
  3. 点击查看日志,成功的一般显示如下
    image
  4. 查看访问url,使用该url即可访问
    image
  5. 关于更新,点击如下进行更新即可,由Dashboard进入选择如下,但该种方式检查更新的迟滞似乎太高
    image
5. 可执行文件部署(推荐无python运行环境使用,需要自己有代理)

待补充

6. Docker部署(需要自己有代理)

待补充

使用介绍

  • 开启程序后进入如下页面
    image
  • 直接输入已有用户id,或者输入new:xxx创建新id,这个id用于绑定会话,下次不同浏览器打开都可以恢复用户的聊天记录,一个浏览器31天内一般不会要求再次输入用户id,如下为创建一个新id,名为zs,下图为发送完成后自动刷新的用户页面,左侧会有一个默认对话
    image
  • 代码中已经设置了apikey,但如果开放给别人用针对个别用户也可以按照说明设置用户专属apikey,这里就暂不设置专属的
  • 默认为普通对话模式,即每次发送都是仅对于该提问回答,可点击切换为连续对话模式,chatgpt将会联系上下文(之前的对话,程序中设置了最大5条记录)回复你,但意味着花费会更多money
  • 用python写一个冒泡算法试试看,回车发送,shift+回车换行,然后问用java呢?会联系上下文回答 image
  • 还可以按如下添加对话 image
  • 对话管理,当不使用该对话时,可以点击删除对话,若当前为默认对话,则只可删除聊天记录

重要更新

2023.05.14 支持访问密码,支持Zeabur部署
2023.3.19: 代码高亮显示
2023.3.17: 显示公式
2023.3.17: 类似于chatgpt官网,支持实时流获取,即逐字获取动态加载显示
2023.3.13: 类似于chatgpt官网,支持新建对话,单个用户可以管理多个对话
2323.3.6: 会话与用户id绑定并保存用户信息,同一浏览器下次登陆时自动进入绑定的id,其余设备输入用户id后依然可以重载聊天记录
2323.3.6: 支持保存历史聊天记录,当重新打开会话时自动恢复聊天记录,使用pickle持久化存储,程序重启时依然可加载各用户聊天记录
2023.3.5: 支持markdown内容显示

chatgpt-web's People

Contributors

liangyang666 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

chatgpt-web's Issues

你好

image
改完80出现
以一种访问权限不允许的方式做了一个访问套接字的尝试。
持久化存储文件路径为: D:\同步空间\demo笔记\style_transfer\ChatGPT-Web-main\all_user_dict_v2.pkl
已加载上次存储的用户上下文,共有1用户, 分别是
0 用户id:2462366256 对话统计: 默认对话[13]

  • Serving Flask app 'main' (lazy loading)
  • Environment: production
    WARNING: This is a development server. Do not use it in a production deployment.
    Use a production WSGI server instead.
  • Debug mode: off

改别的端口还是报
image

推荐使用pandora项目实现0消耗的gpt调用

在zhile-io大佬的pandora项目中,提供了一种免消耗免翻墙调用的方法,可以参考这个科普帖子. 我主页的项目都是用它实现的,认为不错,所以推荐给大家

各位可以先尝试一下这个程序, 但是请勿过多使用我的api, 毕竟不能同时服务2个客户端

import openai 
import time 
  
def fake_api(query,max,a,tem):     #用户输入,最大token,是否流式输出,温度
     openai.api_key = "fk-yU3UOSY13E9WsAkKBTrkq1KiiqIsAXBs_J6OTh_yvJM"  # 使用假的 API 密钥 
     openai.api_base = "https://ai.fakeopen.com/v1/" 
     start_time = time.time()  # 记录开始时间 
  
     response = openai.ChatCompletion.create( 
         model='gpt-3.5-turbo', 
         messages=[ 
             {'role': 'user', 'content': query} 
         ], 
         temperature=tem, 
         max_tokens=max, 
         stream=True  # 开启流式输出 
     ) 
  
     result = ""  # 创建一个空字符串来保存流式输出的结果 
  
     for chunk in response: 
         # 确保字段存在 
         if 'choices' in chunk and 'delta' in chunk['choices'][0]: 
             chunk_msg = chunk['choices'][0]['delta'].get('content', '') 
             result += chunk_msg  # 将输出内容附加到结果字符串上 
  
             if a: 
                 print(chunk_msg, end='', flush=True) 
                 time.sleep(0.05) 
  
     return result  # 返回流式输出的完整结果 
  
if __name__ == '__main__':
     while True:
         query = input("You: ") 
         full_result = fake_api(query,1500,True,1)  # 将结果保存到 full_result 变量中

望采纳!

equest error

request error: ('Connection aborted.', OSError(0, 'Error'))

錯誤request error: SOCKSHTTPSConnectionPool(host='api.openai.com', port=443): Max retries exceeded with url: /v1/chat/completions (Caused by NewConnectionError('<urllib3.contrib.socks.SOCKSHTTPSConnection object at 0x7f1008623df0>: Failed to establish a new connection: [Errno 111] Connection refused'))

Image 53
高手您好 請問您
1.出現以圖片上的錯誤 .請問我需要做什麼
request error: SOCKSHTTPSConnectionPool(host='api.openai.com', port=443): Max retries exceeded with url: /v1/chat/completions (Caused by NewConnectionError('<urllib3.contrib.socks.SOCKSHTTPSConnection object at 0x7f1008623df0>: Failed to establish a new connection: [Errno 111] Connection refused'))
2.關於http://192.168.66.243:5000/ 5000我可以從哪裡修改80
3.請問您.本LiangYang666版本 只能用ChatGPT Plus USD $20/mo.免費的一般版本Free Plan也可以用嗎?
4.請問您 關於 flask_main.py 設定
os.environ['HTTP_PROXY'] = 'socks5://127.0.0.1:7890' # 請問您此處需要設定嗎? 目前這樣在我區網可以開啟LiangYang666服務網頁.但會出現圖上錯誤
os.environ['HTTPS_PROXY'] = 'socks5://127.0.0.1:7890' # 同理
API_KEY = "sk-fiet05cS6Kyc1o0jCs1ET3BlbkFJg0edU8crvcHpoXXXXXX" #此處是我KEY設定

教程:是设置OPENAI_API_KEY为 apikey,能具体写一下是哪个地方的吗?

app = Flask(name)
app.config['SECRET_KEY'] = os.urandom(24)

os.environ['HTTP_PROXY'] = 'socks5://127.0.0.1:7890'
os.environ['HTTPS_PROXY'] = 'socks5://127.0.0.1:7890'
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") # 从环境变量中获取api_key,或直接设置api_key

openai.api_key = OPENAI_API_KEY
STREAM_FLAG = True # 是否开启流式推送
USER_SAVE_MAX = 12 # 设置最多存储12个用户,当用户过多时可适当调大
chat_context_number_max = 5 # 连续对话模式下的上下文最大数量
lock = threading.Lock() # 用于线程锁

TypeError: 'dict' object is not callable

Seen below error sometime, not found the way to fix...

[2023-04-11 16:57:05,799] ERROR in app: Exception on /loadHistory [GET]
Traceback (most recent call last):
File "/home/user/.local/lib/python3.8/site-packages/flask/app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "/home/user/.local/lib/python3.8/site-packages/flask/app.py", line 1615, in full_dispatch_request
return self.finalize_request(rv)
File "/home/user/.local/lib/python3.8/site-packages/flask/app.py", line 1630, in finalize_request
response = self.make_response(rv)
File "/home/user/.local/lib/python3.8/site-packages/flask/app.py", line 1740, in make_response
rv = self.response_class.force_type(rv, request.environ)
File "/home/user/.local/lib/python3.8/site-packages/werkzeug/wrappers/base_response.py", line 269, in force_type
response = BaseResponse(*_run_wsgi_app(response, environ))
File "/home/user/.local/lib/python3.8/site-packages/werkzeug/test.py", line 1119, in run_wsgi_app
app_rv = app(environ, start_response)
TypeError: 'dict' object is not callable

作者大好人哇

大哥你这code里都不写你的地址,找了半天才发现才找到了你的地址。😆666

希望开发具有保存历史记录到本地😄

服务器部署问题

您好,请问一下如果我在我自己的AWS ec2或者在香港的阿里云服务器部署(香港阿里云服务器可以直接访问chatgpt api并返回结果)
应该需要在那里进行修改?实在抱歉我对于服务器的一些概念不是很清楚

代码展示前端样式问题

大佬,首先十分感谢技术分享,真的很好用,给大佬点赞👍🏻👍🏻👍🏻

使用时在代码互动上会有以下几个问题:

  1. 代码回答持续输出时,前端框不断伸缩出现类似闪屏的效果,有点费眼睛[😂]
  2. 问和答时,代码经常头部是纯文本,后面部分才在代码框里

大佬有空看看能否优化下

我这边想在代码基础上加入个逻辑

我这边想在代码基础上加入个逻辑,用户id得来自于数据库,
尝试加了个user_exist方法,并给new_user_dict添加了个逻辑,但达不到需求
`def user_exists(user_id):
# 连接数据库,查询用户id是否存在
conn = pymysql.connect(host=host, user=user, password=password, database=database)
sql_select_wechatnumber = f"SELECT *FROM table WHERE wechatnumber = '{user_id}'"
with conn.cursor() as cursor:
cursor.execute(sql_select_wechatnumber)
sql_select_number_result = cursor.fetchall()
return bool(sql_select_number_result)

def new_user_dict(user_id, send_time):
if not user_exists(user_id):
return "用户 ID 不存在于数据库,请重新输入或选择已有用户 ID"

chat_id = str(uuid.uuid1())
user_dict = {"chats": {chat_id: new_chat_dict(user_id, "默认对话", send_time)},
             "selected_chat_id": chat_id,
             "default_chat_id": chat_id}

user_dict['chats'][chat_id]['messages_history'].insert(1, {"role": "assistant",
                                                           "content": "- 创建新的用户id成功,请牢记该id  \n"
                                                           })
return user_dict`

能提供下修改思路吗,比如涉及哪些函数等

能否设置每个用户id独立的访问密码?

Hi Leo,

我发现可以通过在聊天框输入任意一个已知的用户id而登录到该用户的聊天界面,且无需访问密码,请问这个流程是否考虑单独给每个用户id设置一个访问密码呢?

谢谢!

request error

request error:
HTTPSConnectionPool(host='api.openai.com', port=443): Max retries exceeded with url: /v1/chat/completions (Caused by ProxyError('Cannot connect to proxy.', NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7fc23c23f1c0>: Failed to establish a new connection: [Errno 111] Connection refused')))

填了自己的API-key。科学上网使用PAC连线,不管发什么,都是报这个错误。

打包成单独exe后,报错。

您好,打包成单独exe后,报错。
Traceback (most recent call last):
File "main.py", line 681, in
File "flask\app.py", line 884, in run
File "flask\cli.py", line 723, in show_server_banner
File "click\utils.py", line 299, in echo
AttributeError: 'NoneType' object has no attribute 'write'

关于message_history的存储

通过railway部署项目,每次重新部署会导致之前的聊天记录消失,想问下有办法做聊天记录的备份迁移吗

NameError: name 'all_user_dict' is not defined

首次运行时,输入new: user后,一直报错:NameError: name 'all_user_dict' is not defined

我详细查看了源代码,愣是没发现all_user_dict在哪里定义的,帮忙给些指导,多谢

缺失文件

404: ENOENT: no such file or directory, stat 'c:\Users\19798\Desktop\houduan\ChatGPT-Web\returnMessage'
微信图片_20240110141644
改咋解决大佬

用了一个月但是现在Railyway好像把我ban了?似乎要验证

显示如下
Verify your identity

Railway is a platform for good actors to build great products. We're sorry for this safety-check inconvenience; we aim to keep things cool for everybody. Thank you.

Due to unusual activity on your account, your GitHub account cannot be used for verification.
不知道啥问题

可否增加停止输出按钮?

  • 如题,有时候问题输错了,不小心点了发送,就只能等它回复完,有时候回复的内容一看就不是想要的,添加stop功能可以节省时间和一点点token。
  • 本来想说可否适应手机页面,仔细一看是适应了的,大佬厉害。
  • 感谢分享,好人一生平安!
    添加stop功能,以及前端自适应

如果id是中文,则一直是未授权,当前浏览器未绑定用户或访问密码错误,但数字的id和字母的没有问题

zeabur部署一直是未授权,当前浏览器未绑定用户或访问密码错误,但没有设置密码,正常创建了id,其他设置正常着
image
这可能是因为系统或应用程序只支持数字和字母字符作为ID,而不支持中文字符作为ID。因此,当使用中文字符作为ID时,系统无法验证其身份,导致未授权或访问密码错误的问题。建议您更改ID并使用数字或字母字符。

Internal Server Error

Internal Server Error
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
您好,这样报错是什么情况

无法切换成其他模型比如 gpt-4

你好LiangYang,
首先非常感谢你的这个作品,部署简易且很好用,谢谢!

我最近碰到了一个问题,我想试着把你默认用的gpt-3-turbo切换成gpt-4的模型,但是我试着在代码里直接改发现没有效果,他还是会显示用的是gpt-3-turbo。

我测试我用的模型的方法:
因为我现在的账号的rate limit是每分钟只能发3条消息,我通过超过这个限制让openai返回一个报错信息,里面会显示我正在使用的模型,也就是gpt-3.5-turbo。

想问下切换模型该如何操作呢?谢谢!

已开启流,但请求超时

开启流了,但回复内容较长时,会出现请示超时提示,如果不点确定,一段时间后刷新页面会出现完整的内容,如果点击确定就停止生成内容了。
请问这个问题如果修复?
微信图片_20230607171728

web页面窗口大小设置

首先感谢作者共享此项目,在非docker环境是最方便的部署方式了
另外请教下

  1. 如何设置web页面窗口大小呢,默认100%的话还有很多空白的地方,但是浏览器放大的话字体又很大不舒服,哪里能改这个大小呢?
  2. 如何禁用此功能呢?“支持实时流获取,即逐字获取动态加载显示”

谢谢

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.