目录
本项目可以助你将GPT机器人集成到钉钉群聊当中。当前默认模型为 gpt-3.5。
🥳 欢迎关注我的其他开源项目:
- Go-Ldap-Admin:🌉 基于Go+Vue实现的openLDAP后台管理项目。
- learning-weekly:📝 周刊内容以运维技术和Go语言周边为主,辅以GitHub上优秀项目或他人优秀经验。
- HowToStartOpenSource:🌈 GitHub开源项目维护协同指南。
- read-list:📖 优质内容订阅,阅读方为根本
- awesome-github-profile-readme-chinese:🦩 优秀的中文区个人主页搜集
🚜 我还创建了一个项目awesome-chatgpt-answer:记录那些问得好,答得妙的时刻,欢迎提交你与ChatGPT交互过程中遇到的那些精妙对话。
⚗️ openai官方提供了一个状态页来呈现当前openAI服务的状态,同时如果有问题发布公告也会在这个页面,如果你感觉它有问题了,可以在这个页面看看。
- 🚀 帮助菜单:通过发送
帮助
将看到帮助列表,🖼 查看示例 - 🥷 私聊:支持与机器人单独私聊(无需艾特),🖼 查看示例
- 💬 群聊:支持在群里艾特机器人进行对话
- 🙋 单聊模式:每次对话都是一次新的对话,没有历史聊天上下文联系
- 🗣 串聊模式:带上下文理解的对话模式
- 🎨 图片生成:通过发送
#图片
关键字开头的内容进行生成图片,🖼 查看示例 - 🎭 角色扮演:支持场景模式,通过
#周报
的方式触发内置prompt模板 🖼 查看示例 - 🧑💻 频率限制:通过配置指定,自定义单个用户单日最大对话次数
- 💵 余额查询:通过发送
余额
关键字查询当前key所剩额度,🖼 查看示例 - 🔗 自定义api域名:通过配置指定,解决国内服务器无法直接访问openai的问题
- 🪜 添加代理:通过配置指定,通过给应用注入代理解决国内服务器无法访问的问题
- 👐 默认模式:支持自定义默认的聊天模式,通过配置化指定
钉钉群内的机器人有一个outgoing模式,当你创建机器人的时候,可以选择启用这个模式,然后直接配置回调地址,免去在管理后台创建应用的步骤,就可以直接投入使用。
官方文档:自定义机器人接入
但是这个模式貌似是部分开放的(目前来看貌似是部分人有创建这个类型的白名单),所以如果你在钉钉群聊中添加自定义机器人
的时候,看到和我一样的信息,则说明无法使用这种方式:
📢 注意
- 如果你的和我一样,那么就只能放弃这种方案,往下看第二种对接方案。
- 如果使用这种方案,那么就不能与机器人私聊对话,只能局限在群聊当中艾特机器人聊天。
- 如果使用这种方案,则在群聊当中并不能达到真正的艾特发消息人的效果,因为这种机器人回调过来的关键信息为空。
创建步骤参考文档:企业内部开发机器人,或者根据如下步骤进行配置。
-
📢 注意1:
可能现在创建机器人的时候名字为chatgpt
会被钉钉限制,请用其他名字命名。📢 注意2:
第四步骤点击创建应用的时候,务必选择使用旧版,从而创建旧版机器人。步骤比较简单,这里就不赘述了。
-
创建完毕之后,点击机器人开发管理,然后配置将要部署的服务所在服务器的出口IP,以及将要给服务配置的域名。
如果提示:
消息接收地址校验失败(请确保公网可访问该地址,如无有效SSL证书,可选择禁用证书校验),那么可以先输入一个https://
,然后就能看到禁用https
的选项了,选择禁用,然后再把地址改成http
就好了。
你可以使用docker快速运行本项目。
第一种:基于环境变量运行
# 运行项目
$ docker run -itd --name chatgpt -p 8090:8090 --add-host="host.docker.internal:host-gateway" -e APIKEY=换成你的key -e BASE_URL="" -e MODEL="gpt-3.5-turbo" -e SESSION_TIMEOUT=600 -e HTTP_PROXY="http://host.docker.internal:15732" -e DEFAULT_MODE="单聊" -e MAX_REQUEST=0 -e PORT=8090 -e SERVICE_URL="你当前服务外网可访问的URL" --restart=always dockerproxy.com/eryajf/chatgpt-dingtalk:latest
📢 注意:
如果使用docker部署,那么PORT参数不需要进行任何调整。
📢 注意:
如果服务器节点本身就在国外或者自定义了BASE_URL
,那么就把HTTP_PROXY
参数留空即可。
📢 注意:
如果使用docker部署,那么proxy地址可以直接使用如上方式部署,host.docker.internal
会指向容器所在宿主机的IP,只需要更改端口为你的代理端口即可。参见:Docker容器如何优雅地访问宿主机网络
运行命令中映射的配置文件参考下边的配置文件说明。
第二种:基于配置文件挂载运行
# 复制配置文件,根据自己实际情况,调整配置里的内容
$ cp config.dev.json config.json # 其中 config.dev.json 从项目的根目录获取
# 运行项目
$ docker run -itd --name chatgpt -p 8090:8090 -v `pwd`/config.json:/app/config.json --restart=always dockerproxy.com/eryajf/chatgpt-dingtalk:latest
其中配置文件参考下边的配置文件说明。
第三种:使用 docker compose 运行
$ wget https://raw.githubusercontent.com/eryajf/chatgpt-dingtalk/main/docker-compose.yml
$ nano docker-compose.yml # 编辑 APIKEY 等信息
$ docker compose up -d
注意,不论通过上边哪种docker方式部署,都需要配置Nginx代理,当然你直接通过服务器外网IP也可以。
部署完成之后,通过Nginx代理本服务:
server {
listen 80;
server_name chat.eryajf.net;
client_header_timeout 120s;
client_body_timeout 120s;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://localhost:8090;
}
}
部署完成之后,就可以在群里艾特机器人进行体验了。
Nginx配置完毕之后,可以先手动请求一下,通过服务日志输出判断服务是否正常可用:
$ curl --location --request POST 'http://chat.eryajf.net/' \
--header 'Content-type: application/json' \
--data-raw '{
"conversationId": "xxx",
"atUsers": [
{
"dingtalkId": "xxx",
"staffId":"xxx"
}
],
"chatbotCorpId": "dinge8a565xxxx",
"chatbotUserId": "$:LWCP_v1:$Cxxxxx",
"msgId": "msg0xxxxx",
"senderNick": "eryajf",
"isAdmin": true,
"senderStaffId": "user123",
"sessionWebhookExpiredTime": 1613635652738,
"createAt": 1613630252678,
"senderCorpId": "dinge8a565xxxx",
"conversationType": "2",
"senderId": "$:LWCP_v1:$Ff09GIxxxxx",
"conversationTitle": "机器人测试-TEST",
"isInAtList": true,
"sessionWebhook": "https://oapi.dingtalk.com/robot/sendBySession?session=xxxxx",
"text": {
"content": " 你好"
},
"msgtype": "text"
}'
如果手动请求没有问题,那么就可以在钉钉群里与机器人进行对话了。
如果你想通过命令行直接部署,可以直接下载release中的压缩包 ,请根据自己系统以及架构选择合适的压缩包,下载之后直接解压运行。
下载之后,在本地解压,即可看到可执行程序,与配置文件:
$ tar xf chatgpt-dingtalk-v0.0.4-darwin-arm64.tar.gz
$ cd chatgpt-dingtalk-v0.0.4-darwin-arm64
$ cp config.dev.json config.json # 然后根据情况调整配置文件内容,宿主机如遇端口冲突,可通过调整config.json中的port参数自定义服务端口
$ ./chatgpt-dingtalk # 直接运行
# 如果要守护在后台运行
$ nohup ./chatgpt-dingtalk &> run.log &
$ tail -f run.log
2023-03-08
补充,我发现也可以不在群里艾特机器人聊天,还可点击机器人,然后点击发消息,通过与机器人直接对话进行聊天:
由 @Raytow 同学发现,在机器人自动生成的测试群里无法直接私聊机器人,在其他群里单独添加这个机器人,然后再点击就可以跟它私聊了。
艾特机器人发送空内容或者帮助,会返回帮助列表。
发送指定关键字,可以切换不同的模式。
📢 注意:串聊模式下,群里每个人的聊天上下文是独立的。 📢 注意:默认对话模式为单聊,因此不必发送单聊即可进入单聊模式,而要进入串聊,则需要发送串聊关键字进行切换,当串聊内容超过最大限制的时候,你可以发送重置,然后再次进入串聊模式。
艾特机器人发送
余额
二字,会返回当前key对应的账号的剩余额度以及可用日期。
发送模板两个字,会返回当前内置支持的prompt列表。
如果你发现有比较优秀的prompt,欢迎PR。注意:一些与钉钉使用场景不是很匹配的,就不要提交了。
发送以
#图片
开头的内容,将会触发绘画能力,图片生成之后,将会保存在程序根目录下的images目录
下。如果你绘图没有思路,可以在这里 https://www.clickprompt.org/zh-CN/以及这里 https://lexica.art/找到一些不错的prompt。
# 获取项目
$ git clone https://github.com/eryajf/chatgpt-dingtalk.git
# 进入项目目录
$ cd chatgpt-dingtalk
# 复制配置文件,根据个人实际情况进行配置
$ cp config.dev.json config.json
# 启动项目
$ go run main.go
{
"api_key": "xxxxxxxxx", // openai api_key
"base_url": "api.openai.com", // 如果你想指定请求url的地址,可通过这个参数进行配置,默认为官方地址,不需要再添加 /v1
"model": "gpt-3.5-turbo", // 指定模型,默认为 gpt-3.5-turbo , 可选参数有: "gpt-4-32k-0314", "gpt-4-32k", "gpt-4-0314", "gpt-4", "gpt-3.5-turbo-0301", "gpt-3.5-turbo", "text-davinci-003", "text-davinci-002", "text-curie-001", "text-babbage-001", "text-ada-001", "text-davinci-001", "davinci-instruct-beta", "davinci", "curie-instruct-beta", "curie", "ada", "babbage"
"session_timeout": 600, // 会话超时时间,默认600秒,在会话时间内所有发送给机器人的信息会作为上下文
"http_proxy": "", // 指定请求时使用的代理,如果为空,则不使用代理
"default_mode": "单聊", // 默认对话模式,可根据实际场景自定义,如果不设置,默认为单聊
"max_request": 0, // 单人单日请求次数限制,默认为0,即不限制
"port": "8090", // 指定服务启动端口,默认为 8090,一般在二进制宿主机部署时,遇到端口冲突时使用。
"service_url": "" // 指定服务的地址,就是当前服务可供外网访问的地址,用于生成图片时给钉钉渲染
}
如何更好地使用ChatGPT:这里有许多案例可供参考。
🗣 重要重要
一些常见的问题,我单独开issue放在这里:👉点我👈,可以查看这里辅助你解决问题,如果里边没有,请对历史issue进行搜索(不要提交重复的issue),也欢迎大家补充。
本项目曾在 | 2022-12-12 | 2022-12-18 | 2022-12-19 | 2022-12-20 | 2023-02-09 | 2023-02-10 | 2023-02-11 | 2023-02-12 | 2023-02-13 | 2023-02-14 | 2023-02-15 | 2023-03-04 | 2023-03-05 | 2023-03-19 | 2023-03-22, 这些天里,登上GitHub Trending。而且还在持续登榜中,可见最近openai的热度。
这个项目能够成立,离不开这些开源项目:
- go-resty/resty
- patrickmn/go-cache
- solywsh/chatgpt
- xgfone/ship
- avast/retry-go
- sashabaranov/go-openapi
如果觉得这个项目对你有帮助,你可以请作者喝杯咖啡 ☕️