ChatGPT DingTalk
? 基於GO語言實現的釘釘集成ChatGPT機器人?

目錄
本項目可以助你將GPT 機器人集成到釘釘群聊當中。當前默認模型為gpt-3.5 ,支持gpt-4以及gpt-4o-mini 。同時支持Azure-OpenAI。
? 注意:當下部署以及配置流程都已非常成熟,文檔和issue 中基本都覆蓋到了,因此不再回答任何項目安裝部署與配置使用上的問題,如果完全不懂,可考慮通過郵箱聯繫我進行付費的技術支持。
? 注意:這個項目所有的功能,都匯聚在使用指南中,請務必仔細閱讀,以體驗其完整精髓。
?歡迎關注我的其他開源項目:
- 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 服務的狀態,同時如果有問題發佈公告也會在這個頁面,如果你感覺它有問題了,可以在這個頁面看看。
贊助商
302.AI 是一個按需付費的一站式AI應用平台,開放平台,開源生態。
- 點擊註冊: 立即獲得1PTC(1PTC=1 美金,約為7 人民幣)代幣。
- 集合了最新最全的AI模型和品牌,包括但不限於語言模型、圖像模型、聲音模型、視頻模型。
- 在基礎模型上進行深度應用開發,做到讓小白用戶都可以零門檻上手使用,無需學習成本。
- 零月費,所有功能按需付費,全面開放,做到真正的門檻低,上限高。
- 創新的使用模式,管理和使用分離,面向團隊和中小企業,一人管理,多人使用。
- 所有AI能力均提供API接入,所有應用開源支持自行定制(進行中)。
- 強大的開發團隊,每週推出2-3個新應用,平台功能每日更新。
帮助將看到幫助列表,? 查看示例#图片關鍵字開頭的內容進行生成圖片,? 查看示例#周报的方式觸發內置prompt 模板? 查看示例余额關鍵字查詢當前key 所剩額度,? 查看示例#查对话username:xxx查詢xxx 的對話歷史,可在線預覽,可下載到本地api_key ,註冊相關事項可以參考此文章。訪問這裡,申請個人秘鑰。推薦你使用docker 快速運行本項目。
第一种:基于环境变量运行
# 运行项目
$ docker run -itd --name chatgpt -p 8090:8090
-v ./data:/app/data --add-host="host.docker.internal:host-gateway"
-e LOG_LEVEL="info" -e APIKEY=换成你的key -e BASE_URL=""
-e MODEL="gpt-3.5-turbo" -e SESSION_TIMEOUT=600
-e MAX_QUESTION_LENL=2048 -e MAX_ANSWER_LEN=2048 -e MAX_TEXT=4096
-e HTTP_PROXY="http://host.docker.internal:15732"
-e DEFAULT_MODE="单聊" -e MAX_REQUEST=0 -e PORT=8090
-e SERVICE_URL="你当前服务外网可访问的URL" -e CHAT_TYPE="0"
-e ALLOW_GROUPS=a,b -e ALLOW_OUTGOING_GROUPS=a,b -e ALLOW_USERS=a,b -e DENY_USERS=a,b -e VIP_USERS=a,b -e ADMIN_USERS=a,b -e APP_SECRETS="xxx,yyy"
-e SENSITIVE_WORDS="aa,bb" -e RUN_MODE="http"
-e AZURE_ON="false" -e AZURE_API_VERSION="" -e AZURE_RESOURCE_NAME=""
-e AZURE_DEPLOYMENT_NAME="" -e AZURE_OPENAI_TOKEN=""
-e DINGTALK_CREDENTIALS="your_client_id1:secret1,your_client_id2:secret2"
-e HELP="欢迎使用本工具nn你可以查看:[用户指南](https://github.com/eryajf/chatgpt-dingtalk/blob/main/docs/userGuide.md)nn这是一个[开源项目](https://github.com/eryajf/chatgpt-dingtalk/)
,觉得不错你可以来波素质三连."
--restart=always registry.cn-hangzhou.aliyuncs.com/eryajf/chatgpt-dingtalk
運行命令中映射的配置文件參考下邊的配置文件說明。
? 注意:如果使用docker 部署,那麼PORT 參數不需要進行任何調整。? 注意: ALLOW_GROUPS,ALLOW_USERS,DENY_USERS,VIP_USERS,ADMIN_USERS 參數為數組,如果需要指定多個,可用英文逗號分割。 outgoing 機器人模式下這些參數無效。? 注意:如果服務器節點本身就在國外或者自定義了BASE_URL ,那麼就把HTTP_PROXY參數留空即可。? 注意:如果使用docker 部署,那麼proxy 地址可以直接使用如上方式部署, host.docker.internal會指向容器所在宿主機的IP,只需要更改端口為你的代理端口即可。參見:Docker 容器如何優雅地訪問宿主機網絡第二种:基于配置文件挂载运行
# 复制配置文件,根据自己实际情况,调整配置里的内容
$ cp config.example.yml config.yml # 其中 config.example.yml 从项目的根目录获取
# 运行项目
$ docker run -itd --name chatgpt -p 8090:8090 -v `pwd`/config.yml:/app/config.yml --restart=always registry.cn-hangzhou.aliyuncs.com/eryajf/chatgpt-dingtalk
其中配置文件參考下邊的配置文件說明。
第三种:使用 docker compose 运行
$ wget https://raw.githubusercontent.com/eryajf/chatgpt-dingtalk/main/docker-compose.yml
$ vim docker-compose.yml # 编辑 APIKEY 等信息
$ docker compose up -d
之前部署完成之後還有一個配置Nginx 的步驟,現在將模式默認指定為stream 模式,因此不再需要配置Nginx。
如果你想通過命令行直接部署,可以直接下載release 中的壓縮包,請根據自己系統以及架構選擇合適的壓縮包,下載之後直接解壓運行。
下載之後,在本地解壓,即可看到可執行程序,與配置文件:
$ tar xf chatgpt-dingtalk-v0.0.4-darwin-arm64.tar.gz
$ cd chatgpt-dingtalk-v0.0.4-darwin-arm64
$ cp config.example.yml config.yml
$ ./chatgpt-dingtalk # 直接运行
# 如果要守护在后台运行
$ nohup ./chatgpt-dingtalk & > run.log &
$ tail -f run.log釘釘官方在2023 年5 月份全面推出了stream 模式,因此這裡也推薦大家直接使用這個模式,其他HTTP 的仍舊支持,只不過不再深入研究,因此下邊的文檔也以stream 模式的配置流程來介紹。
創建步驟參考文檔:企業內部應用,或者根據如下步驟進行配置。
創建應用。
? 注意:可能現在創建機器人的時候名字為chatgpt會被釘釘限制,請用其他名字命名。
在基础信息-->应用信息當中能夠獲取到機器人的AppKey和AppSecret 。
配置機器人。
發布機器人。
點擊版本管理与发布,然後點擊上线,這個時候就能在釘釘的群里中添加這個機器人了。
群聊添加機器人。
2023-03-08補充,我發現也可以不在群裡艾特機器人聊天,還可點擊機器人,然後點擊發消息,通過與機器人直接對話進行聊天:
由@Raytow 同學發現,在機器人自動生成的測試群裡無法直接私聊機器人,在其他群裡單獨添加這個機器人,然後再點擊就可以跟它私聊了。

