ChatGPT

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

浅时光博客 · 1月28日 · 2024年 · · 27453次已读

一、Coze介绍


Coze是字节跳动在海外推出的AI聊天机器人和应用程序编辑开发平台。专为开发下一代AI聊天机器人而设计,该平台允许用户无论是否有编程经验,都能快速创建各种类型的聊天机器人,并轻松部署在不同的社交平台和消息传递应用程序上。

更多功能介绍可以查看Coze的官方文档:https://ww文章来源(Source):https://www.dqzboy.comw.coze.com/docs/zh_cn/welcome.html

Coze官网:https://www.coze.com/

本站交流学习群:QQ交流频道TG交流频道

二、前提要求


  1. 确保您的本地PC能够科学上网,以便访问Coze和Discord
  2. 在部署Coze代理服务器时,确保服务器具备互联网访问权限,以便能够访问Discord的API接口。如果在国内服务器上部署,您可以参考以下文章实现科学上网

国内服务器科学上网并接入ChatGPT:畅享无障碍的智能对话体验

2023-3-23 2
  1. 在服务器上安装Docker和Docker Compose服务,管理和运行coze proxy应用

三、创建Coze Bot


访问Coze官网,然后注册一个Coze账号,目前支持Google账号和手机号注册。说明:中国大陆地区的手机号也可以直接注册使用!

  1. 注册之后进入到Coze页面,然后点击Create Bot创建一个Bot
通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画
  1. 这里填写Bot的资料信息
通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画
通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

四、发布到Discord


1、创建Discord服务器

现在我们需要把Czoe Bot发布到我们的Discord服务器中,首先我们需要拥有一个自己的Discord服务器。

先登入Discord,你可以使用Discord客户端,也可以通过Discord网页端登入你的discord账号来继续下面的操作

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

2、创建Discord应用

这里我需要创建两个Discord应用,应用程序的类型为Bot,一个是与coze bot进行绑定的应用,一个是用来向coze bot发起消息的应用,两个应用创建的步骤流程一致,都按照下面的步骤进行操作即可!确保创建完成之后记住对应应用的token和ID,后续配置coze-discord-proxy时候需要使用到

2.1:创建Discord应用

  • 前往 Discord Developer Portal 并创建应用
  • 在应用页面顶部,点击新建应用。填写应用名称后,即可创建一个新的 Discord 应用。
通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

2.2:获取Token和ID

说明:ID如果忘记了,后面在频道里也可以获取到,但是Token只会展示一次,所以我们要复制保留下来,如果忘记了那就需要重新生成新的Token了

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画
通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

2.3:配置对应的权限

接下来,我们点击OAuth2 —-> URL Generator —-> bot —-> 按照下图勾选相应的权限

请注意,SCOPES 选择应用程序运行所需的范围,选择之后会出现 PERMISSIONS 权限选择,我们按图上进行勾选,页面底部会给你的应用程序生成邀请链接。您需要复制该链接,并在浏览器中访问它以便将应用添加到我们的服务器。

⚠️ 注意:在coze-discord-proxy 3.0及其后续版本中,为了实现会话隔离,机器人需要获得自动创建频道的权限。因此,在配置权限时,必须确保与Coze绑定的Discord机器人以及主动发送消息给Coze Bot的机器人均获得管理员权限。如果你之前已经创建了Discord应用,那么只需找到对应的机器人然后把权限改为Admin,并复制下面的链接重新加入到你的服务器中即可

Discord开发者中心:https://discord.com/developers/applications

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

下面是针对3.0.0版本之前的版本,在3.0.0之前的coze-discord-proxy版本中,您可以按照下面的指示来Discord机器人的权限。对于3.0.0或更高版本,请参照上面提供的截图来调整Discord机器人的权限。

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

2.4:开启Discord权限

注意:这个权限与coze bot进行关联的应用机器人和另外一个主动向coze bot发消息的应用机器人都需开启!!

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

2.5:添加应用到频道

提示:如果Bot给了 Administrator 权限,那么下图中就会有管理员的权限!

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

可以看到我们的应用已经添加到了频道中了,上面创建的这个应用我们是用来与coze bot进行关联的,然后你在按照上面的步骤创建另外一个应用

3、发布Coze Bot

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

五、搭建Coze代理


