Coder Social home page Coder Social logo

ourongxing / chatgpt-vercel Goto Github PK

View Code? Open in Web Editor NEW
3.1K 17.0 3.1K 6.12 MB

Elegant and Powerfull. Powered by OpenAI and Vercel.

Home Page: https://vercel-chatgpt-github.vercel.app/

License: MIT License

TypeScript 99.55% CSS 0.45%
chatgpt vercel edge-function solidjs

chatgpt-vercel's Introduction

ChatGPT-Vercel

20230417163906.mp4

本项目基于 chatgpt-demo 开发。正式版本(v1.0.0)使用 Solid-Start 框架,并且不再开启 SSR。请重新设置环境变量。

在线预览:

  1. vercel.app 被墙。
  2. aitoolgpt.com,由 @AUDI_GUZZ 免费提供。(2023.03.22 壮烈牺牲,提醒大家不要分享自己的站点,请小范围内使用)。

特点

  1. UI 优雅简洁的同时功能尽可能强大,细节满满,等你发现。同时满足小白和大佬使用。
  2. 快速部署到国外平台,支持 Vercel,Netlify,Railway,免翻墙使用,方便分享给朋友。
  3. 支持 PWA。
  4. 支持 Prompts 预设,使用 空格 或者 / 搜索,可以模糊匹配,突出显示匹配的文字。
  5. 支持多个对话(聊天),并且每个对话都可以单独设置,自由设置角色,不同对话可以通过 URL 直达。使用 空格空格 或者 // 搜索,可以模糊匹配,搜索历史消息。
  6. 支持导出和导入对话和设置。
  7. 实时查看当前对话会消耗的 token 以及回答的 token,及时打断。
  8. 支持多种余额查询方式,支持定时查询内置账号余额,并且发送到微信。
  9. 支持 URL query,当作搜索引擎使用,所有对话都支持。比如 url?q=keyword 或者 url/session/xxxxx?q=keyword

使用技巧

  • 有效上下文:剔除报错的部分对话。如果关闭连续对话,将只统计锁定了的部分对话。这个概念很关键。

  • 锁定对话:点击每条消息前面的头像,就可以锁定了。锁定有什么好处?清空对话时,锁定了的不会删除。关闭连续对话时,始终会发送锁定了的对话,相当于角色设定。关闭 记录对话内容 后,始终会记录锁定了的对话,下次刷新仍然存在。

  • Open AI Key 要怎么获得:注册 OpenAI 的帐号,然后 生成 Key 就行了。现在注册就送 5 美元,可以用一两个月。嫌注册麻烦,可以直接去买号,自行搜索。注意不要被骗,一般 5 元以下可以入手,看到有 120 美元的 key,这种属于是绑了虚拟信用卡,可以透支 120 美元,只能用一个月,而且容易封号。现在没绑卡的账号限制比较多,并且容易封号。绑了卡也会优先扣除赠送的余额。

  • 输入框

    • Enter发送(可关闭),Shift+Enter换行。
    • 空格 或者 / 搜索 Prompt 预设,可以模糊匹配。所有 Prompt 可以查看 prompts.md
    • 使用 空格空格 或者 // 搜索其它对话,可以模糊匹配,搜索历史消息。
    • 将最近的一次提问填到输入框里。
  • 消息上的动作

    • 提问
      • 编辑:不能原地编辑,只能自动填到输入框里。
      • 重新回答:删除当前对话,然后自动发送。
      • 删除:删除当前对话。
    • 回答
      • 复制
      • 重新回答
      • 删除:只删除回答。
  • 点击顶部标题滚动到顶部,点击输入框滚动到底部。

  • 发送 sk- 开头的 key,可以直接查询余额。可以换行查询多个。也可以发送 查询填写的 Key 的余额 来直接查询你填的 key 的余额,这个 Prompt 预设第一个就是,直接用。作为站长,你可以通过设置环境变量来定时查询所有内置 key 的余额,并发送到微信上。

  • url 里使用 url?q=你好啊 这种方式可以打开网页直接回答 你好啊,当作搜索引擎使用。所有的对话中都可以使用。

设置与动作

右边四个按钮是动作,点击就可以执行。

  • 伪装角色:伪装时直接进入对话里,不会发送请求。可以伪装成用户提问以及 GPT 回答。发送后自动关闭伪装。
  • 将当前对话生成图片,方便分享。在电脑上直接复制到剪贴板,手机上是下载。
  • 将当前对话生成 Markdown,直接复制到剪贴板。
  • 清空对话。