艾特機器人發送空內容或者幫助,會返回幫助列表。
發送指定關鍵字,可以切換不同的模式。
? 注意:串聊模式下,群裡每個人的聊天上下文是獨立的。 ? 注意:默認對話模式為單聊,因此不必發送單聊即可進入單聊模式,而要進入串聊,則需要發送串聊關鍵字進行切換,當串聊內容超過最大限制的時候,你可以發送重置,然後再次進入串聊模式。
艾特機器人發送
余额二字,會返回當前key 對應的賬號的剩餘額度以及可用日期。
發送模板兩個字,會返回當前內置支持的prompt 列表。
如果你發現有比較優秀的prompt,歡迎PR。注意:一些與釘釘使用場景不是很匹配的,就不要提交了。
發送以
#图片開頭的內容,將會觸發繪畫能力,圖片生成之後,將會保存在程序根目錄下的images目录下。如果你繪圖沒有思路,可以在這里以及這裡找到一些不錯的prompt。
如果你的賬號通過了官方的白名單,那麼可以將模型配置為: gpt-4-0314 、 gpt-4或gpt-4o-mini ,目前gpt-4 的餘額查詢以及圖片生成功能暫不可用,可能是接口限制,也可能是其他原因,等我有條件的時候,會對這些功能進行測試驗證。
以下是gpt-3.5 與gpt-4 對數學計算方面的區別。
感謝@PIRANHACHAN同學提供的gpt-4 的key,使得項目在gpt-4 的對接上能夠進行驗證測試,達到了可用狀態。
# 获取项目
$ git clone https://github.com/eryajf/chatgpt-dingtalk.git
# 进入项目目录
$ cd chatgpt-dingtalk
# 复制配置文件,根据个人实际情况进行配置
$ cp config.example.yml config.yml
# 启动项目
$ go run main.go # 应用的日志级别,info or debug
log_level : " info "
# 运行模式,http 或者 stream ,强烈建议你使用stream模式,通过此链接了解:https://open.dingtalk.com/document/isvapp/stream
run_mode : " stream "
# openai api_key,如果你是用的是azure,则该配置项可以留空或者直接忽略
api_key : " xxxxxxxxx "
# 如果你使用官方的接口地址 https://api.openai.com,则留空即可,如果你想指定请求url的地址,可通过这个参数进行配置,注意需要带上 http 协议,如果你是用的是azure,则该配置项可以留空或者直接忽略
base_url : " "
# 指定模型,默认为 gpt-3.5-turbo , 可选参数有: "gpt-4-32k-0613", "gpt-4-32k-0314", "gpt-4-32k", "gpt-4-0613", "gpt-4-0314", "gpt-4", "gpt-3.5-turbo-16k-0613", "gpt-3.5-turbo-16k", "gpt-3.5-turbo-0613", "gpt-3.5-turbo-0301", "gpt-3.5-turbo",如果使用gpt-4,请确认自己是否有接口调用白名单,如果你是用的是azure,则该配置项可以留空或者直接忽略
model : " gpt-3.5-turbo "
# 指定绘画模型,默认为 dall-e-2 , 可选参数有:"dall-e-2", "dall-e-3"
image_model : " dall-e-2 "
# 会话超时时间,默认600秒,在会话时间内所有发送给机器人的信息会作为上下文
session_timeout : 600
# 最大问题长度
max_question_len : 2048
# 最大回答长度
max_answer_len : 2048
# 最大上下文文本长度,通常该参数可设置为与模型Token限制相同
max_text : 4096
# 指定请求时使用的代理,如果为空,则不使用代理,注意需要带上 http 协议 或 socks5 协议,如果你是用的是azure,则该配置项可以留空或者直接忽略
http_proxy : " "
# 指定默认的对话模式,可根据实际需求进行自定义,如果不设置,默认为单聊,即无上下文关联的对话模式
default_mode : "单聊"
# 单人单日请求次数上限,默认为0,即不限制
max_request : 0
# 指定服务启动端口,默认为 8090,一般在二进制宿主机部署时,遇到端口冲突时使用,如果run_mode为stream模式,则可以忽略该配置项
port : " 8090 "
# 指定服务的地址,就是当前服务可供外网访问的地址(或者直接理解为你配置在钉钉回调那里的地址),用于生成图片时给钉钉做渲染,最新版本中将图片上传到了钉钉服务器,理论上你可以忽略该配置项,如果run_mode为stream模式,则可以忽略该配置项
service_url : " http://xxxxxx "
# 限定对话类型 0:不限 1:只能单聊 2:只能群聊
chat_type : " 0 "
# 哪些群组可以进行对话(仅在chat_type为0、2时有效),如果留空,则表示允许所有群组,如果要限制,则列表中写群ID(ConversationID)
# 群ID,可在群组中 @机器人 群ID 来查看日志获取,例如日志会输出:[? 企业内部机器人 在『测试』群的ConversationID为: "cidrabcdefgh1234567890AAAAA"],获取后可填写该参数并重启程序
allow_groups : []
# 哪些普通群(使用outgoing机器人)可以进行对话,如果留空,则表示允许所有群组,如果要限制,则列表中写群ID(ConversationID)
# 群ID,可在群组中 @机器人 群ID 来查看日志获取,例如日志会输出:[? outgoing机器人 在『测试』群的ConversationID为: "cidrabcdefgh1234567890AAAAA"],获取后可填写该参数并重启程序
# 如果不想支持outgoing机器人功能,这里可以随意设置一个内部群组,例如:cidrabcdefgh1234567890AAAAA;或随意一个字符串,例如:disabled
# 建议该功能默认关闭:除非你必须要用到outgoing机器人
allow_outgoing_groups : []
# 以下 allow_users、deny_users、vip_users、admin_users 配置中填写的是用户的userid,outgoing机器人模式下不适用这些配置
# 比如 ["1301691029702722","1301691029702733"],这个信息需要在钉钉管理后台的通讯录当中获取:https://oa.dingtalk.com/contacts.htm#/contacts
# 哪些用户可以进行对话,如果留空,则表示允许所有用户,如果要限制,则列表中写用户的userid
allow_users : []
# 哪些用户不可以进行对话,如果留空,则表示允许所有用户(如allow_user有配置,需满足相应条件),如果要限制,则列表中写用户的userid,黑名单优先级高于白名单
deny_users : []
# 哪些用户可以进行无限对话,如果留空,则表示只允许管理员(如max_request配置为0,则允许所有人)
# 如果要针对指定VIP用户放开限制(如max_request配置不为0),则列表中写用户的userid
vip_users : []
# 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则列表中写用户的userid
# 注意:如果下边的app_secrets为空,以及使用outgoing的方式配置机器人,这两种情况下,都表示没有人是管理员
admin_users : []
# 钉钉机器人在应用信息中的AppSecret,为了校验回调的请求是否合法,如果留空,将会忽略校验,则该接口将会存在其他人也能随意调用的安全隐患,因此强烈建议配置正确的secret,如果你的服务对接给多个机器人,这里可以配置多个机器人的secret
app_secrets : []
# 敏感词,提问时触发,则不允许提问,回答的内容中触发,则以 代替
sensitive_words : []
# 帮助信息,放在配置文件,可供自定义
help: "### 发送信息nn若您想给机器人发送信息,有如下两种方式:nn1. **群聊:** 在机器人所在群里 **@机器人** 后边跟着要提问的内容。nn2. **私聊:** 点击机器人的 **头像** 后,再点击 **发消息。** nn### 系统指令nn系统指令是一些特殊的词语,当您向机器人发送这些词语时,会触发对应的功能。nn**? 注意:系统指令,即只发指令,没有特殊标识,也没有内容。**nn以下是系统指令详情:nn| 指令 | 描述 | 示例 |n| :--------: | :------------------------------------------: | :----------------------------------------------------------: |n| **单聊** | 每次对话都是一次新的对话,没有聊天上下文联系 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_193608.jpg'><br /></details> |n| **串聊** | 带上下文联系的对话模式 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_193608.jpg'><br /></details> |n| **重置** | 重置上下文模式,回归到默认模式 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_193608.jpg'><br /></details> |n| **余额** | 查询机器人所用OpenAI账号的余额 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230304_222522.jpg'><br /></details> |n| **模板** | 查看应用内置的prompt模板 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_193827.jpg'><br /></details> |n| **图片** | 查看如何根据提示生成图片 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_194125.jpg'><br /></details> |n| **查对话** | 获取指定人员的对话历史 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_193938.jpg'><br /></details> |n| **帮助** | 获取帮助信息 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_202336.jpg'><br /></details> |nnn### 功能指令nn除去系统指令,还有一些功能指令,功能指令是直接与应用交互,达到交互目的的一种指令。nn**? 注意:功能指令,一律以 #+关键字 为开头,通常需要在关键字后边加个空格,然后再写描述或参数。**nn以下是功能指令详情nn| 指令 | 说明 | 示例 |n| :--: | :--: | :--: |n| **#图片** | 根据提示咒语生成对应图片 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230323_150547.jpg'><br /></details> |n| **#域名** | 查询域名相关信息 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_202620.jpg'><br /></details> |n| **#证书** | 查询域名证书相关信息 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_202706.jpg'><br /></details> |n| **#Linux命令** | 根据自然语言描述生成对应命令 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_214947.jpg'><br /></details> |n| **#解释代码** | 分析一段代码的功能或含义 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_215242.jpg'><br /></details> |n| **#正则** | 根据自然语言描述生成正则 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_220222.jpg'><br /></details> |n| **#周报** | 应用周报的prompt | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_214335.jpg'><br /></details> |n| **#生成sql** | 根据自然语言描述生成sql语句 | <details><br /><summary>预览</summary><br /><img src='https://cdn.jsdelivr.net/gh/eryajf/tu/img/image_20230404_221325.jpg'><br /></details> |nn如上大多数能力,都是依赖prompt模板实现,如果你有更好的prompt,欢迎提交PR。nn### 友情提示nn使用 **串聊模式** 会显著加快机器人所用账号的余额消耗速度,因此,若无保留上下文的需求,建议使用 **单聊模式。** nn即使有保留上下文的需求,也应适时使用 **重置** 指令来重置上下文。nn### 项目地址nn本项目已在GitHub开源,[查看源代码](https://github.com/eryajf/chatgpt-dingtalk)。"
# Azure OpenAI 配置
# 例如你的示例请求为: curl https://eryajf.openai.azure.com/openai/deployments/gpt-35-turbo/chat/completions?api-version=2023-03-15-preview 那么对应配置如下,如果配置完成之后还是无法正常使用,请新建应用,重新配置回调试试看
azure_on : false # 如果是true,则会走azure的openai接口
azure_resource_name : " eryajf " # 对应你的主个性域名
azure_deployment_name : " gpt-35-turbo " # 对应的是 /deployments/ 后边跟着的这个值
azure_api_version : " 2023-03-15-preview " # 对应的是请求中的 api-version 后边的值
azure_openai_token : " xxxxxxx "
# 钉钉应用鉴权凭据信息,支持多个应用。通过请求时候鉴权来识别是来自哪个机器人应用的消息
# 设置credentials 之后,即具备了访问钉钉平台绝大部分 OpenAPI 的能力;例如上传图片到钉钉平台,提升图片体验,结合 Stream 模式简化服务部署
# client_id 对应钉钉平台 AppKey/SuiteKey;client_secret 对应 AppSecret/SuiteSecret
credentials :
- client_id : " put-your-client-id-here "
client_secret : " put-your-client-secret-here " 如何更好地使用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 | 2023-03-25 | 2023-03-26 | 2023-03-27 | 2023-03-29, 這些天裡,登上GitHub Trending。而且還在持續登榜中,可見最近openai 的熱度。
二丫講梵 | RiverRay | Null | Finly | Frank Cheung | Ashing Zheng | 本光 | 辣橙 |
金喜@DingTalk | Swing | Null | Stoneflying | Mill Peng | Little_huang | Iblogc | WangBooth |
Mao Mao | Hugh Gao | AydenLii |