Kaynağa Gözat

feat: support request uploading files

Yeuoly 8 ay önce
ebeveyn
işleme
6230ce4f7f

+ 2 - 0
internal/core/dify_invocation/invcation.go

@@ -31,4 +31,6 @@ type BackwardsInvocation interface {
 	InvokeEncrypt(payload *InvokeEncryptRequest) (map[string]any, error)
 	// InvokeSummary
 	InvokeSummary(payload *InvokeSummaryRequest) (*InvokeSummaryResponse, error)
+	// UploadFile
+	UploadFile(payload *UploadFileRequest) (*UploadFileResponse, error)
 }

+ 4 - 0
internal/core/dify_invocation/real/http_request.go

@@ -153,3 +153,7 @@ func (i *RealBackwardsInvocation) InvokeEncrypt(payload *dify_invocation.InvokeE
 func (i *RealBackwardsInvocation) InvokeSummary(payload *dify_invocation.InvokeSummaryRequest) (*dify_invocation.InvokeSummaryResponse, error) {
 	return Request[dify_invocation.InvokeSummaryResponse](i, "POST", "invoke/summary", http_requests.HttpPayloadJson(payload))
 }
+
+func (i *RealBackwardsInvocation) UploadFile(payload *dify_invocation.UploadFileRequest) (*dify_invocation.UploadFileResponse, error) {
+	return Request[dify_invocation.UploadFileResponse](i, "POST", "upload/file/request", http_requests.HttpPayloadJson(payload))
+}

+ 6 - 0
internal/core/dify_invocation/tester/mock.go

@@ -319,3 +319,9 @@ func (m *MockedDifyInvocation) InvokeSummary(payload *dify_invocation.InvokeSumm
 		Summary: payload.Text,
 	}, nil
 }
+
+func (m *MockedDifyInvocation) UploadFile(payload *dify_invocation.UploadFileRequest) (*dify_invocation.UploadFileResponse, error) {
+	return &dify_invocation.UploadFileResponse{
+		URL: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
+	}, nil
+}

+ 11 - 0
internal/core/dify_invocation/types.go

@@ -29,6 +29,7 @@ const (
 	INVOKE_TYPE_STORAGE                  InvokeType = "storage"
 	INVOKE_TYPE_ENCRYPT                  InvokeType = "encrypt"
 	INVOKE_TYPE_SUMMARY                  InvokeType = "summary"
+	INVOKE_TYPE_UPLOAD_FILE              InvokeType = "upload_file"
 )
 
 type InvokeLLMRequest struct {
@@ -229,3 +230,13 @@ type InvokeSummaryRequest struct {
 type InvokeSummaryResponse struct {
 	Summary string `json:"summary"`
 }
+
+type UploadFileRequest struct {
+	BaseInvokeDifyRequest
+	Filename string `json:"filename" validate:"required"`
+	MimeType string `json:"mimetype" validate:"required"`
+}
+
+type UploadFileResponse struct {
+	URL string `json:"url"`
+}

+ 22 - 0
internal/core/plugin_daemon/backwards_invocation/task.go

@@ -137,6 +137,12 @@ var (
 			},
 			"error": "permission denied, you need to enable llm access in plugin manifest",
 		},
+		dify_invocation.INVOKE_TYPE_UPLOAD_FILE: {
+			"func": func(declaration *plugin_entities.PluginDeclaration) bool {
+				return true
+			},
+			"error": "permission denied, you need to enable storage access in plugin manifest",
+		},
 	}
 )
 
@@ -227,6 +233,9 @@ var (
 		dify_invocation.INVOKE_TYPE_SUMMARY: func(handle *BackwardsInvocation) {
 			genericDispatchTask(handle, executeDifyInvocationSummaryTask)
 		},
+		dify_invocation.INVOKE_TYPE_UPLOAD_FILE: func(handle *BackwardsInvocation) {
+			genericDispatchTask(handle, executeDifyInvocationUploadFileTask)
+		},
 	}
 )
 
@@ -539,3 +548,16 @@ func executeDifyInvocationSummaryTask(
 
 	handle.WriteResponse("struct", response)
 }
+
+func executeDifyInvocationUploadFileTask(
+	handle *BackwardsInvocation,
+	request *dify_invocation.UploadFileRequest,
+) {
+	response, err := handle.backwardsInvocation.UploadFile(request)
+	if err != nil {
+		handle.WriteError(fmt.Errorf("upload file failed: %s", err.Error()))
+		return
+	}
+
+	handle.WriteResponse("struct", response)
+}