/free-proxy

高速、免费的 ChatGPT 代理节点

Primary LanguageGo

高速、免费的 ChatGPT 代理节点

体验机器人可直接加QQ: 775762961

QQ 交流群:752372415

下面的 API 可以直接使用 ⬇️ ⬇️ ⬇️

使用方法

注意⚠️:该 API 仅用于测试,有限流。

1. 使用 curl 访问

curl -X POST --location "https://external.hdcjh.xyz/gateway/free-proxy/v1/chat/completions" \
    -H "Authorization: Bearer qq-group-752372415" \
    -H "Content-Type: application/json" \
    -d "{
          \"model\": \"gpt-3.5-turbo\",
          \"messages\": [
            {
              \"role\": \"system\",
              \"content\": \"You are a helpful assistant.\"
            },
            {
              \"role\": \"user\",
              \"content\": \"hi\"
            }
          ]
        }"

流式传输:

curl -X POST --location "https://external.hdcjh.xyz/gateway/free-proxy/v1/chat/completions" \
    -H "Authorization: Bearer qq-group-752372415" \
    -H "Content-Type: application/json" \
    -d "{
          \"model\": \"gpt-3.5-turbo\",
          \"messages\": [
            {
              \"role\": \"system\",
              \"content\": \"You are a helpful assistant.\"
            },
            {
              \"role\": \"user\",
              \"content\": \"explain me the TFCC injury and how to rehab.\"
            }
          ],
          \"stream\": true
        }"

2. 使用 python openai 模块访问

注意⚠️:该 API 仅用于测试,有限流。

import openai

# 这里记得修改成自己的 API KEY
openai.api_key = 'qq-group-752372415'
openai.api_base = 'https://external.hdcjh.xyz/gateway/free-proxy/v1'

# 一个调用的小例子
messages = [{"role": "user", "content": "老公,你说句话呀"}]
completion = openai.ChatCompletion.create(
  model="gpt-3.5-turbo",
  messages=messages,
  temperature=0.9,
  max_tokens=1024,
  n=1,
)
response = completion.choices[0]
print(response['message']['content'])

3. 免费的 API Token

点击这里或者搜索加入 QQ 群:752372415

进群加机器人好友后,会自动回复免费的代理 Token,限流为 500 次每周且 100 次每天。

用的舒服的话,不妨点个 star~

代理服务器搭建方法

  1. 搭建 k3s 集群
  2. 安装 cert-manager / prometheus-operator / fluentd / traefik / metrics-server 等基础组件
  3. 配置 traefik 转发规则
  4. 使用 gin 框架写 openai 的转发

Tech overview

There have 3 entities involved in this procedure except gateway(traefik) and openai:

  • Gin-based transmitting server to provide concurrency.
  • Django-based web server to provide developer's efficiency and concurrency insensitive web pages.
  • Redis to store valid tokens and token usage per request.

I only added two middleware in the transmitting procedure.

  1. Token Usage Accounting Middleware calculates prompt / completion token usage, and save it to redis for each request.
  2. Token Validation Middleware check whether token usage in the whitelist, the whitelist is maintained by Django.

Here is some tidbits:

  • COPY req and resp body while transmitting, handle it after response.
  • For validating token, use 2-stage cache, which means check local cache first, and then query redis if not found.

代理服务器搭建方法 (旧方法,单节点,但依然可以用)

原理

使用 Traefik 作为反向代理,把关于 ChatGPT 的请求转发到 openai 即可。

关于代理 Token:

  • 代理 Token 就是在请求 OpenAI 的时候,Traefik 先检测代理 token 是否有效,如果有效则替换为 OpenAI 的 API KEY,最后再转发到 OpenAI。

关于限流:

  • 第一层限流在 Traefik,直接配置插件
  • 第二层限流在代码里,使用 Redis 存储每个代理 Token 在一段时间范围内的请求次数,超过限制则返回错误。
    • 更进一步可以考虑批量获取请求次数,例如限流为 10000/hour,那么就可以每次取 100 个请求次数,等本地的 Redis token 消耗光了以后再重新获取,以提升整体性能。缺点是可能产生限流误差,比如在这个例子中最大的误差就是 10%
    • 更进一步也可以考虑在协程中使用信号去控制请求是否返回,主请求通路和验证同时进行,以降低延迟。缺点是可能会比较费 Token。

前期准备

  • 买一个国外的 VPS 或者白嫖大厂的 VPS
  • 申请免费的 Redis 存储
    • 可以直接去 redis lab 申请,注册就送永久 30MB 免费存储,对于小网站来说 30MB 绝对够用了。
  • 为 VPS 申请域名、证书
    • 直接使用 Cloudflare 托管域名,然后在 Cloudflare 中一键申请,或者也可以去 Let's Encrypt 申请短效证书。
  • 在 VPS 上安装 docker
  • 使用 docker 安装 traefik

