timeout.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package timeout
  2. import (
  3. "net/http"
  4. "time"
  5. "github.com/bytedance/sonic"
  6. "github.com/bytedance/sonic/ast"
  7. "github.com/labring/aiproxy/core/common"
  8. "github.com/labring/aiproxy/core/relay/adaptor"
  9. "github.com/labring/aiproxy/core/relay/meta"
  10. "github.com/labring/aiproxy/core/relay/mode"
  11. "github.com/labring/aiproxy/core/relay/plugin"
  12. "github.com/labring/aiproxy/core/relay/plugin/noop"
  13. )
  14. var _ plugin.Plugin = (*Timeout)(nil)
  15. type Timeout struct {
  16. noop.Noop
  17. }
  18. func NewTimeoutPlugin() plugin.Plugin {
  19. return &Timeout{}
  20. }
  21. func (t *Timeout) ConvertRequest(
  22. meta *meta.Meta,
  23. store adaptor.Store,
  24. req *http.Request,
  25. do adaptor.ConvertRequest,
  26. ) (adaptor.ConvertResult, error) {
  27. var stream bool
  28. switch meta.Mode {
  29. case mode.Embeddings:
  30. meta.RequestTimeout = time.Second * 30
  31. case mode.Moderations:
  32. meta.RequestTimeout = time.Minute * 3
  33. case mode.ImagesGenerations,
  34. mode.ImagesEdits:
  35. meta.RequestTimeout = time.Minute * 5
  36. case mode.AudioTranscription,
  37. mode.AudioTranslation:
  38. meta.RequestTimeout = time.Minute * 3
  39. case mode.Rerank:
  40. meta.RequestTimeout = time.Second * 30
  41. case mode.ParsePdf:
  42. meta.RequestTimeout = time.Minute * 3
  43. case mode.VideoGenerationsJobs,
  44. mode.VideoGenerationsGetJobs,
  45. mode.VideoGenerationsContent:
  46. meta.RequestTimeout = time.Second * 30
  47. case mode.ResponsesGet,
  48. mode.ResponsesDelete,
  49. mode.ResponsesCancel,
  50. mode.ResponsesInputItems:
  51. meta.RequestTimeout = time.Second * 30
  52. case mode.ChatCompletions,
  53. mode.Completions,
  54. mode.Responses,
  55. mode.Anthropic:
  56. stream, _ = isStream(req)
  57. inputTokens := meta.RequestUsage.InputTokens
  58. if stream {
  59. switch {
  60. case inputTokens > 100*1024:
  61. meta.RequestTimeout = time.Minute * 10
  62. case inputTokens > 10*1024:
  63. meta.RequestTimeout = time.Minute * 5
  64. default:
  65. meta.RequestTimeout = time.Minute * 3
  66. }
  67. } else {
  68. switch {
  69. case inputTokens > 100*1024:
  70. meta.RequestTimeout = time.Minute * 15
  71. case inputTokens > 10*1024:
  72. meta.RequestTimeout = time.Minute * 10
  73. default:
  74. meta.RequestTimeout = time.Minute * 5
  75. }
  76. }
  77. default:
  78. if common.IsJSONContentType(req.Header.Get("Content-Type")) {
  79. stream, _ = isStream(req)
  80. if stream {
  81. meta.RequestTimeout = time.Minute * 3
  82. } else {
  83. meta.RequestTimeout = time.Minute * 15
  84. }
  85. }
  86. }
  87. if stream {
  88. if timeout := meta.ModelConfig.StreamRequestTimeout(); timeout != 0 {
  89. meta.RequestTimeout = timeout
  90. }
  91. } else {
  92. if timeout := meta.ModelConfig.RequestTimeout(); timeout != 0 {
  93. meta.RequestTimeout = timeout
  94. }
  95. }
  96. if meta.RequestTimeout != 0 {
  97. log := common.GetLoggerFromReq(req)
  98. log.Data["req_timeout"] = common.TruncateDuration(meta.RequestTimeout).String()
  99. }
  100. return do.ConvertRequest(meta, store, req)
  101. }
  102. func isStream(req *http.Request) (bool, error) {
  103. body, err := common.GetRequestBodyReusable(req)
  104. if err != nil {
  105. return false, nil
  106. }
  107. node, err := sonic.GetWithOptions(body, ast.SearchOptions{}, "stream")
  108. if err != nil {
  109. return false, err
  110. }
  111. return node.Bool()
  112. }