1、单个机器人接入

现在,我们借用github大佬开源的代理项目,实现通过接口调用被coze托管的discord-bot。目前此项目对于个人使用没问题。coze-discord-proxy项目交流群:TG Group

项目开源地址:https://github.com/deanxv/coze-discord-proxy

服务器ID和频道ID获取

注意:我这里使用的是Discord客户端,非网页端,网页端操作也一样!先确认开启了开发者模式,如果没有开启按照下面进行手动开启。

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画
通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

服务器ID获取 和 频道ID获取,具体操作如下图:

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画
通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

USER_AUTHORIZATION 获取

提示:USER_AUTHORIZATION 获取请使用Discord网页版

F12打开开发者模式,然后在你服务器中的文字频道,通过你的Discord用户(非机器人)在频道中发送一条任意消息,然后按照下图进行操作获取到Authorization对应的值并复制下来,后面需要使用!

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

用户ID获取[4.1.5版本后无需此参数]

鼠标右键获取用户ID并复制

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

创建部署 docker-compose 文件。配置文件中的参数含义请看下面的环境变量中的解释

# 创建存储目录
mkdir -p /data/coze-discord-proxy && cd $_

vim docker-compose.yml

version: '3.4'

services:
  coze-discord-proxy:
    image: deanxv/coze-discord-proxy:latest
    # 如果你的网络环境访问docker hub不稳定的话,可以把上面的镜像地址改为下面的地址进行下载镜像
    #image: dockerproxy.com/deanxv/coze-discord-proxy:latest
    container_name: coze-discord-proxy
    restart: always
    ports:
      - "7077:7077"
    volumes:
      - ./data:/app/coze-discord-proxy/data
    environment:
      - USER_AUTHORIZATION=MTA5OTg5N************uIfytxUgJfmaXUBHVI
      - BOT_TOKEN=MTE5OTk2xxxxxxxxxxxxxxrwUrUWNbG63w
      - GUILD_ID=119xxxxxxxx796
      - COZE_BOT_ID=119xxxxxxxx7
      - CHANNEL_ID=119xxxxxx24
      - PROXY_SECRET=sk-123456
      #- PROXY_URL=http://xx.xx.xx.xx:7890
      - TZ=Asia/Shanghai


# 部署服务
docker-compose up -d

# 检查容器服务运行状况
docker ps
docker logs -f coze-discord-proxy
通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

环境变量

  1. USER_AUTHORIZATION 此处修改为Discord用户的授权密钥(多个请以,分隔)
  2. BOT_TOKEN 此处Toekn为监听对话消息的Discord应用Token
  3. CHANNEL_ID [可选]默认频道-在使用与openai对齐的接口时(/v1/chat/completions) 消息会默认发送到此频道; 3.0.0之后的版本中此参数只是用来确保Coze Bot机器人长时间没有对话的情况下被下线,用来每日凌晨自动执行定时对话任务
  4. GUILD_ID 我们创建的2个Discord Bot机器人所在的服务器ID
  5. COZE_BOT_ID 这个是我们创建的两个Discord Bot其中一个与Coze关联的Bot ID
  6. CHANNEL_AUTO_DEL_TIME:0  [可选]是否启用默认频道[0:否;1:是] (默认为0) 启用后每次对话都会在默认频道中,会话隔离会失效,推荐不设置
  7. ALL_DIALOG_RECORD_ENABLE:0  [可选]是否启用全量上下文[0:否;1:是] (默认为0) 启用后每次对话只会发送messages中最后一个roleusercontent,推荐不使用此环境变量
  8. CHANNEL_AUTO_DEL_TIME:5  [可选]频道自动删除时间(秒) 此参数为每次对话完成后自动删除频道的时间(默认为5s),为0时则不删除,推荐不使用此环境变量
  9. COZE_BOT_STAY_ACTIVE_ENABLE:1  [可选]是否开启每日24点活跃coze-bot的定时任务,默认开启,为0时则不开启,推荐不使用此环境变量
  10. PORT:7077  [可选]端口,默认为7077
  11. PROXY_SECRET [可选]请求头校验的值(前后端统一),配置此参数后,每次发起请求时请求头加上proxy-secret 参数,即header中添加 proxy-secret:key
  12. REQUEST_OUT_TIME:60  [可选]对话接口非流响应下的请求超时时间
  13. STREAM_REQUEST_OUT_TIME:60  [可选]对话接口流响应下的每次流返回超时时间
  14. USER_AGENT:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36  [可选]discord用户端Agent,使用自己的可能有效防止被ban,不设置时默认使用作者的 推荐使用此环境变量
  15. PROXY_URL:http://xx.xx.xx.xx:7890 [可选]如果你服务器访问不了Discord,那么尝试配置代理。

