在Cloudflare Workers上部署Telegram ChatGPT机器人

最简单快捷部署属于自己的ChatGPT Telegram机器人的方法。使用Cloudflare Workers,单文件,直接复制粘贴一把梭,无需任何依赖,无需配置本地开发环境,不用域名,免服务器。 可以自定义系统初始化信息,让你调试好的性格永远不消失。

  • 无服务器部署
  • 支持多个Telegram机器人
  • 支持多个OpenAI密钥
  • 支持Azure OpenAI服务
  • 支持Cloudflare AI(免费)
  • 支持流式输出
  • 支持自定义角色
  • 支持多平台部署

https://github.com/TBXark/ChatGPT-Telegram-Workers/tree/master

部署流程

手动部署

一. 新建Telegram机器人, 获得Token

在Cloudflare Workers上部署Telegram ChatGPT机器人

  1. 打开Telegram并向 BotFather 发送 /start 命令
  2. 发送 /newbot 命令,并给你的机器人起一个名字
  3. 给你的机器人取一个唯一的用户名以_bot结尾
  4. BotFather 会生成一个 Token,复制下来保存好,这个 Token 是和你的机器人绑定的密钥,不要泄露给他人!
  5. 稍后再Cloudflare Workers 的设置里 将这个 Token 填入 TELEGRAM_TOKEN 变量中

二. 注册OpenAI账号并创建API Key

image

  1. 打开 OpenAI 注册账号
  2. 点击右上角的头像,进入个人设置页面
  3. 点击 API Keys,创建一个新的 API Key
  4. 稍后再Cloudflare Workers 的设置里 将这个 Token 填入 API_KEY 变量中

三. 部署Workers

image

  1. 打开 Cloudflare Workers 注册账号
  2. 点击右上角的 Create a Service
  3. 进入新建的workers, 选择Quick Edit, 将../dist/index.js代码复制到编辑器中,保存

四. 配置环境变量

image

  1. 打开 Cloudflare Workers 点击你的Workers,点击右上角的 Setting -> Variables
  2. API_KEY:设置成 OpenAI API Key
  3. TELEGRAM_AVAILABLE_TOKENS:设置成 Telegram Bot Token
  4. CHAT_WHITE_LIST:设置成允许访问的用户的ID,例如123456789,987654321,不知道自己ID可以在和你创建的的机器人聊天中使用/new指令获取
  5. I_AM_A_GENEROUS_PERSON: 如果还是没有弄懂怎么获取ID,可以设置这个值为true,这样就关闭白名单功能,允许所有人访问。

五. 绑定KV数据

  1. 首页-Workers-KV, 点击右上角的 Create a Namespace, 名字随便取, 但是绑定的时候必须设定为DATABASE
    image
  2. 打开 Cloudflare Workers 点击你的Workers
  3. 点击右上角的 Setting -> Variables
    image
  4. 在 KV Namespace Bindings 中点击 Edit variables
  5. 点击 Add variable
  6. 设置名字为DATABASE 并选择刚刚创建的KV数据

六. 初始化

  1. 运行 https://workers_name.username.workers.dev/init 自动绑定telegram的webhook和设定所有指令

七. 开始聊天

image

  1. 开始新对话,使用/new指令开始,之后每次都会将聊天上下文发送到ChatGPT
  2. 使用/setenv KEY=VALUE指令修改用户配置,例如SETENV SYSTEM_INIT_MESSAGE=现在开始是喵娘,每句话已喵结尾
  3. 因为每次对话都会把所有历史记录带上,容易达到4096的token限制,所以没事的时候/new一下,清理一下历史记录

自动部署

  1. 手动部署的一, 二, 三 步骤
  2. mv wrangler-example.toml wrangler.toml, 然后修改相应配置
  3. npm install
  4. npm run deploy

 

配置

推荐在Workers配置界面填写环境变量, 而不是直接修改js代码中的变量

KV配置

KEY 特殊说明
DATABASE 先新建KV,新建的时候名字随意,然后绑定的时候必须设定为DATABASE

系统配置

为每个用户通用的配置,通常在workers配置界面填写

