Browse Source

feat: 支持聊天模式限制能力 (#154)

二丫讲梵 2 năm trước cách đây
mục cha
commit
4850506adc
5 tập tin đã thay đổi với 46 bổ sung15 xóa
  1. 22 13
      README.md
  2. 3 1
      config.example.yml
  3. 9 0
      config/config.go
  4. 4 1
      docker-compose.yml
  5. 8 0
      main.go

+ 22 - 13
README.md

@@ -143,7 +143,7 @@
 ```
 第一种:基于环境变量运行
 # 运行项目
-$ 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 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" -e CHAT_TYPE="0" --restart=always  dockerproxy.com/eryajf/chatgpt-dingtalk:latest
 ```
 
 `📢 注意:`如果使用docker部署,那么PORT参数不需要进行任何调整。
@@ -330,18 +330,27 @@ $ go run main.go
 
 ## 配置文件说明
 
-```json
-{
-    "api_key": "xxxxxxxxx",   // openai api_key
-    "base_url": "api.openai.com", //  如果你想指定请求url的地址,可通过这个参数进行配置,默认为官方地址,不需要再添加 /v1
-    "model": "gpt-3.5-turbo", // 指定模型,默认为 gpt-3.5-turbo , 可选参数有: "gpt-4-0314", "gpt-4", "gpt-3.5-turbo-0301", "gpt-3.5-turbo"
-    "session_timeout": 600,   // 会话超时时间,默认600秒,在会话时间内所有发送给机器人的信息会作为上下文
-    "http_proxy": "",         // 指定请求时使用的代理,如果为空,则不使用代理
-    "default_mode": "单聊",    // 默认对话模式,可根据实际场景自定义,如果不设置,默认为单聊
-    "max_request": 0,    // 单人单日请求次数限制,默认为0,即不限制
-    "port": "8090",     // 指定服务启动端口,默认为 8090,一般在二进制宿主机部署时,遇到端口冲突时使用。
-    "service_url": "" // 指定服务的地址,就是当前服务可供外网访问的地址,用于生成图片时给钉钉渲染
-}
+```yaml
+# openai api_key
+api_key: "xxxxxxxxx"
+# 如果你使用官方的接口地址 https://api.openai.com,则留空即可,如果你想指定请求url的地址,可通过这个参数进行配置,注意需要带上 http 协议
+base_url: ""
+# 指定模型,默认为 gpt-3.5-turbo , 可选参数有: "gpt-4-0314", "gpt-4", "gpt-3.5-turbo-0301", "gpt-3.5-turbo",如果使用gpt-4,请确认自己是否有接口调用白名单
+model: "gpt-3.5-turbo"
+# 会话超时时间,默认600秒,在会话时间内所有发送给机器人的信息会作为上下文
+session_timeout: 600
+# 指定请求时使用的代理,如果为空,则不使用代理,注意需要带上 http 协议 或 socks5 协议
+http_proxy: ""
+# 指定默认的对话模式,可根据实际需求进行自定义,如果不设置,默认为单聊,即无上下文关联的对话模式
+default_mode: "单聊"
+# 单人单日请求次数上限,默认为0,即不限制
+max_request: 0
+# 指定服务启动端口,默认为 8090,一般在二进制宿主机部署时,遇到端口冲突时使用
+port: "8090"
+# 指定服务的地址,就是当前服务可供外网访问的地址(或者直接理解为你配置在钉钉回调那里的地址),用于生成图片时给钉钉做渲染
+service_url: "http://chat.eryajf.net"
+# 限定对话类型 0:不限 1:只能单聊 2:只能群聊
+chat_type: "0"
 ```
 
 ## 常见问题

+ 3 - 1
config.example.yml

@@ -15,4 +15,6 @@ max_request: 0
 # 指定服务启动端口,默认为 8090,一般在二进制宿主机部署时,遇到端口冲突时使用
 port: "8090"
 # 指定服务的地址,就是当前服务可供外网访问的地址(或者直接理解为你配置在钉钉回调那里的地址),用于生成图片时给钉钉做渲染
-service_url: "http://chat.eryajf.net"
+service_url: "http://chat.eryajf.net"
+# 限定对话类型 0:不限 1:只能单聊 2:只能群聊
+chat_type: "0"

+ 9 - 0
config/config.go

@@ -33,6 +33,8 @@ type Configuration struct {
 	Port string `yaml:"port"`
 	// 指定服务的地址,就是钉钉机器人配置的回调地址,比如: http://chat.eryajf.net
 	ServiceURL string `yaml:"service_url"`
+	// 限定对话类型 0:不限 1:单聊 2:群聊
+	ChatType string `yaml:"chat_type"`
 }
 
 var config *Configuration
@@ -62,6 +64,7 @@ func LoadConfig() *Configuration {
 		maxRequest := os.Getenv("MAX_REQUEST")
 		port := os.Getenv("PORT")
 		serviceURL := os.Getenv("SERVICE_URL")
+		chatType := os.Getenv("CHAT_TYPE")
 		if apiKey != "" {
 			config.ApiKey = apiKey
 		}
@@ -97,6 +100,9 @@ func LoadConfig() *Configuration {
 		if serviceURL != "" {
 			config.ServiceURL = serviceURL
 		}
+		if chatType != "" {
+			config.ChatType = chatType
+		}
 	})
 	if config.Model == "" {
 		config.DefaultMode = "gpt-3.5-turbo"
@@ -107,6 +113,9 @@ func LoadConfig() *Configuration {
 	if config.Port == "" {
 		config.Port = "8090"
 	}
+	if config.ChatType == "" {
+		config.ChatType = "0"
+	}
 	if config.ApiKey == "" {
 		logger.Fatal("config err: api key required")
 	}

+ 4 - 1
docker-compose.yml

@@ -3,7 +3,7 @@ version: '3'
 services:
   chatgpt:
     container_name: chatgpt
-    image: dockerproxy.com/eryajf/chatgpt-dingtalk:latest
+    image: eryajf/chatgpt-dingtalk:latest
     restart: always
     environment:
       APIKEY: xxxxxx  # 你的 api_key
@@ -15,6 +15,9 @@ services:
       MAX_REQUEST: 0 # 单人单日请求次数上限,默认为0,即不限制
       PORT: 8090 # 指定服务启动端口,默认为 8090,容器化部署时,不需要调整,一般在二进制宿主机部署时,遇到端口冲突时使用
       SERVICE_URL: ""  # 指定服务的地址,就是当前服务可供外网访问的地址(或者直接理解为你配置在钉钉回调那里的地址),用于生成图片时给钉钉做渲染
+      CHAT_TYPE: "0" # 限定对话类型 0:不限 1:只能单聊 2:只能群聊
+    volumes:
+      - ./data/images:/app/images
     ports:
       - "8090:8090"
     extra_hosts:

+ 8 - 0
main.go

@@ -41,6 +41,14 @@ func Start() {
 		// 打印钉钉回调过来的请求明细
 		logger.Info(fmt.Sprintf("dingtalk callback parameters: %#v", msgObj))
 		// TODO: 校验请求
+		if public.Config.ChatType != "0" && msgObj.ConversationType != public.Config.ChatType {
+			_, err = msgObj.ReplyToDingtalk(string(dingbot.TEXT), "抱歉,管理员禁用了这种聊天方式,请选择其他聊天方式与机器人对话!")
+			if err != nil {
+				logger.Warning(fmt.Errorf("send message error: %v", err))
+				return err
+			}
+			return nil
+		}
 		if len(msgObj.Text.Content) == 1 || msgObj.Text.Content == "帮助" {
 			// 欢迎信息
 			_, err := msgObj.ReplyToDingtalk(string(dingbot.MARKDOWN), public.Welcome)