跳到主要内容

5 篇博文 含有标签「ChatGPT」

查看所有标签

Share-plus-chatgpt 搭建及使用

· 阅读需 6 分钟

Share-plus-chatgpt项目部署

1、创建应用目录并创建配置文件

cd ~
mkdir cws && cd cws
mkdir -p data/config

export MONGODB_PASSWORD=your_pass # MongoDB 密码
export INITIAL_ADMIN_PASSWORD=your_pass # 初始管理员密码

# 运行一次 Docker 容器,创建配置文件:
docker run -it --rm \
-v $PWD/data/config:/tmp/config \
ghcr.io/moeakwak/chatgpt-web-share:latest \
python /app/backend/manage.py create_config -O /tmp/config --generate-secrets --mongodb-url "mongodb://cws:${MONGODB_PASSWORD}@mongo:27017" --initial-admin-password "${INITIAL_ADMIN_PASSWORD}" --chatgpt-base-url http://ninja:7999/backend-api/

2、编辑 docker-compose 文件

echo "TZ=Asia/Shanghai" > .env
echo "MONGO_INITDB_DATABASE=cws" >> .env
echo "MONGO_INITDB_ROOT_USERNAME=cws" >> .env
echo "MONGO_INITDB_ROOT_PASSWORD=your_pass" >> .env

docker-compose.yml

version: "3"

services:
chatgpt-web-share:
image: ghcr.io/chatpire/chatgpt-web-share:latest
container_name: cws
restart: unless-stopped
ports:
- 5000:80
volumes:
- ./data:/app/backend/data
environment:
- TZ=${TZ}
- CWS_CONFIG_DIR=/app/backend/data/config
depends_on:
- mongo

mongo:
container_name: mongo
image: mongo:6.0
restart: always
# ports:
# - 27017:27017
volumes:
- ./mongo_data:/data/db
environment:
MONGO_INITDB_DATABASE: ${MONGO_INITDB_DATABASE}
MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}

ninja:
image: ghcr.io/gngpp/ninja:latest
container_name: ninja
restart: unless-stopped
command: run --disable-webui
ports:
- "7999:7999"
environment:
- TZ=Asia/Shanghai
volumes:
- "./har/gpt3:/root/.gpt3"
- "./har/gpt4:/root/.gpt4"

启动服务

docker-compose up -d 

3、配置 ChatGPT 代理

Ninja 文档:https://github.com/gngpp/ninja/blob/main/doc/readme_zh.md