KEY 说明 默认值 特殊说明
AI_PROVIDER AI提供商 auto AI提供商: auto, azure, openai, workers; auto为自动选择一个有效的配置,判断优先级为 azure > openai > workers
API_KEY OpenAI API Key null 可以同时使用多个key,使用的时候会随机选择一个
CHAT_MODEL open ai 模型选择 gpt-3.5-turbo
TELEGRAM_AVAILABLE_TOKENS 支持多个Telegram Bot Token null 多个Token用,分隔
CHAT_WHITE_LIST 聊天ID白名单 null 多个ID用,分隔,不知道ID,和机器人聊一句就能返回
I_AM_A_GENEROUS_PERSON 关闭白名单,允许所有人访问 false 鉴于很多人不想设置白名单,或者不知道怎么获取ID,所以设置这个选项就能允许所有人访问, 值为true时生效
LOCK_USER_CONFIG_KEYS 锁定自定义用户配置 [] 可以锁定某些字段。比如设置为CHAT_MODEL就可以防止其他用户通过/setenv指令切换模型,多个字段用,分隔
AUTO_TRIM_HISTORY 自动清理历史记录 true 为了避免4096字符限制,将消息删减
MAX_HISTORY_LENGTH 最大历史记录长度 20 AUTO_TRIM_HISTORY开启后 为了避免4096字符限制,将消息删减
MAX_TOKEN_LENGTH 最大历史token数量 2048 过长容易超时建议设定在一个合适的数字
GPT3_TOKENS_COUNT GTP计数模式 false 使用更加精准的token计数模式替代单纯判断字符串长度,但是容易超时
SYSTEM_INIT_MESSAGE 系统初始化信息 你是一个得力的助手 默认机器人设定
SYSTEM_INIT_MESSAGE_ROLE 系统初始化信息角色 system 默认机器人设定
ENABLE_USAGE_STATISTICS 开启使用统计 false 开启后,每次调用API都会记录到KV,可以通过/usage查看
HIDE_COMMAND_BUTTONS 隐藏指令按钮 null 把想要隐藏的按钮写入用逗号分开/start,/system, 记得带上斜杠,修改之后得重新init
SHOW_REPLY_BUTTON 显示快捷回复按钮 false 显示快捷回复按钮
UPDATE_BRANCH 分支 master 版本检测所在分支
DEBUG_MODE 调试模式 false 目前可以把最新一条消息保存到KV方便调试,非常消耗KV写入量,正式环境务必关闭
DEV_MODE 开发模式 false 开发测试用
STREAM_MODE 流模式 true 得到类似ChatGPT Web一样的打字机输出模式
SAFE_MODE 安全模式 true 安全模式,会增加KV写损耗,但是能避免Workers超时导致的Telegram死亡循环重试,减少Token的浪费,不建议关闭。
LANGUAGE 语言 zh-CN zh-CNzh-TWen
TELEGRAM_API_DOMAIN Telegram https://api.telegram.org 可以自定义Telegram服务器
OPENAI_API_DOMAIN OpenAI https://api.openai.com 可以替换为其他与OpenAI API兼容的其他服务商的域名
AZURE_API_KEY azure api key null 支持azure的API,两个密钥随便选一个就可以。如果你要默认使用azure,你可以设置AI_PROVIDERazure
AZURE_COMPLETIONS_API azure api url null 格式https://YOUR_RESOURCE_NAME.openai.azure.com/openai/deployments/YOUR_DEPLOYMENT_NAME/chat/completions?api-version=2023-05-15
CLOUDFLARE_ACCOUNT_ID Cloudflare 的 用户ID null 你可以在workers首页的右侧信息栏中找到这个信息。如果你要默认使用workers ai,你可以设置AI_PROVIDERworkers
CLOUDFLARE_TOKEN Cloudflare的Token null 你可以在https://dash.cloudflare.com/profile/api-tokens中使用Workers AI (Beta)模板创建
WORKERS_CHAT_MODEL 文字生成模型 @cf/meta/llama-2-7b-chat-fp16 具体模型列表可以查看https://developers.cloudflare.com/workers-ai/models/llm/
WORKERS_IMAGE_MODEL 文字生成图片模型 @cf/stabilityai/stable-diffusion-xl-base-1.0 同上
DALL_E_MODEL 生成图像的模型 dall-e-2 支持 dall-e-2 和 dall-e-3
DALL_E_IMAGE_SIZE 生成图像的尺寸 512x512 生成图像的尺寸。对于 dall-e-2,必须是256×256、512×512或1024×1024之一。对于 dall-e-3 模型,必须是1024×1024、1792×1024或1024×1792之一。
DALL_E_IMAGE_QUALITY 生成图像的质量 standard 将要生成的图片质量。hd会创建具有更精细细节和整体一致性的图片。此参数仅支持dall-e-3.
DALL_E_IMAGE_STYLE 生成图像的风格 vivid 生成图像的风格。必须是 vivid 或 natural 中的一个。vivid使模型倾向于产生超现实和戏剧化的图片。natural使模型产生更自然、不那么超现实外观的图片。此参数仅支持dall-e-3.

群组配置

可以把机器人加到群组中,然后群组里的所有人都可以和机器人聊天。

BREAKING CHANGE: 重大改动,必须把群ID加到白名单CHAT_GROUP_WHITE_LIST才能使用, 否则任何人都可以把你的机器人加到群组中,然后消耗你的配额。

IMPORTANT:受限TG的隐私安全策略,如果你的群组是公开群组或超过2000人,请将机器人设置为管理员,否则机器人无法响应@机器人的聊天消息。