2、配置多个机器人

多个机器人呢,我们只需要创建与Coze Bot进行关联的机器人就可以,主动向Coze Bot发消息的机器人我们上面已经创建了,只需要一个就可以

说明:创建流程跟文章第四节的操作流程其实是一样的,然后创建完成配置权限并把机器人拉到服务器里

  1. 多个机器人创建步骤,参考下图重复创建多个机器人即可。
  1. docker-compose.yml 文件同级目录下创建data/config/bot_config.json文件

目前 coze-discord-proxy v3.0.0之后的版本已经实现对话隔离,下面配置文件中的channelId(频道ID)只是为了实现Bot可以保持活跃

# 例如我这里docker-compose.yml 文件存放在 /data/coze-discord-proxy/
]# cd /data/coze-discord-proxy/
]# mkdir -p data/config/

# 创建 bot_config.json 文件并进行配置
]# vim data/config/bot_config.json
[
  {
    "proxySecret": "sk-123", // 接口请求密钥(PROXY_SECRET,可以理解为API KEY)
    "cozeBotId": "12***************31", // 此处为与Coze Bot进行绑定的Discord机器人的ID
    "model": "gpt-4",        // 对话模型名称(如果是使用的第三方平台,确保这里跟你第三方平台中使用的模型保持一致,注意大小写)
    "channelId": "12***************56"  //  [可选] discord频道ID(机器人必须在此频道所在的服务器)(目前版本下该参数仅用来活跃机器人)
  },
  {
    "proxySecret": "sk-456",
    "cozeBotId": "12***************64",
    "model": "gpt-4-32k", 
    "channelId": "12***************78"
  },
  {
    "proxySecret": "sk-789",
    "cozeBotId": "12***************12",
    "model": "gpt-3.5-turbo",
    "channelId": "12***************24"
  }
]
  1. 配置文件创建好之后,注意修改docker-compose.yml 文件中PROXY_SECRET参数与配置文件中proxySecret值一一对应(标红处)

配置文件中的参数含义请看上文章来源(Source):https://www.dqzboy.com面的环境变量中的解释

vim docker-compose.yml

version: '3.4'

services:
  coze-discord-proxy:
    image: deanxv/coze-discord-proxy:latest
    # 如果你的网络环境访问docker hub不稳定的话,可以把上面的镜像地址改为下面的地址进行下载镜像
    #image: dockerproxy.com/deanxv/coze-discord-proxy:latest
    container_name: coze-discord-proxy
    restart: always
    ports:
      - "7077:7077"
    volumes:
      - ./data:/app/coze-discord-proxy/data
    environment:
      - USER_AUTHORIZATION=MTA5OTg5N************uIfytxUgJfmaXUBHVI
      - BOT_TOKEN=MTE5OTk2xxxxxxxxxxxxxxrwUrUWNbG63w
      - GUILD_ID=119xxxxxxxx796
      - COZE_BOT_ID=119xxxxxxxx7
      - CHANNEL_ID=119xxxxxx24
      - CHANNEL_AUTO_DEL_TIME=0
      - PROXY_SECRET=sk-123,sk-456,sk-789   # [可选]接口密钥-修改此行为请求头校验的值(多个请以,分隔;前后端统一)你可以理解为API KEY
      #- PROXY_URL=http://xx.xx.xx.xx:7890
      - TZ=Asia/Shanghai
  1. 重启coze-discord-proxy容器使其配置加载生效
docker-compose restart

# 查看容器运行日志
docker logs -f coze-discord-proxy
通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

六、接入第三方平台


现在我们可以使用此代理接口来接入第三方web平台,实现openai的接口访问。这里演示的前端项目为chatgpt-web

支持openai标准的APi对话接口、绘图等。注意绘图功能需要在coze bot安装DALLE 3插件,插件安装完成之后最好重新发布一下coze bot。

