diff --git a/README.md b/README.md index 40f6e4e0..167fe5ba 100644 --- a/README.md +++ b/README.md @@ -384,14 +384,17 @@ graph LR + `TIKTOKEN_CACHE_DIR`:默认程序启动时会联网下载一些通用的词元的编码,如:`gpt-3.5-turbo`,在一些网络环境不稳定,或者离线情况,可能会导致启动有问题,可以配置此目录缓存数据,可迁移到离线环境。 + `DATA_GYM_CACHE_DIR`:目前该配置作用与 `TIKTOKEN_CACHE_DIR` 一致,但是优先级没有它高。 17. `RELAY_TIMEOUT`:中继超时设置,单位为秒,默认不设置超时时间。 -18. `SQLITE_BUSY_TIMEOUT`:SQLite 锁等待超时设置,单位为毫秒,默认 `3000`。 -19. `GEMINI_SAFETY_SETTING`:Gemini 的安全设置,默认 `BLOCK_NONE`。 -20. `GEMINI_VERSION`:One API 所使用的 Gemini 版本,默认为 `v1`。 -21. `THEME`:系统的主题设置,默认为 `default`,具体可选值参考[此处](./web/README.md)。 -22. `ENABLE_METRIC`:是否根据请求成功率禁用渠道,默认不开启,可选值为 `true` 和 `false`。 -23. `METRIC_QUEUE_SIZE`:请求成功率统计队列大小,默认为 `10`。 -24. `METRIC_SUCCESS_RATE_THRESHOLD`:请求成功率阈值,默认为 `0.8`。 -25. `INITIAL_ROOT_TOKEN`:如果设置了该值,则在系统首次启动时会自动创建一个值为该环境变量值的 root 用户令牌。 +18. `RELAY_PROXY`:设置后使用该代理来请求 API。 +19. `USER_CONTENT_REQUEST_TIMEOUT`:用户上传内容下载超时时间,单位为秒。 +20. `USER_CONTENT_REQUEST_PROXY`:设置后使用该代理来请求用户上传的内容,例如图片。 +21. `SQLITE_BUSY_TIMEOUT`:SQLite 锁等待超时设置,单位为毫秒,默认 `3000`。 +22. `GEMINI_SAFETY_SETTING`:Gemini 的安全设置,默认 `BLOCK_NONE`。 +23. `GEMINI_VERSION`:One API 所使用的 Gemini 版本,默认为 `v1`。 +24. `THEME`:系统的主题设置,默认为 `default`,具体可选值参考[此处](./web/README.md)。 +25. `ENABLE_METRIC`:是否根据请求成功率禁用渠道,默认不开启,可选值为 `true` 和 `false`。 +26. `METRIC_QUEUE_SIZE`:请求成功率统计队列大小,默认为 `10`。 +27. `METRIC_SUCCESS_RATE_THRESHOLD`:请求成功率阈值,默认为 `0.8`。 +28. `INITIAL_ROOT_TOKEN`:如果设置了该值,则在系统首次启动时会自动创建一个值为该环境变量值的 root 用户令牌。 ### 命令行参数 1. `--port `: 指定服务器监听的端口号,默认为 `3000`。 diff --git a/common/client/init.go b/common/client/init.go new file mode 100644 index 00000000..f803cbf8 --- /dev/null +++ b/common/client/init.go @@ -0,0 +1,60 @@ +package client + +import ( + "fmt" + "github.com/songquanpeng/one-api/common/config" + "github.com/songquanpeng/one-api/common/logger" + "net/http" + "net/url" + "time" +) + +var HTTPClient *http.Client +var ImpatientHTTPClient *http.Client +var UserContentRequestHTTPClient *http.Client + +func Init() { + if config.UserContentRequestProxy != "" { + logger.SysLog(fmt.Sprintf("using %s as proxy to fetch user content", config.UserContentRequestProxy)) + proxyURL, err := url.Parse(config.UserContentRequestProxy) + if err != nil { + logger.FatalLog(fmt.Sprintf("USER_CONTENT_REQUEST_PROXY set but invalid: %s", config.UserContentRequestProxy)) + } + transport := &http.Transport{ + Proxy: http.ProxyURL(proxyURL), + } + UserContentRequestHTTPClient = &http.Client{ + Transport: transport, + Timeout: time.Second * time.Duration(config.UserContentRequestTimeout), + } + } else { + UserContentRequestHTTPClient = &http.Client{} + } + var transport http.RoundTripper + if config.RelayProxy != "" { + logger.SysLog(fmt.Sprintf("using %s as api relay proxy", config.RelayProxy)) + proxyURL, err := url.Parse(config.RelayProxy) + if err != nil { + logger.FatalLog(fmt.Sprintf("USER_CONTENT_REQUEST_PROXY set but invalid: %s", config.UserContentRequestProxy)) + } + transport = &http.Transport{ + Proxy: http.ProxyURL(proxyURL), + } + } + + if config.RelayTimeout == 0 { + HTTPClient = &http.Client{ + Transport: transport, + } + } else { + HTTPClient = &http.Client{ + Timeout: time.Duration(config.RelayTimeout) * time.Second, + Transport: transport, + } + } + + ImpatientHTTPClient = &http.Client{ + Timeout: 5 * time.Second, + Transport: transport, + } +} diff --git a/common/config/config.go b/common/config/config.go index 0864d844..539eeef4 100644 --- a/common/config/config.go +++ b/common/config/config.go @@ -144,3 +144,7 @@ var MetricFailChanSize = env.Int("METRIC_FAIL_CHAN_SIZE", 128) var InitialRootToken = os.Getenv("INITIAL_ROOT_TOKEN") var GeminiVersion = env.String("GEMINI_VERSION", "v1") + +var RelayProxy = env.String("RELAY_PROXY", "") +var UserContentRequestProxy = env.String("USER_CONTENT_REQUEST_PROXY", "") +var UserContentRequestTimeout = env.Int("USER_CONTENT_REQUEST_TIMEOUT", 30) diff --git a/common/image/image.go b/common/image/image.go index 12f0adff..beebd0c6 100644 --- a/common/image/image.go +++ b/common/image/image.go @@ -3,6 +3,7 @@ package image import ( "bytes" "encoding/base64" + "github.com/songquanpeng/one-api/common/client" "image" _ "image/gif" _ "image/jpeg" @@ -19,7 +20,7 @@ import ( var dataURLPattern = regexp.MustCompile(`data:image/([^;]+);base64,(.*)`) func IsImageUrl(url string) (bool, error) { - resp, err := http.Head(url) + resp, err := client.UserContentRequestHTTPClient.Head(url) if err != nil { return false, err } @@ -34,7 +35,7 @@ func GetImageSizeFromUrl(url string) (width int, height int, err error) { if !isImage { return } - resp, err := http.Get(url) + resp, err := client.UserContentRequestHTTPClient.Get(url) if err != nil { return } diff --git a/controller/channel-billing.go b/controller/channel-billing.go index b7ac61fd..53592744 100644 --- a/controller/channel-billing.go +++ b/controller/channel-billing.go @@ -4,12 +4,12 @@ import ( "encoding/json" "errors" "fmt" + "github.com/songquanpeng/one-api/common/client" "github.com/songquanpeng/one-api/common/config" "github.com/songquanpeng/one-api/common/logger" "github.com/songquanpeng/one-api/model" "github.com/songquanpeng/one-api/monitor" "github.com/songquanpeng/one-api/relay/channeltype" - "github.com/songquanpeng/one-api/relay/client" "io" "net/http" "strconv" diff --git a/main.go b/main.go index bdcdcd61..eb6f368c 100644 --- a/main.go +++ b/main.go @@ -7,6 +7,7 @@ import ( "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" "github.com/songquanpeng/one-api/common" + "github.com/songquanpeng/one-api/common/client" "github.com/songquanpeng/one-api/common/config" "github.com/songquanpeng/one-api/common/logger" "github.com/songquanpeng/one-api/controller" @@ -94,6 +95,7 @@ func main() { logger.SysLog("metric enabled, will disable channel if too much request failed") } openai.InitTokenEncoders() + client.Init() // Initialize HTTP server server := gin.New() diff --git a/relay/adaptor/baidu/main.go b/relay/adaptor/baidu/main.go index 6df5ce84..b816e0f4 100644 --- a/relay/adaptor/baidu/main.go +++ b/relay/adaptor/baidu/main.go @@ -7,9 +7,9 @@ import ( "fmt" "github.com/gin-gonic/gin" "github.com/songquanpeng/one-api/common" + "github.com/songquanpeng/one-api/common/client" "github.com/songquanpeng/one-api/common/logger" "github.com/songquanpeng/one-api/relay/adaptor/openai" - "github.com/songquanpeng/one-api/relay/client" "github.com/songquanpeng/one-api/relay/constant" "github.com/songquanpeng/one-api/relay/model" "io" diff --git a/relay/adaptor/common.go b/relay/adaptor/common.go index 82a5160e..8953d7a3 100644 --- a/relay/adaptor/common.go +++ b/relay/adaptor/common.go @@ -4,7 +4,7 @@ import ( "errors" "fmt" "github.com/gin-gonic/gin" - "github.com/songquanpeng/one-api/relay/client" + "github.com/songquanpeng/one-api/common/client" "github.com/songquanpeng/one-api/relay/meta" "io" "net/http" diff --git a/relay/client/init.go b/relay/client/init.go deleted file mode 100644 index 4b59cba7..00000000 --- a/relay/client/init.go +++ /dev/null @@ -1,24 +0,0 @@ -package client - -import ( - "github.com/songquanpeng/one-api/common/config" - "net/http" - "time" -) - -var HTTPClient *http.Client -var ImpatientHTTPClient *http.Client - -func init() { - if config.RelayTimeout == 0 { - HTTPClient = &http.Client{} - } else { - HTTPClient = &http.Client{ - Timeout: time.Duration(config.RelayTimeout) * time.Second, - } - } - - ImpatientHTTPClient = &http.Client{ - Timeout: 5 * time.Second, - } -} diff --git a/relay/controller/audio.go b/relay/controller/audio.go index 15e74290..8f9708d0 100644 --- a/relay/controller/audio.go +++ b/relay/controller/audio.go @@ -9,6 +9,7 @@ import ( "fmt" "github.com/gin-gonic/gin" "github.com/songquanpeng/one-api/common" + "github.com/songquanpeng/one-api/common/client" "github.com/songquanpeng/one-api/common/config" "github.com/songquanpeng/one-api/common/ctxkey" "github.com/songquanpeng/one-api/common/logger" @@ -17,7 +18,6 @@ import ( "github.com/songquanpeng/one-api/relay/billing" billingratio "github.com/songquanpeng/one-api/relay/billing/ratio" "github.com/songquanpeng/one-api/relay/channeltype" - "github.com/songquanpeng/one-api/relay/client" "github.com/songquanpeng/one-api/relay/meta" relaymodel "github.com/songquanpeng/one-api/relay/model" "github.com/songquanpeng/one-api/relay/relaymode"