IMPORTANT:必须在botfather中设置/setprivacyDisable,否则机器人无法响应@机器人的聊天消息。

KEY 说明 默认值 特殊说明
GROUP_CHAT_BOT_ENABLE 开启群组机器人 true 开启后,机器人加入群组后,然后群组里的所有人都可以和机器人聊天。
TELEGRAM_BOT_NAME 机器人名字 xxx_bot null 顺序必须和TELEGRAM_AVAILABLE_TOKENS 一致, 必须设置否则无法在群聊中使用
GROUP_CHAT_BOT_SHARE_MODE 群组机器人共享历史记录 false 开启后,一个群组只有一个会话和配置。关闭的话群组的每个人都有自己的会话上下文。
CHAT_GROUP_WHITE_LIST 群组聊天ID白名单 null 多个ID用,分隔,不知道ID,在群组中和机器人聊一句就能返回

用户配置

每个用户的自定义配置,只能通过Telegram发送消息来修改,消息格式为/setenv KEY=VALUE, 用户配置的优先级比系统配置的更高。如果想删除配置,请使用/delenv KEY。 批量设置变量请使用/setenvs {"KEY1": "VALUE1", "KEY2": "VALUE2"}

KEY 说明
AI_PROVIDER 配置与ENV相同
CHAT_MODEL 配置与ENV相同
OPENAI_API_KEY 设置该值之后将不会调用系统配置的KEY
OPENAI_API_EXTRA_PARAMS OpenAI API额外参数,设定后每次调用API都会带上,可以用来调整温度等参数, /setenv OPENAI_API_EXTRA_PARAMS={"temperature": 0.5} 每次修改必须为完整JSON
SYSTEM_INIT_MESSAGE 配置与ENV相同
DALL_E_MODEL 配置与ENV相同
DALL_E_IMAGE_SIZE 配置与ENV相同
DALL_E_IMAGE_QUALITY 配置与ENV相同
DALL_E_IMAGE_STYLE 配置与ENV相同
AZURE_API_KEY 配置与ENV相同
AZURE_COMPLETIONS_API 配置与ENV相同
WORKERS_CHAT_MODEL 配置与ENV相同
WORKER_IMAGE_MODEL 配置与ENV相同

支持命令

命令 说明 示例
/help 获取命令帮助 /help
/new 发起新的对话 /new
/start 获取你的ID,并发起新的对话 /start
/img 生成一张图片 /img 图片描述
/version 获取当前版本号,判断是否需要更新 /version
/setenv 设置用户配置, 详情见用户配置 /setenv KEY=VALUE
/setenvs 批量设置用户配置, 详情见用户配置 /setenvs {"KEY1": "VALUE1", "KEY2": "VALUE2"}
/delenv 删除用户配置 /delenv KEY
/usage 获取当前机器人的用量统计 /usage
/system 查看当前一些系统信息 /system
/role 设置预设的身份, 配置使用方法同/setenv /role
/redo 修改上一个提问或者换一个回答 /redo 修改过的内容 或者 /redo
/echo 回显消息,仅开发模式可用 /echo

自定义命令

除了上述系统定义的指令,你也可以自定义快捷指令, 可以将某些较长的指令简化为一个单词的指令。

自定义指令使用环境变量设置 CUSTOM_COMMAND_XXX,其中XXX为指令名,比如CUSTOM_COMMAND_azure,值为指令内容,比如/setenvs {"AI_PROVIDER": "azure"}。 这样就可以使用/azure来代替/setenvs {"AI_PROVIDER": "azure"}实现快速切换AI提供商。

下面是一些自定义指令例子

指令
CUSTOM_COMMAND_azure /setenvs {"AI_PROVIDER": "azure"}
CUSTOM_COMMAND_workers /setenvs {"AI_PROVIDER": "workers"}
CUSTOM_COMMAND_gpt3 /setenvs {"AI_PROVIDER": "openai", "CHAT_MODEL": "gpt-3.5-turbo"}
CUSTOM_COMMAND_gpt4 /setenvs {"AI_PROVIDER": "openai", "CHAT_MODEL": "gpt-4"}

如果你是用toml进行配置,可以使用下面的方式:

CUSTOM_COMMAND_azure= '/setenvs {"AI_PROVIDER": "azure"}'
CUSTOM_COMMAND_workers = '/setenvs {"AI_PROVIDER": "workers"}'
CUSTOM_COMMAND_gpt3 = '/setenvs {"AI_PROVIDER": "openai", "CHAT_MODEL": "gpt-3.5-turbo"}'
CUSTOM_COMMAND_gpt4 = '/setenvs {"AI_PROVIDER": "openai", "CHAT_MODEL": "gpt-4"}'

 

Free ChatGPT 免费的ChatGPT镜像站点列表 - 摸鱼时间