github star 8k:将copilot转为gpt4(学生党免费使用gpt的教程)

图片

使用指南

GitHub Copilot 是一款强大的人工智能编程助手,它可以提供代码建议,帮助开发者更高效地编写代码。然而,它的使用场景并不仅限于代码建议,也可以被转换为聊天机器人。本文将介绍如何使用 copilot-gpt4-service 将 GitHub Copilot 转换为 ChatGPT。

github 项目地址:https://github.com/aaamoon/copilot-gpt4-service/tree/master

image-20240205104521746

前置条件

1.科学上网

2.拥有copilot账号。(学生可申请免费使用)

如何使用

  1. 首先,你需要安装并启动 copilot-gpt4-service 服务。如果你在本地启动,API 默认地址为:http://127.0.0.1:8080。
  2. 接着,你需要获取你的 GitHub 账号的 GitHub Copilot Plugin Token
  3. 最后,你需要安装第三方客户端,例如:ChatGPT-Next-Web。在设置中填入 copilot-gpt4-service 的 API 地址和 GitHub Copilot Plugin Token,即可使用 GPT-4 模型进行对话。

部署方式

copilot-gpt4-service 可以在本地部署,也可以在服务器上部署。经社区验证和讨论,最佳实践方式为:

  • 本地部署,仅个人使用(推荐);
  • 自用服务器集成 ChatGPT-Next-Web 部署,服务不公开;
  • 服务器部署,公开但个人使用 (例如多客户端使用场景 Chatbox, OpenCat APP, ChatX APP)。

需要注意的是,有些部署方式可能会导致 GitHub Copilot 被封禁,例如公共服务的方式提供接口,多个 Token 在同一个 IP 地址进行请求,同客户端 Web(例如 ChatGPT-Next-Web) 以默认 API 以及 API Key 的方式提供公共服务,同一个 Token 请求频率过高,以及使用 Serverless 类型的提供商进行部署。

客户端

使用 copilot-gpt4-service 服务,需要使用第三方客户端,目前已验证支持以下客户端:

  • ChatGPT-Next-Web (推荐)。
  • Chatbox:支持 Windows, Mac, Linux 平台。
  • OpenCat APP:支持 iOS、Mac 平台。
  • ChatX APP :支持 iOS、Mac 平台。

服务端

copilot-gpt4-service 服务的部署方式目前包含Docker 部署二进制启动、Kubernetes 部署、源码启动实现。

服务配置

服务配置可以通过命令行参数或环境变量或环境变量配置文件 config.env 进行。默认服务配置项包括服务监听地址、服务监听端口、是否启用持久化、持久化缓存的路径等。

获取 Copilot Token

首先,你的账号需要开通 GitHub Copilot 服务。获取 GitHub Copilot Plugin Token 的方式有多种,包括通过 Python 脚本获取,通过安装 GitHub Copilot CLI 授权获取,以及通过第三方接口授权获取。

常见问题

copilot-gpt4-service 支持 GPT-4 和 GPT-3.5-turbo 模型。如果使用的 GitHub Copilot Plugin Token 过期了或者错误,HTTP 响应状态码会是 401。如果使用的账号没有开通 GitHub Copilot,HTTP 响应状态码会是 403。

总的来说,copilot-gpt4-service 是一款强大的工具,它可以将 GitHub Copilot 转换为 ChatGPT,为开发者提供更多的可能性。

图片

最简单的部署方法

经过几天的探索,摸索出较为简单的部署方法。主要有三个步骤。

第一步 部署服务器

服务端使用二进制的形式,也就是直接打开一个专有的exe文件。

下载地址是:https://github.com/aaamoon/copilot-gpt4-service/actions/runs/7573320201

image-20240205104521746

我的电脑是 win10,64位,所以就下载上图中的红色线框的exe文件。

下载后,双击运行该文件。

在浏览器中 输入:http://127.0.0.1:8080/

显示下图则表示服务器端部署完成。

image-20240205104724089