image-20230417134751367

现在支持了多个对话,也就是多个聊天。不同的对话可以单独设置,也有不同的链接,标题,图标。所以现在有了两个设置按钮,第一个是全局设置,可以填写密码,API Key,也可以关闭 Enter 键发送,这样在手机上也可以换行。

image-20230417134833609

第二个是对话设置,尽当前对话有效,针对不同的用途自行设置。目前 GPT4 仍然处于 waitlist 阶段,如果没有资格,那么无法使用。

思维发散程度越高,ChatGPT 就会乱答,如果是开放性的问题,可以适当调高,但也不要超过 1。需要确切答案的建议调为 0。

开启 记录对话内容 后,对话刷新也不会清空。开启连续对话后,每次会发送所有有效上下文,一开始提过有效上下文这个概念。

image-20230417134804056

当你点击了设置按钮之后,会发现右边的动作按钮也发生了变化。打开全局设置后,出现的导出和导入按钮。可以导出和导入所有的设置和对话。

而打开对话设置之后,在首页,也就是主对话里,就只有一个新建对话的按钮,当你新建了对话。就会出现复制对话链接以及删除对话的按钮。值得注意的是,目前这个链接只能你自己能打开,并没有上传到云端。

image-20230417135644474

在新的对话里,你可以设置标题,甚至可以设置图标,试试在标题前面加一个 Emoji。

部署一个你自己的 ChatGPT 网站(免费,国内直连)

Warning

vercel.app 域名已经被墙,但 vercel 本身没有被墙,所以你绑定自己的域名就可以了。如果广泛分享,域名有被墙的风险。如果是国内购买的域名,有请去喝茶的风险,所以要么小范围加密码使用,要么在国外购买域名。更推荐小范围内使用。

如果你只需要部署一个你自己用的网站,而不需要定制,那么你完全不需要在本地跑起来,你可以直接点击下面的按钮,然后按照提示操作,然后在 Vercel 中填入环境变量即可。

Deploy with Vercel

不过上面这种方式不容易更新,最好还是先 fork 本仓库,然后在 Vercel 中导入你自己的仓库,之后要更新就在 Github 里点击 Sync fork 就可以同步更新了。

如果你需要部署给更多人用,需要修改一些代码,那么你可能需要将上面创建的你自己的仓库 git clone 到本地。改完了 git commit & push 即可重新部署,vscode 上点几下就可以了。也可以用 vercel 的 cli,vercel deploy --prod

如果你需要在本地开发和调试,有点麻烦:

  1. 升级到 node18,要用到原生的 fetchreadableStream
  2. API 被墙了,自己想办法开代理,不然要报错。可以设置 OpenAI 的代理 API,也可以直接 vercel deploy 部署到 vercel 开发环境上调试。
  3. pnpm i 安装依赖。
  4. pnpm dev 启动项目。

更多部署方案

目前本项目除 Vercel 以外还支持

不建议使用除 Vercel 以外的部署方案。 除了比较慢以外,更重要的是只有 Vercel 支持设置 Edge Function 服务器的地区,其他平台会自动使用距离最近的服务器,有可能是 OpenAI 不支持的地区,从而导致封号。

环境变量

v1.0.0 版本环境变量变化比较大,需要重新设置。以 CLIENT_ 开头的变量会暴露给前端,请不要填写敏感信息。

环境变量 说明 默认值
OPENAI_API_KEY OpenAI API Key,可以填写多个,用 | 或者 换行 隔开,随机调用。最好是多填几个,API 有并发上的限制。如果用户不填自己的 key,那么就会使用你的 key。
OPENAI_API_BASE_URL 本地开发时可以填写 OpenAI 的代理服务器,但是 Vercel 不需要。并且不建议生产阶段使用。 api.openai.com
NO_GFW 表示可以服务器可以直连,不需要OPENAI_API_BASE_URL,就算设置了也不使用。 false
TIMEOUT OpenAI API 超时。单位为毫秒,Vercel Edge Function 最大超时为 30000。 30000
PASSWORD 网站密码
CLIENT_DEFAULT_MESSAGE 默认提示信息 - xx xx
CLIENT_GLOBAL_SETTINGS 默认全局设置 {"APIKey":"","password":"","enterToSend":true}
CLIENT_SESSION_SETTINGS 默认对话设置,对话设置在每个对话中都是独立的。 {"title":"","saveSession":true,"APITemperature":0.6,"continuousDialogue":true,"model":"gpt-3.5"}
CLIENT_MAX_INPUT_TOKENS 有效上下文+输入的 token 数。OpenAI 不同模型的最大 token 不一样,价格也不同,可以分别设置。并且 OpenAI 会统计输入+输出之和,但我们这里只限制输入。 {"gpt-3.5":16000,"gpt-4":32000}
SEND_KEY 使用 Server 酱 推送帐号余额以及可用状态到微信,如果需要自行获取。推送时间为早上 8 点和晚上 8 点,在 vercel.json 文件中修改。如果 key 太多,超过 20 个,有可能失败。
SEND_CHANNEL Server 酱 的推送通道,默认微信服务号。 9