配置 Traefik

  1. 创建一个配置文件 /etc/traefik/traefik.yml 记得把里面的 example@mail.com 替换为自己的邮箱,该邮箱将用于 Traefik 自动去 Let's Encrypt 上申请证书。
global:
  checkNewVersion: true
  sendAnonymousUsage: false  # true by default

  # (Optional) Log information
  # ---
  # log:
  #  level: ERROR  # DEBUG, INFO, WARNING, ERROR, CRITICAL
  #   format: common  # common, json, logfmt
  #   filePath: /var/log/traefik/traefik.log

# (Optional) Accesslog
# ---
accessLog:
  format: common  # common, json, logfmt
  filePath: /var/log/traefik/access.log
  bufferingSize: 100

# (Optional) Enable API and Dashboard
# ---
api:
  dashboard: true  # true by default
  insecure: true  # Don't do this in production!

# Entry Points configuration
# ---
entryPoints:
  web:
    address: :80
    # (Optional) Redirect to HTTPS
    # ---
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https

  websecure:
    address: :443

# Configure your CertificateResolver here...
# ---
certificatesResolvers:
  staging:
    acme:
      email: example@mail.com
      storage: /ssl-certs/acme.json
      caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"
      httpChallenge:
        entryPoint: web

  production:
    acme:
      email: example@mail.com
      storage: /ssl-certs/acme.json
      caServer: "https://acme-v02.api.letsencrypt.org/directory"
      httpChallenge:
        entryPoint: web

# (Optional) Overwrite Default Certificates
# tls:
#   stores:
#     default:
#       defaultCertificate:
#         certFile: /etc/traefik/certs/cert.pem
#         keyFile: /etc/traefik/certs/cert-key.pem
# (Optional) Disable TLS version 1.0 and 1.1
#   options:
#     default:
#       minVersion: VersionTLS12

providers:
  docker:
    exposedByDefault: false  # Default is true
  file:
    filename: /etc/traefik/config.yml
    watch: true
  providersThrottleDuration: 10s

experimental:
  hub: true

metrics:
  prometheus:
    addEntryPointsLabels: true
    addServicesLabels: true
    entryPoint: websecure
    addRoutersLabels: true
  1. 创建 Traefik 的动态配置文件 /etc/traefik/config.yml
# official config file example: https://doc.traefik.io/traefik/reference/dynamic-configuration/file/
http:
  routers:
    chatGPT:
      # md5(b'ChatGPT').digest()[:8].hex()
      rule: "Host(`external.hdcjh.xyz`) && PathPrefix(`/62239e6c0f995ae1`)"
      service: chatGPT
      middlewares:
        - chatGPT
      tls:
        certResolver: production
        domains:
          - main: "hdcjh.xyz"
            sans:
              - "*.hdcjh.xyz"
  services:
    chatGPT:
      loadBalancer:
        servers:
          - url: https://api.openai.com
        passHostHeader: false
  middlewares:
    chatGPT:
      stripPrefix:
        # md5(b'ChatGPT').digest()[:8].hex()
        prefixes:
          - "/62239e6c0f995ae1"
        forceSlash: false
  1. 编写 docker compose,用于启动 traefik copy 下面的代码到自己的 docker-compose.yml 文件:
version: '3.9'

services:
  reverse-proxy:
    image: traefik:v2.9
    container_name: traefik
    command:
      - --api.insecure=true
      - --providers.docker=true
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /var/log/access.log:/var/log/access.log
      - /etc/traefik:/etc/traefik
      - traefik-ssl-certs:/ssl-certs

  whoami:
    image: traefik/whoami
    labels:
      - "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"

networks:
  default:
    external:
      name: traefik

volumes:
  traefik-ssl-certs:
    driver: local
  1. 手动添加网络,运行下面的命令即可 docker network create traefik --driver bridge
  2. 启动代理 docker compose up -d
  3. 去 8080 端口查看 traefik 执行情况 例如在我这里就是直接访问 https://external.hdcjh.xyz:8080 这个链接。 可以看到 traefik 反向代理运行良好,然后就可以直接使用啦~

image

常见问题

  • 别人访问了我的 Traefik 面板怎么办?
    • 首先,因为使用了 Cloudflare 代理,第三者不知道服务器的真实 IP ,所以压根就无法访问面板端口。
    • 其次,可以使用 Traefik 的 BasicAuth 中间件实现登录操作,只需要给 traefik 的 container 添加相应的 label 即可。
  • 有人 DDos 攻击我的服务器怎么办?
    • 首先,Cloudflare 可以开启 DDos 防护
    • 其次,Traefik RateLimit 中间件可以实现限流,我这里设置的是每10秒最多100次请求

其他问题请留言,我会一一回答。