第二步 找到token

  1. 运行以下代码获取你的copilot token:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*- 
    # @Time : 2024/2/5 22:28
    # @File : get_copilot_id.py
    # !/usr/bin/env python3
    
    PROXY = {'http': 'socks5h://127.0.0.1:7890',
               'https': 'socks5h://127.0.0.1:7890'
               }
    import time
    import typing
    from enum import Enum
    import sys
    import os
    import re
    
    try:
        import requests
    except ImportError:
        print("requests is not installed, please install it by running `pip install requests`")
        sys.exit(1)
    
    import requests
    
    
    class LoginError(Enum):
        AUTH_PENDING = 1
        EXPIRED_TOKEN = 2
        NETWORK_ERROR = 3
        OTHER_ERROR = 4
    
    
    HEADERS = {
        "accept": "application/json",
        "content-type": "application/json",
    }
    
    
    def getLoginInfo(proxy=None) -> (LoginError, typing.Union[dict, Exception]):
        url = "https://github.com/login/device/code"
        body = {
            "client_id": "Iv1.b507a08c87ecfe98",
            "scope": "read:user"
        }
    
        try:
            resp = requests.post(url, headers=HEADERS, json=body, proxies=proxy, timeout=10)
        except requests.exceptions.ConnectionError:
            return LoginError.NETWORK_ERROR, None
        except Exception as e:
            return LoginError.OTHER_ERROR, e
        return None, resp.json()
    
    
    def pollAuth(device_code: str, proxy=None) -> (LoginError, str):
        url = "https://github.com/login/oauth/access_token"
        body = {
            "client_id": "Iv1.b507a08c87ecfe98",  # client_id of gh copilot
            "device_code": device_code,
            "grant_type": "urn:ietf:params:oauth:grant-type:device_code"
        }
    
        try:
            resp = requests.post(url, headers=HEADERS, json=body, proxies=proxy, timeout=10)
        except requests.exceptions.ConnectionError:
            return LoginError.NETWORK_ERROR, None
        except Exception as e:
            return LoginError.OTHER_ERROR, e
    
        data = resp.json()
    
        if data.get("error") == "authorization_pending":
            return LoginError.AUTH_PENDING, None
        if data.get("error") == "expired_token":
            return LoginError.EXPIRED_TOKEN, None
        elif "access_token" in data:
            return None, data["access_token"]
        else:
            return LoginError.OTHER_ERROR, data
    
    
    def getToken(proxy=None) -> (LoginError, str):
        # get login info
        err, login_info = getLoginInfo(proxy)
        if err is not None:
            if err == LoginError.NETWORK_ERROR:
                print("network error, please check your network.")
            elif err == LoginError.OTHER_ERROR:
                print("unknown error occurred when getting login info.")
                print("error message:", login_info)
            return err, None
    
        interval = login_info['interval']
        print(f"Please open {login_info['verification_uri']} in browser and enter {login_info['user_code']} to login.")
        # poll for auth status
        while True:
            err, access_token = pollAuth(login_info['device_code'], proxy)
            if err is None:
                return None, access_token
            elif err == LoginError.AUTH_PENDING:
                pass
            elif err == LoginError.EXPIRED_TOKEN:
                print("session expired, please try again.")
                return err, None
            elif err == LoginError.NETWORK_ERROR:
                print("network error, please check your network.")
                return err, None
            elif err == LoginError.OTHER_ERROR:
                print("unknown error occurred when pulling auth info.")
                print("error message:", access_token)
                return err, None
            time.sleep(interval)
    
    
    if __name__ == "__main__":
        for k, v in PROXY.items():
            if v == "":
                PROXY[k] = os.getenv(f"{k}_proxy".upper()) or os.getenv(f"{k}_proxy".lower()) or ""
                if re.match(r"^.+://.+$", PROXY[k]) is None and PROXY[k] != "":
                    PROXY[k] = "http://" + PROXY[k]
        err, token = getToken(PROXY)
        if err is None:
            print("Your token is:")
            print(token)

    如果以上代码不管用,此外,还有一个苯办法是:安装vscode,在vscode中安装copilot服务。

    image-20240205105107011

安装好后,会提示你需要网页授权。在浏览器中通过github授权copilot给vscode。从本地文件中找到copilot token

路径在:C:\Users\你的用户名\AppData\Local\github-copilot中的hosts.json

image-20240205110700671

打开后是这样的:

image-20240205110813030

红色线框中的就是我们要寻找的token,这串token要复制一下,待会要用。

第二步 客户端

客户端,我选择的是官方推荐的ChatGPT-Next-Web

安装后,双击运行该软件。点击设置,去设置服务器地址和token就可以用chat-gpt4了。

image-20240205111340404

服务器地址填写:http://127.0.0.1:8080/

API Key 填写第二步中的找到的token

至此,大功告成。

image-20240205111605452