有两种设置方式

  1. .env.example 文件修改为 .env,在 .env 中设置。

  2. Vercel 中设置 Environment Variables。尽量使用这种方式,比较方便。会在下次部署时生效。

默认全局设置

记得删除注释,或者直接复制上面表格里的。

{
  "APIKey": "", // 默认填写的 key,不需要填写,否则其他人看得到。
  "password": "", // 默认填写的密码,不需要填写,否则其他人看得到。
  "enterToSend": true // 回车键发送消息
}

默认对话设置

对话设置在每个对话中都是独立的。记得删除注释,或者直接复制上面表格里的。

{
  "title": "", // 对话标题,不需要填写
  "saveSession": true, // 记录当前对话内容,刷新不会丢失。关闭后仍然会记录锁定的对话。
  "APITemperature": 0.6, // 0-2,思维发散程度,越高 ChatGPT 思维就越发散,开始乱答,甚至会乱码,建议小于 1 。
  "continuousDialogue": true, // 开启连续对话,每次都需要将上下文传给 API。
  "model": "gpt-3.5" // 模型,gpt-3.5、gpt-4。会自动根据 tokens 大小选择合适的模型。
}

提交你的 Prompts

  1. Fork 本项目。
  2. 修改 prompts.md
  3. Pull Request 即可。

如果你不懂这个操作,也可以直接在 Issues 提交你的 Prompts。目前大部分 Prompts 来自于 awesome-chatgpt-prompts-zh,当然,这个仓库大多数也是翻译的 awesome-chatgpt-prompts,一并感谢。

要求

  • 把需要输入的内容放在最后,可以提示 ChatGPT 开始输入了,比如 “我的第一句话是:”。
  • 尽可能去优化已有的 Prompts,而不是重复添加。
  • 添加到结尾,我会定期整理。

赞赏

如果本项目对你有所帮助,可以给小猫买点零食,但不接受任何付费功能请求。

License

MIT

chatgpt-vercel's People

Contributors

1wkk avatar bkyaro avatar boynchan avatar ddiu8081 avatar gowxx avatar hulog avatar likenttt avatar linlin00000000 avatar ourongxing avatar tsingyi1263 avatar yicaoli avatar yorunning avatar youhunwl avatar yzh990918 avatar zhangnew 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  avatar  avatar  avatar  avatar  avatar

chatgpt-vercel's Issues

TypeError An error occurred. --- fetch failed

WeChatba6eb839fe006f7924577891e6d85fe9


输入问题后,一直提示这个问题

env中加入这个:HTTPS_PROXY=http://127.0.0.1:15235
一样也是连接不成功,求解谢谢


import type { APIRoute } from "astro"
import {
createParser,
ParsedEvent,
ReconnectInterval
} from "eventsource-parser"

const apiKeys = (
import.meta.env.OPENAI_API_KEY?.split(/\s*|\s*/) ?? []
).filter(Boolean)

export const post: APIRoute = async context => {
const body = await context.request.json()
const apiKey = apiKeys.length
? apiKeys[Math.floor(Math.random() * apiKeys.length)]
: ""
let { messages, key = apiKey, temperature = 0.6 } = body

const encoder = new TextEncoder()
const decoder = new TextDecoder()
^

if (!key.startsWith("sk-")) key = apiKey
if (!key) {
return new Response("没有填写 OpenAI API key")
}
if (!messages) {
return new Response("没有输入任何文字")
}

const completion = await fetch("https://api.openai.com/v1/chat/completions", {
headers: {
"Content-Type": "application/json",
Authorization: Bearer ${key}
},
method: "POST",
body: JSON.stringify({
model: "gpt-3.5-turbo",
messages,
temperature,
stream: true
})
})

const stream = new ReadableStream({
async start(controller) {
const streamParser = (event: ParsedEvent | ReconnectInterval) => {
if (event.type === "event") {
const data = event.data
if (data === "[DONE]") {
controller.close()
return
}
try {
// response = {
// id: 'chatcmpl-6pULPSegWhFgi0XQ1DtgA3zTa1WR6',
// object: 'chat.completion.chunk',
// created: 1677729391,
// model: 'gpt-3.5-turbo-0301',
// choices: [
// { delta: { content: '你' }, index: 0, finish_reason: null }
// ],
// }
const json = JSON.parse(data)
const text = json.choices[0].delta?.content
const queue = encoder.encode(text)
controller.enqueue(queue)
} catch (e) {
controller.error(e)
}
}
}

  const parser = createParser(streamParser)
  for await (const chunk of completion.body as any) {
    parser.feed(decoder.decode(chunk))
  }
}

})

return new Response(stream)
}