coze proxy接口地址:http(s)://host:port

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

现在,我们发送个消息进行测试一下,是否可以正常返回会话数据。

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画
通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

接入多个机器人的话,我们需要配置API,第三方平台的API Key就填写proxySecret,参考下图

注意:仔细确认你的配置没问题,对应关系可以查看下图,如果配置错误会出现容器日志显示secret匹配不到有效bot

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

配置好之后,我们可以发起多轮对话进行测试

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

提示:在3.0.0之后的版本中,如果你前端指定了对应的对话模型,那么就会调用你配置了对应model的机器人完成对话,如果你前端配置的model和bot_config.json中配置的model都是一样的,那么效果就如下图一样,是随机调用一个机器人进行对话

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

七、Coze Proxy服务维护


后期coze proxy服务会进行更新、重启等操作,可以使用下面的一个简单脚本实现,方便我们进行维护管理。

~]# vi manage_coze_discord.sh
#!/usr/bin/env bash
# WORKING_DIR:指定docker-compose.yml文件所在的目录
WORKING_DIR="/data/coze-discord-proxy/"
cd "${WORKING_DIR}"
CONTAINER_NAME="coze-discord-proxy"
IMAGE_NAME="deanxv/coze-discord-proxy"
DOCKER_COMPOSE_FILE="docker-compose.yml"
stop_and_remove_container() {
    # 检查容器是否存在并停止并移除
    if docker ps -a --format '{{.Names}}' | grep -Eq "^${CONTAINER_NAME}$"; then
        docker-compose down
    fi
}
remove_none_tags() {
    # 删除标记为<none>的deanxv/coze-discord-proxy镜像
    docker images | grep "^${IMAGE_NAME}.*<none>" | awk '{print $3}' | xargs -r docker rmi
    # 删除所有未使用的deanxv/coze-discord-proxy镜像
    docker images --format '{{.Repository}}:{{.Tag}} {{.ID}}' | grep "^${IMAGE_NAME}" | grep -v "$(docker ps --format '{{.Image}}')" | awk '{print $2}' | xargs -r docker rmi
}
update_image_version() {
    # 提示用户输入新的版本号,并更新docker-compose文件
    read -e -p "请输入更新的版本号并按 Enter 键(eg: v3.2.3): " version_number
    if [[ ! -z "$version_number" ]]; then
        sed -i "s|${IMAGE_NAME}:.*|${IMAGE_NAME}:$version_number|" $DOCKER_COMPOSE_FILE
    else
        echo "输入的版本号为空,未进行更新。"
    fi
}
echo "请选择操作:"
echo "1) 重启"
echo "2) 更新"
echo "3) 新装"
echo "4) 卸载"
read -e -p "输入对应数字并按 Enter 键: " user_choice
case $user_choice in
    1)
        echo "--------------------重启中--------------------"
        docker-compose restart
        ;;
    2)
        echo "--------------------更新中--------------------"
        update_image_version
        docker compose pull
        docker compose up -d --force-recreate
        remove_none_tags
        ;;
    3)
        echo "--------------------新装中--------------------"
        stop_and_remove_container
        docker-compose up -d
        ;;
    4)
        echo "--------------------卸载中--------------------"
        stop_and_remove_container
        docker rmi "${IMAGE_NAME}"
        remove_none_tags
        ;;
    *)
        echo "输入了无效的选择。请重新运行脚本并选择1-4的选项。"
        ;;
esac


# 添加执行权限
~]# chmod +x manage_coze_discord.sh

# 执行脚本
~]# ./manage_coze_discord.sh

八、搭建过程中的问题总结


问题1:第三方平台接入后对话响应超时

问题原因

coze-discord-proxy项目中,系统是通过检测一次对话结束后,Discord机器人是否自动提供了三个建议性问题来判断该次交流是否完结。如果系统检测到有这样的建议问题,它就会认为对话结束了;反之,如果没有检测到,系统就可能会错误地认为对话还在继续。从而导致第三方平台响应超时。

问题解决

解决的方法很简单,在coze bot管理界面找到对应的bot然后将Auto-Suggestion 参数的值回复为默认的Default

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

问题2:容器日志显示secret匹配不到有效bot