简单来说,你需要:

  1. 在 CWS 的配置中将 ChatGPT 代理地址设置为 http://ninja:7999/backend-api/。(这应当在上一步已经完成了)
  2. 参考 ninja 的文档获取 HAR 文件,将 HAR 文件放在 cws/har/gpt3(假如 GPT 3.5 模型出现验证码) 和 cws/har/gpt4 下。你可以直接上传文件到相应目录,也可以使用 Ninja 提供的网页上传(访问 http://<你的服务器 IP>:7999/har/upload)。
  3. 访问 https://chat.openai.com/api/auth/session 并复制其中的 access token 项内容,在 CWS 的后台设置中的 credentials 中填入。
ArkoseLabs

发送GPT-4/GPT-3.5/创建API-Key对话需要Arkose Token作为参数发送,支持的解决方案暂时只有两种

1、使用HAR 支持HAR特征池化,可同时上传多个HAR,使用轮训策略 ChatGPT 官网发送一次 GPT-4 会话消息,浏览器 F12 下载 https://tcr9i.chat.openai.com/fc/gt2/public_key/35536E1E-65B4-4D96-9D97-6ADB7EFF8147 接口的HAR日志记录文件,使用启动参数 --arkose-gpt4-har-dir 指定HAR目录路径使用(不指定路径则使用默认路径~/.gpt4,可直接上传更新HAR),同理GPT-3.5和其他类型也是一样方法。支持WebUI上传更新HAR,请求路径:/har/upload,可选上传身份验证参数:--arkose-har-upload-key

2、使用YesCaptcha / CapSolver 平台进行验证码解析,启动参数--arkose-solver选择平台(默认使用YesCaptcha),--arkose-solver-key 填写Client Key

两种方案都使用,优先级是:HAR > YesCaptcha / CapSolver YesCaptcha / CapSolver推荐搭配HAR使用,出验证码则调用解析器处理,验证后HAR使用更持久 目前OpenAI已经更新登录需要验证Arkose Token,解决方式同GPT-4,填写启动参数指定HAR文件--arkose-auth-har-dir。创建API-Key需要上传Platform相关的HAR特征文件,获取方式同上。

OpenAI取消对GPT-3.5进行Arkose验证,可以不上传HAR特征文件使用(已上传的不影响),兼容后续可能会再次开启Arkose验证,需要加上启动参数--arkose-gpt3-experiment进行开启GPT-3.5模型Arkose验证处理,WebUI不受影响。如果遇到418 I'm a teapot,可以开启--arkose-gpt3-experiment,同时需要上传HAR特征,如果没有GPT-3.5的特征,GPT-4的特征也可以使用,如果还不行,则尝试开启--arkose-gpt3-experiment-solver,可能会使用第三方平台解决验证码。

4、接下来要做的事

到这里,CWS 已经部署完成。要继续使用,你可能需要:

  • 在服务器上配置反向代理,配置域名和 https 加密
  • 关闭 Ninja 对外的 7999 端口,比如在 docker compose 配置中注释掉它,或者使用防火墙限制访问

5、升级及维护

docker-compose pull && docker-compose up -d
# 在更新前,建议备份数据,并且确保设置中已经打开 run_migration 选项,以便在更新后自动执行数据库迁移。

6、反向代理

提供三种方式

6.1 设置反向代理和 SSL

为了向外公开站点,你应当使用 https 协议。我们推荐使用 Caddy 作为反向代理,它可以自动申请证书并配置 https。

下面是一个使用 Cloudflare 的 API 自动进行证书验证的 Caddyfile 例子:

{
email `<YOUR_EMAIL>`
storage file_system {
root /root/caddy/certs/
}
log error {
output file /root/caddy/logs/error.log {
roll_size 20MB
roll_keep 5
roll_keep_for 240h
}
level ERROR
}
acme_dns cloudflare API_TOKEN
}

your-cws-site.com {
reverse_proxy :5000
}
6.2 使用 Cloudflare

推荐使用 Cloudflare 加速站点,从而隐藏服务器 IP。如果你将域名 DNS 托管在 Cloudflare,在开启 Proxy 之后,你有如下方式使用 https:

  • 在 Cloudflare 中设置站点 https 跳转,并在 SSL/TLS 选项中设置加密类型为 flexible;服务器中反向代理对外使用 http 协议。如果你想更安全,可以将其配置为只允许 Cloudflare 服务器访问。这样的好处是开启 https 较为简单,不用续证书。
  • 在 SSL/TLS 选项中设置加密类型为 Full,服务器反向代理配置有效的 SSL 证书,对外使用 https。
6.3 使用 nginx
http {
...
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
...
}

server {
listen 443 ssl;
server_name plus.domain.com;

ssl_certificate /etc/nginx/ssl/plus.doamin.com.pem;
ssl_certificate_key /etc/nginx/ssl/plus.domain.com.key;

location / { # 目前已经实现的子系统
proxy_http_version 1.1; #WebSocket
proxy_set_header Upgrade $http_upgrade; #WebSocket
proxy_set_header Connection $connection_upgrade; #WebSocket

proxy_pass http://127.0.0.1:5000;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;

proxy_buffering off;
chunked_transfer_encoding on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;

}
}

server {
listen 80;
server_name plus.domain.com;

location = / {
rewrite ^(.+)$ https://plus.domain.com$1 redirect;
}
}

利用iproyal住宅IP使用chatgpt

· 阅读需 2 分钟

随着 ChatGPT 和其他 AI 聊天机器人的普及,许多用户希望能够通过不同的 IP 地址来访问这些服务,以确保隐私和安全。IPRoyal 是一个提供住宅 IP 代理服务的平台,可以帮助用户实现这一目标。在本文中,我们将探讨如何利用 IPRoyal 的住宅 IP 服务与 ChatGPT 进行交互。

1. 为什么要使用 IPRoyal 住宅 IP?

  • 隐私保护:通过使用代理 IP,您可以隐藏您的真实 IP 地址,从而保护您的在线隐私。
  • 地理限制绕过:某些服务可能会根据地理位置进行限制,使用 IPRoyal 可以帮助您绕过这些限制。
  • 负载均衡:如果您运行一个需要大量与 ChatGPT 交互的应用,使用多个 IP 可以帮助分散请求,减少单一 IP 的压力。

最最最主要的原因:使用 Clash 的机场IP,很容易被封号,兄弟我已经被封四五个号了,还有当时刚放开GPT-4权限,就拥有GPT-4权限的市场价值两三千的账号,都被封了!!!

2. 如何设置 IPRoyal 代理?

  1. 访问 IPRoyal 官方网站并注册账号。
  2. 选择合适的套餐并完成购买。
  3. 在控制面板中,找到您的代理 IP 和端口信息。
  4. 在您的应用或浏览器中,进入网络设置(或者安装插件),将代理服务器设置为 IPRoyal 提供的 IP 和端口。

因为我 chrome 使用的 SwitchyOmega 配合Gost和Clash来做的,并且经常来回切换网络和地址。所以为了代理地址稳定我个人是单独用的 Firefox 来访问 OpenAI 用的,用的是 FoxyProxy 的插件。

PS: 为什么用Gost了还要用住宅IP代理?因为Gost配合VPS做的代理,依然有可能会被OpenAI识别到并且封禁,因为市面上几乎所有的VPS都是数据中心的IP,会被标记到。

我用的住宅IP是买的新加坡的住宅IP,一个 IP 价格 5.2美刀 一个月,还有非常重要的一点:最好用正规卡充值,虚拟卡充值可能会遭遇退款并封禁账号。

Chatgpt

自建 OpenAI 镜像站 Demo

· 阅读需 3 分钟

自建 OpenAI 镜像站 Demo

testopenai.py

# coding: utf-8

import openai

# openai.log = "debug"
openai.api_key = "sk-"
openai.api_base = "https://api_gpt4.ai-gaochao.com/v1"


DEBUG = False

# 非流式响应
# completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[{"role": "user", "content": "Hello world!"}])
# print(completion.choices[0].message.content)

def gpt_api_stream(messages: list):
"""为提供的对话消息创建新的回答 (流式传输)

gpt4长问题需要用流式传输,不然容易报错
Args:
messages (list): 完整的对话消息
api_key (str): OpenAI API 密钥

Returns:
tuple: (results, error_desc)
"""
try:
response = openai.ChatCompletion.create(
model='gpt-4',
# model="gpt-3.5-turbo",
messages=messages,
stream=True,
# temperature=0.5,
# presence_penalty=0,

)
completion = {'role': '', 'content': ''}
for event in response:
if event['choices'][0]['finish_reason'] == 'stop':
if DEBUG:
print(f'收到的完成数据: {completion}')
break
for delta_k, delta_v in event['choices'][0]['delta'].items():
if DEBUG:
print(f'流响应数据: {delta_k} = {delta_v}')
completion[delta_k] += delta_v
messages.append(completion) # 直接在传入参数 messages 中追加消息
msg = completion['content'] # 解析返回的msg
return (True, msg)
except Exception as err:
return (False, f'OpenAI API 异常: {err}')

def gpt_api_no_stream(messages: list):

try:
completion = openai.ChatCompletion.create(
# model="gpt-3.5-turbo",
# model="gpt-4",
model="gpt-4-0613",
messages=messages
)
# print(completion)

msg = None
choices = completion.get('choices', None)
if choices:
msg = choices[0]['message']['content']
else:
msg = completion['message']['content']
return (True, msg)
except Exception as err:
return (False, f'OpenAI API 异常: {err}')


if __name__ == '__main__':

# 一次性回答版
prompt = 'There are 9 birds in the tree, the hunter shoots one, how many birds are left in the tree?' # 短问题
prompt = "鲁迅为什么暴打周树人"
# prompt = "假如你是一个电力行业专家,请回答下面的问题:变压器有哪些部分组成" # 长问题。可以把DEBUG变量设置为True来看流传输信息
print("发送:", prompt)
print("使用的apikey:", openai.api_key)
messages = [{'role': 'user','content': prompt},]
ret, msg = gpt_api_stream(messages)
# ret, msg = gpt_api_no_stream(messages)
print("返回:", msg)
if DEBUG:
print("messages:", messages)



# # 问答版
# messages = []
# while True:
# prompt = input("Q: ")
# messages.append({'role': 'user','content': prompt})
# ret, msg = gpt_api_stream(messages)
# print("A:", msg)

selectmoney.py

import requests
from datetime import datetime, timedelta

def check_billing(api_key, api_url):
# 计算起始日期和结束日期
now = datetime.now()
start_date = now - timedelta(days=90)
end_date = now + timedelta(days=1)
sub_date = now.replace(day=1)

# 设置API请求URL和请求头
url_subscription = f"{api_url}/v1/dashboard/billing/subscription"
url_balance = f"{api_url}/dashboard/billing/credit_grants"
url_usage = f"{api_url}/v1/dashboard/billing/usage?start_date={start_date.strftime('%Y-%m-%d')}&end_date={end_date.strftime('%Y-%m-%d')}"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}