希望增加删除单条问答记录的功能

在需要连续对话的场景,有时一些历史消息是我们不需要提供给api的。目前只有清除整个消息记录的功能,需要携带部分上下文时就满足不了需求了。希望大佬加下

Run `npm config delete prefix` or `nvm use --delete-prefix v18.0.0` to unset it.

使用CloudFlare配置Pages项目,刚开始提示Node版本过低,升级Node版本为18.0.0后,出现另外一个错误,如下:

-- | --
20:24:42.689 | Installing dependencies
20:24:42.700 | Python version set to 2.7
20:24:46.058 | Downloading and installing node v18.0.0...
20:24:46.551 | Downloading https://nodejs.org/dist/v18.0.0/node-v18.0.0-linux-x64.tar.xz...
20:24:46.986 | Computing checksum with sha256sum
20:24:47.120 | Checksums matched!
20:24:51.354 | node: /lib/x86_64-linux-gnu/libm.so.6: version GLIBC_2.27' not found (required by node) 20:24:51.354 | node: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.25' not found (required by node)
20:24:51.355 | node: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.28' not found (required by node) 20:24:51.405 | nvm is not compatible with the npm config "prefix" option: currently set to "" 20:24:51.407 | Run npm config delete prefixornvm use --delete-prefix v18.0.0` to unset it.
20:24:51.407 | Failed to install node version '18.0.0'
20:24:51.411 | Failed: build command exited with code: 1
20:24:52.194 | Failed: an internal error occurred

因为在CloudFlare,只能配置npm run build的配置,没办法解决npm和nvm的冲突,有其他人遇到吗

 ERR_PNPM_OUTDATED_LOCKFILE  Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up-to-date with package.json

加了一个gitalk 评论插件 重新部署后,出现下面错误,框架不熟,求大佬指教

 ERR_PNPM_OUTDATED_LOCKFILE  Cannot install with "frozen-lockfile" because pnpm-lock.yaml is not up-to-date with package.json
Note that in CI environments this setting is true by default. If you still need to run install in such cases, use "pnpm install --no-frozen-lockfile"

image

手机端复制无效

在手机上使用,点对话右上角复制,提示复制成功,实际没有复制上。

请问prompt在哪里找啊?

如题,还有这个预设可以自己写一个设定,直接在对话开头发给chat吗?还是说需要把写的设定设置到系统角色里?

模型选择问题

能否就是在下面的设置处,可以添加模型选择,然后根据不同的任务选择不同的模型,然后来执行之后的操作

新版本速度问题

更新到最新版本之后,相应的速度下降了不少,我还是回退到之前部署的版本上面了

添加可用余额展示

希望页面上增加一个可用余额的展示,该接口请求方式如下:

$ curl -s  "https://api.openai.com/dashboard/billing/credit_grants" \
--header 'Content-type: application/json' \
--header 'Authorization: Bearer api_key' | jq    这里替换api_key
{
  "object": "credit_summary",
  "total_granted": 18,
  "total_used": 0.178104,  # 已用
  "total_available": 17.821896,  # 剩余可用余额
  "grants": {
    "object": "list",
    "data": [
      {
        "object": "credit_grant",
        "id": "be32c280-ad4a-4e14-bc1a-077a32275f9e",
        "grant_amount": 18,
        "used_amount": 0.178104,
        "effective_at": 1677628800,
        "expires_at": 1688169600
      }
    ]
  }
}

功能添加

大佬可以加个屏蔽词功能吗
就是设置某个屏蔽词然后转成另外一个词
然后可以设置多个的那种

fetch error

我本地部署的, 频繁的 出现下面的错误:

image

markdown导出功能

个人部署后无法使用导出markdown功能,导出图片功能可正常使用

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.