config.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package config
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "log"
  6. "os"
  7. "strconv"
  8. "sync"
  9. "time"
  10. "github.com/eryajf/chatgpt-dingtalk/pkg/logger"
  11. "gopkg.in/yaml.v2"
  12. )
  13. // Configuration 项目配置
  14. type Configuration struct {
  15. // gtp apikey
  16. ApiKey string `yaml:"api_key"`
  17. // 请求的 URL 地址
  18. BaseURL string `yaml:"base_url"`
  19. // 使用模型
  20. Model string `yaml:"model"`
  21. // 会话超时时间
  22. SessionTimeout time.Duration `yaml:"session_timeout"`
  23. // 默认对话模式
  24. DefaultMode string `yaml:"default_mode"`
  25. // 代理地址
  26. HttpProxy string `yaml:"http_proxy"`
  27. // 用户单日最大请求次数
  28. MaxRequest int `yaml:"max_request"`
  29. // 指定服务启动端口,默认为 8090
  30. Port string `yaml:"port"`
  31. // 指定服务的地址,就是钉钉机器人配置的回调地址,比如: http://chat.eryajf.net
  32. ServiceURL string `yaml:"service_url"`
  33. // 限定对话类型 0:不限 1:单聊 2:群聊
  34. ChatType string `yaml:"chat_type"`
  35. }
  36. var config *Configuration
  37. var once sync.Once
  38. // LoadConfig 加载配置
  39. func LoadConfig() *Configuration {
  40. once.Do(func() {
  41. // 从文件中读取
  42. config = &Configuration{}
  43. data, err := ioutil.ReadFile("config.yml")
  44. if err != nil {
  45. log.Fatal(err)
  46. }
  47. err = yaml.Unmarshal(data, &config)
  48. if err != nil {
  49. log.Fatal(err)
  50. }
  51. // 如果环境变量有配置,读取环境变量
  52. apiKey := os.Getenv("APIKEY")
  53. baseURL := os.Getenv("BASE_URL")
  54. model := os.Getenv("MODEL")
  55. sessionTimeout := os.Getenv("SESSION_TIMEOUT")
  56. defaultMode := os.Getenv("DEFAULT_MODE")
  57. httpProxy := os.Getenv("HTTP_PROXY")
  58. maxRequest := os.Getenv("MAX_REQUEST")
  59. port := os.Getenv("PORT")
  60. serviceURL := os.Getenv("SERVICE_URL")
  61. chatType := os.Getenv("CHAT_TYPE")
  62. if apiKey != "" {
  63. config.ApiKey = apiKey
  64. }
  65. if baseURL != "" {
  66. config.BaseURL = baseURL
  67. }
  68. if sessionTimeout != "" {
  69. duration, err := strconv.ParseInt(sessionTimeout, 10, 64)
  70. if err != nil {
  71. logger.Fatal(fmt.Sprintf("config session timeout err: %v ,get is %v", err, sessionTimeout))
  72. return
  73. }
  74. config.SessionTimeout = time.Duration(duration) * time.Second
  75. } else {
  76. config.SessionTimeout = time.Duration(config.SessionTimeout) * time.Second
  77. }
  78. if defaultMode != "" {
  79. config.DefaultMode = defaultMode
  80. }
  81. if httpProxy != "" {
  82. config.HttpProxy = httpProxy
  83. }
  84. if model != "" {
  85. config.Model = model
  86. }
  87. if maxRequest != "" {
  88. newMR, _ := strconv.Atoi(maxRequest)
  89. config.MaxRequest = newMR
  90. }
  91. if port != "" {
  92. config.Port = port
  93. }
  94. if serviceURL != "" {
  95. config.ServiceURL = serviceURL
  96. }
  97. if chatType != "" {
  98. config.ChatType = chatType
  99. }
  100. })
  101. if config.Model == "" {
  102. config.DefaultMode = "gpt-3.5-turbo"
  103. }
  104. if config.DefaultMode == "" {
  105. config.DefaultMode = "单聊"
  106. }
  107. if config.Port == "" {
  108. config.Port = "8090"
  109. }
  110. if config.ChatType == "" {
  111. config.ChatType = "0"
  112. }
  113. if config.ApiKey == "" {
  114. logger.Fatal("config err: api key required")
  115. }
  116. if config.ServiceURL == "" {
  117. logger.Fatal("config err: service url required")
  118. }
  119. return config
  120. }