try:
# 获取API限额
response = requests.get(url_subscription, headers=headers)
if response.status_code != 200:
print("查询返回异常。可能是:\n1. apikey没有余额了\n2. apikey无效\n3. apikey的base_url填写错了")
return

subscription_data = response.json()
total_amount = subscription_data['hard_limit_usd']

# 判断总用量是否大于20,若大于则更新start_date为sub_date
if total_amount > 20:
start_date = sub_date

# 重新生成url_usage
url_usage = f"{api_url}/v1/dashboard/billing/usage?start_date={start_date.strftime('%Y-%m-%d')}&end_date={end_date.strftime('%Y-%m-%d')}"

# 获取已使用量
response = requests.get(url_usage, headers=headers)
usage_data = response.json()
total_usage = usage_data['total_usage'] / 100

# 计算剩余额度
remaining = total_amount - total_usage

# 输出总用量、总额及余额信息
print(f"Total Amount: {total_amount:.2f}")
print(f"Used: {total_usage:.2f}")
print(f"Remaining: {remaining:.2f}")

return [total_amount, total_usage, remaining]
except Exception as error:
print(error)
return [None, None, None]

# 使用示例
api_key = "sk-"
api_base = "https://api_gpt4.ai-gaochao.com"

result = check_billing(api_key, api_base)