http_request.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package real
  2. import (
  3. "fmt"
  4. "github.com/langgenius/dify-plugin-daemon/internal/core/dify_invocation"
  5. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/model_entities"
  6. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/tool_entities"
  7. "github.com/langgenius/dify-plugin-daemon/internal/types/validators"
  8. "github.com/langgenius/dify-plugin-daemon/internal/utils/http_requests"
  9. "github.com/langgenius/dify-plugin-daemon/internal/utils/routine"
  10. "github.com/langgenius/dify-plugin-daemon/internal/utils/stream"
  11. )
  12. // Send a request to dify inner api and validate the response
  13. func Request[T any](i *RealBackwardsInvocation, method string, path string, options ...http_requests.HttpOptions) (*T, error) {
  14. options = append(options,
  15. http_requests.HttpHeader(map[string]string{
  16. "X-Inner-Api-Key": i.dify_inner_api_key,
  17. }),
  18. http_requests.HttpWriteTimeout(5000),
  19. http_requests.HttpReadTimeout(240000),
  20. )
  21. req, err := http_requests.RequestAndParse[BaseBackwardsInvocationResponse[T]](i.client, i.difyPath(path), method, options...)
  22. if err != nil {
  23. return nil, err
  24. }
  25. if req.Error != "" {
  26. return nil, fmt.Errorf("request failed: %s", req.Error)
  27. }
  28. if req.Data == nil {
  29. return nil, fmt.Errorf("data is nil")
  30. }
  31. if err := validators.GlobalEntitiesValidator.Struct(req.Data); err != nil {
  32. return nil, fmt.Errorf("validate request failed: %s", err.Error())
  33. }
  34. return req.Data, nil
  35. }
  36. func StreamResponse[T any](i *RealBackwardsInvocation, method string, path string, options ...http_requests.HttpOptions) (
  37. *stream.Stream[T], error,
  38. ) {
  39. options = append(
  40. options, http_requests.HttpHeader(map[string]string{
  41. "X-Inner-Api-Key": i.dify_inner_api_key,
  42. }),
  43. http_requests.HttpWriteTimeout(5000),
  44. http_requests.HttpReadTimeout(240000),
  45. )
  46. response, err := http_requests.RequestAndParseStream[BaseBackwardsInvocationResponse[T]](i.client, i.difyPath(path), method, options...)
  47. if err != nil {
  48. return nil, err
  49. }
  50. new_response := stream.NewStream[T](1024)
  51. new_response.OnClose(func() {
  52. response.Close()
  53. })
  54. routine.Submit(func() {
  55. defer new_response.Close()
  56. for response.Next() {
  57. t, err := response.Read()
  58. if err != nil {
  59. new_response.WriteError(err)
  60. break
  61. }
  62. if t.Error != "" {
  63. new_response.WriteError(fmt.Errorf("request failed: %s", t.Error))
  64. break
  65. }
  66. if t.Data == nil {
  67. new_response.WriteError(fmt.Errorf("data is nil"))
  68. break
  69. }
  70. if err := validators.GlobalEntitiesValidator.Struct(t.Data); err != nil {
  71. new_response.WriteError(fmt.Errorf("validate request failed: %s", err.Error()))
  72. break
  73. }
  74. new_response.Write(*t.Data)
  75. }
  76. })
  77. return new_response, nil
  78. }
  79. func (i *RealBackwardsInvocation) InvokeLLM(payload *dify_invocation.InvokeLLMRequest) (*stream.Stream[model_entities.LLMResultChunk], error) {
  80. return StreamResponse[model_entities.LLMResultChunk](i, "POST", "invoke/llm", http_requests.HttpPayloadJson(payload))
  81. }
  82. func (i *RealBackwardsInvocation) InvokeTextEmbedding(payload *dify_invocation.InvokeTextEmbeddingRequest) (*model_entities.TextEmbeddingResult, error) {
  83. return Request[model_entities.TextEmbeddingResult](i, "POST", "invoke/text-embedding", http_requests.HttpPayloadJson(payload))
  84. }
  85. func (i *RealBackwardsInvocation) InvokeRerank(payload *dify_invocation.InvokeRerankRequest) (*model_entities.RerankResult, error) {
  86. return Request[model_entities.RerankResult](i, "POST", "invoke/rerank", http_requests.HttpPayloadJson(payload))
  87. }
  88. func (i *RealBackwardsInvocation) InvokeTTS(payload *dify_invocation.InvokeTTSRequest) (*stream.Stream[model_entities.TTSResult], error) {
  89. return StreamResponse[model_entities.TTSResult](i, "POST", "invoke/tts", http_requests.HttpPayloadJson(payload))
  90. }
  91. func (i *RealBackwardsInvocation) InvokeSpeech2Text(payload *dify_invocation.InvokeSpeech2TextRequest) (*model_entities.Speech2TextResult, error) {
  92. return Request[model_entities.Speech2TextResult](i, "POST", "invoke/speech2text", http_requests.HttpPayloadJson(payload))
  93. }
  94. func (i *RealBackwardsInvocation) InvokeModeration(payload *dify_invocation.InvokeModerationRequest) (*model_entities.ModerationResult, error) {
  95. return Request[model_entities.ModerationResult](i, "POST", "invoke/moderation", http_requests.HttpPayloadJson(payload))
  96. }
  97. func (i *RealBackwardsInvocation) InvokeTool(payload *dify_invocation.InvokeToolRequest) (*stream.Stream[tool_entities.ToolResponseChunk], error) {
  98. return StreamResponse[tool_entities.ToolResponseChunk](i, "POST", "invoke/tool", http_requests.HttpPayloadJson(payload))
  99. }
  100. func (i *RealBackwardsInvocation) InvokeApp(payload *dify_invocation.InvokeAppRequest) (*stream.Stream[map[string]any], error) {
  101. return StreamResponse[map[string]any](i, "POST", "invoke/app", http_requests.HttpPayloadJson(payload))
  102. }
  103. func (i *RealBackwardsInvocation) InvokeParameterExtractor(payload *dify_invocation.InvokeParameterExtractorRequest) (*dify_invocation.InvokeNodeResponse, error) {
  104. return Request[dify_invocation.InvokeNodeResponse](i, "POST", "invoke/parameter-extractor", http_requests.HttpPayloadJson(payload))
  105. }
  106. func (i *RealBackwardsInvocation) InvokeQuestionClassifier(payload *dify_invocation.InvokeQuestionClassifierRequest) (*dify_invocation.InvokeNodeResponse, error) {
  107. return Request[dify_invocation.InvokeNodeResponse](i, "POST", "invoke/question-classifier", http_requests.HttpPayloadJson(payload))
  108. }
  109. func (i *RealBackwardsInvocation) InvokeEncrypt(payload *dify_invocation.InvokeEncryptRequest) (map[string]any, error) {
  110. if !payload.EncryptRequired(payload.Data) {
  111. return payload.Data, nil
  112. }
  113. type resp struct {
  114. Data map[string]any `json:"data"`
  115. }
  116. data, err := Request[resp](i, "POST", "invoke/encrypt", http_requests.HttpPayloadJson(payload))
  117. if err != nil {
  118. return nil, err
  119. }
  120. return data.Data, nil
  121. }