问题原因

以上问题主要出现在多机器人的配置中,问题原因主要有以下几种情况:

  1. docker-compose.yml 文件内的 PROXY_SECRET 参数与 bot_config.json 文件中的 proxySecret 没有按照正确的格式相对应。多个secret之间不是使用的英文逗号进行分隔,并且要区分大小写
  2. bot_config.json 文件中的model参数对应的value与你接入的第三方平台中设置的对话模型不一致,所以导致匹配不到bot

问题解决

  1. 在配置多个机器人时,需要确保 docker-compose.yml 文件内的 PROXY_SECRET 参数与 bot_config.json 文件中的 proxySecret 按照正确的格式相对应。多个secret之间用英文逗号分隔,且不能有空格,注意大小写
  2. bot_config.json 文件中的model参数对应的value必须与你接入的第三方平台中设置的对话模型一致,这样才可以正确匹配到bot

问题3:Something wrong occurs, please retry.

问题原因

目前猜测是由于coze官方做了限制,具体是coze封discord用户还是对使用的模型进行限制,目前未知,反正切换模型或者切换discord提问的用户都可以临时恢复。

在discord频道中艾特coze机器人直接返回的提示如下:

通过接口调用Coze托管的discord-bot,实现免费使用GPT4和绘画

问题解决

目前我在出现上面的问题之后,在coze页面中把bot的模型进行了切换之后,重新发布bot解决了上面的问题。比起重新创建discord用户,然后切换discord用户简单一些!


本文作者:浅时光博客
原文链接:https://www.dqzboy.com/16532.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站提供的内容仅限于个人学习和研究使用;禁止将内容用于商业或非法用途。下载后请在24小时内彻底删除,否则后果由用户承担。访问和下载本站内容即表示您已同意上述条款 。

15 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!

  1. zhasdsa广东·深圳2024-2-19 · 16:44

    coze里的plugin,好像不是openai的gpt4和dall.e3,只是名字很像而已

    • 浅时光博客2024-2-19 · 21:13

      本来就不是openai的东西呀

      • zhasdsa广东·深圳2024-2-20 · 13:46

        那你这个文章的标题有点让人误解了

        • 浅时光博客2024-2-20 · 13:48

          Coze 本身后台模型就叫的是GPT4,是你强行与OpenAI的GPT4关联到一块去了

  2. HAHAGEK广东·中山2024-2-3 · 18:40

    再一次,看能不能看到截图,,

  3. HAHAGEK广东·中山2024-2-3 · 18:32

    请教一下大佬,我从NextChat配置好,发出消息后一直都是 “empty response”
    从Discord频道里能代理机器人发出对应的消息,但好像@的格式不对,不能正确@到Coze机器人,这个要怎么解决?
    诸如这样: hello (@的是Coze机器人token)

    • HAHAGEK广东·中山2024-2-3 · 18:37

      天哪,怎么内容被截断,图床也传不上来

      • HAHAGEK广东·中山2024-2-3 · 18:43

        截图:https://1drv.ms/i/s!AolzIF7ATALEiiSG8CutZsDsEvlh?e=ZJ2p8i

        • 浅时光博客2024-2-3 · 20:15

          你配置的有问题呀

        • 浅时光博客2024-2-3 · 20:17
          - BOT_TOKEN=  # 这里填写艾特coze bot的discord的机器人token
          - COZE_BOT_ID=  # 这里是与coze bot绑定的discord的机器人的ID
          
          • HAHAGEK广东·中山2024-2-3 · 22:05

            解决了,感谢指正!!
            反复检查N遍一直觉得没错,直到看到你的COZE_BOT_ID是1开头的我才反应过来写错成Token了人家变量明明写的是ID

  4. HAHAGEK广东·中山2024-2-3 · 18:28

    请教一下大佬,我从NextChat配置好,发出消息后一直都是
    {
    “error”: true,
    “message”: “empty response”
    },

    从Discord频道里能代理机器人发出对应的消息,但好像@的格式不对,不能正确@到Coze机器人,这个要怎么解决?

    诸如这样: hello

  5. EricQ江苏·苏州2024-2-2 · 17:46

    感谢大佬的分享,教程很详细

    • 浅时光博客2024-2-5 · 11:02

      不客气,希望教程可以帮助你