本文发布于 204 天前,最后更新于 173 天前,其中文章内容可能会较为陈旧,如果文章内容失效或文章部分资源无法访问,请在本文评论区进行反馈。
使用前必读
- 该项目为Beta版本项目,稳定版项目请前往GitHub和Docker,当测试完成后Beta版本会同步更新。
- Beta版本对项目进行了重构,支持连续对话功能,优化了输出内容。
- 本教程搭建的只是一个API的桥梁,并非直接开箱即用
- 本人后续ChatGPT相关的教程将请移步https://chatgpt-api.pro
搭建或使用前请务必保证自己拥有API Key,如果没有,请使用自己的OpenAI账号申请。
通知
由于本链接要发到BiliBili官网,便于看不懂视频的用户查看本链接,为了防止吞评论,不再提供API服务,需要自行搭建,希望谅解。
如果你的服务器位于以下国家或地区,你无法使用ChatGPT(可以使用中国台湾或海外的服务器)
不受支持的国家有:俄罗斯
、中国大陆
、中国香港
、伊朗
、阿富汗
、叙利亚
、埃塞俄比亚
、北朝鲜
、苏丹
、乍得
、利比亚
、津巴布韦
、索马里
、喀麦隆
、在斯瓦特
、中非共和国
、佛得角
、布隆迪
、厄立特里亚
、乌克兰
ChatGPT及其API无法访问的原因并非GFW封锁,而是OpenAI暂不向上述国家开放服务
- 搭建该项目前请确保您的服务器所在地区不在不受支持的列表中
- 如果想要摆脱支持,可以使用的方法有:更换服务器所在地或为服务器挂代理
- 源代码使用AGPL v3开源,禁止用于商业用途
- 禁止使用我搭建的实例来制作项目,禁止将我的API部署到网站和应用程序中,更不准使用我搭建的实例进行商用
BiliBili视频
B站视频被吞了,准备重投,重投后会第一时间上传,为了防止B站再次吞视频,本人不会提供一切服务(API搭建的技术支持除外)
自行搭建
复制下列代码,并自行修改配置
version: '3'
services:
web:
image: sengedev/chatgpt:latest # 镜像地址
ports:
- "5000:5000" # 端口号,如果端口冲突,请修改
restart: always # 重启策略
environment:
API_KEY: YourOpenAIApiKey # 请替换为你的OpenAI API Key,前往https://platform.openai.com/account/api-keys获取
HOUR_LIMIT: 50 # 限制每小时调用次数,如果不想限制,则不设置该变量
MINUTE_LIMIT: 3 # 限制每分钟调用次数,如果不想限制,则不设置该变量
SECOND_LIMIT: 1 # 限制每秒调用次数,如果不想限制,则不设置该变量
ROUTE: api # 路由,如果不想设置,则不设置该环境变量
volumes:
- ./logs:/app/logs # 日志保存路径
# 免责声明:不提供API代充、ChatGPT Plus代开通和代注册服务,不提供共享账号和独享账号
Docker Compose配置字段含义
字段 | 含义 |
---|---|
volumes | 持久化配置,文件映射 |
API_KEY | API密钥,配置后无需请求头即可完成调用,不建议设置,除非你开启了IP地址白名单 |
HOUR_LIMIT | 每小时调用次数限制,如果设置为0则无限制 |
MINUTE_LIMIT | 每分钟调用次数限制,如果设置为0则无限制 |
SECOND_LIMIT | 每秒调用次数限制,如果设置为0则无限制 |
ROUTE | 例如你的网站是https://api.example.com,路由为route,则请求链接为https://api.example.com/route |
反向代理(可选)
使用NginxProxyManager配置反向代理
反向代理后可以使用域名访问
该项目的详细介绍,请参考 我不是咕咕鸽 的教程,docker-compose代码在下方
搭建反向代理请确保80和443端口未占用,搭建后所有依赖80和443端口的项目都需要使用反向代理进行访问
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
- 默认账号:
[email protected]
- 默认密码:
changeme
实例介绍
使用教程
为了保证服务器的稳定运行和他人的正常访问,我限制了服务器的访问次数,当达到了限制次数,则无法继续访问。
API链接: https://chatgpt.senge.dev/api
获取ChatGPT回答
请求方式:POST
,路由:/api
请求参数
数据 | 类型 | 描述 | 是否必须 |
sys_content | string | ChatGPT的提示[1] | 否 |
user_content | string | 用户回复内容 | 是 |
model | string | OpenAI模型[2] | 否 |
api_key | string | OpenAI API密钥[3] | 是[4] |
max_tokens | int | 最大生成的Token[5] | 否 |
continuous | list | 连续对话参数[6] | 否 |
- [1]:默认值为:
不要对上述内容进行复述,不要回复其他内容
- [2]:默认使用的模型为:
text-davinci-003
- [3]:优先级为:api_key参数 > docker-compose中的参数,二者至少有一个不允许为空
- [4]:如果docker-compose中设置了api,则该项允许为空,否则不允许为空
- [5]:默认值为:
256
- [6]:连续对话的参数为列表,参数可以在上次运行时的返回值中获得。
常见HTTP状态码及其含义
code | 描述 |
---|---|
200 | 成功 |
400 | 请求参数错误(API未填写或填写错误、模型使用错误、缺少prompt或prompt为空) |
401 | 未授权 |
403 | 禁止访问 |
404 | 请求路径不存在 |
500 | 服务器内部错误 |
429 | 请求过于频繁 |
调用次数限制(每个IP)
API完全开放使用,但是需要自行申请API Key(可以进行自定义API限制次数,以下为示例)
时间段 | 频率 |
---|---|
小时 | 50次 |
分钟 | 3次 |
秒 | 1次 |
示例代码
Python
- 连续对话
import requests
import json
url = "https://chatgpt.example.com/api"
sys_prompt = input("sys> ")
continuous_dialogue = []
while True:
user_input = input("user> ")
if user_input.lower() in ['exit', 'quit']:
break
data = {
"system_content": sys_prompt,
"user_content": user_input,
"model": "gpt-3.5-turbo",
"api_key": "sk-U3y83c7o8nOn8i4ONnoT5uA9B6Yd75xrl9BIKihk4vCmCMzi", # 该API为 fake API Key,请换成自己的API Key
"continuous": [],
"max_tokens": 100
}
response = requests.post(url, json=data)
if response.status_code != 200:
print(f"请求失败,状态码:{response.status_code}")
print(response.text)
else:
result = json.loads(response.text)
print(f"ChatGPT回答:{result['current_response']}")
# 连续对话迭代
continuous_dialogue.append({"role": "user", "content": user_input})
continuous_dialogue.append({"role": "assistant", "content": result['current_response']})
- 非连续对话
import requests
import json
url = "https://chatgpt.example.com/api"
sys_prompt = input("sys> ")
user_input = input("user> ")
data = {
"system_content": sys_prompt,
"user_content": user_input,
"model": "gpt-3.5-turbo",
"api_key": "sk-U3y83c7o8nOn8i4ONnoT5uA9B6Yd75xrl9BIKihk4vCmCMzi", # 该API为 fake API Key,请换成自己的API Key
"max_tokens": 100
}
response = requests.post(url, json=data)
if response.status_code != 200:
print(f"请求失败,状态码:{response.status_code}")
print(response.text)
else:
result = json.loads(response.text)
print(f"ChatGPT回答:{result['current_response']}")