Bladeren bron

feat: support settings for endpoints

Yeuoly 1 jaar geleden
bovenliggende
commit
303124f8f9

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

@@ -64,6 +64,10 @@ func InvokeApp(payload *InvokeAppRequest) (*stream.StreamResponse[map[string]any
 }
 
 func InvokeEncrypt(payload *InvokeEncryptRequest) (map[string]any, error) {
+	if !payload.EncryptRequired(payload.Data) {
+		return payload.Data, nil
+	}
+
 	data, err := Request[map[string]any]("POST", "invoke/encrypt", http_requests.HttpPayloadJson(payload))
 	if err != nil {
 		return nil, err

+ 34 - 3
internal/core/dify_invocation/types.go

@@ -117,14 +117,28 @@ func isEncryptOpt(fl validator.FieldLevel) bool {
 	return opt == ENCRYPT_OPT_ENCRYPT || opt == ENCRYPT_OPT_DECRYPT
 }
 
+type EncryptNamespace string
+
+const (
+	ENCRYPT_NAMESPACE_ENDPOINT EncryptNamespace = "endpoint"
+)
+
+func isEncryptNamespace(fl validator.FieldLevel) bool {
+	opt := EncryptNamespace(fl.Field().String())
+	return opt == ENCRYPT_NAMESPACE_ENDPOINT
+}
+
 func init() {
 	validators.GlobalEntitiesValidator.RegisterValidation("encrypt_opt", isEncryptOpt)
+	validators.GlobalEntitiesValidator.RegisterValidation("encrypt_namespace", isEncryptNamespace)
 }
 
 type InvokeEncryptSchema struct {
-	Opt    EncryptOpt                                `json:"opt" validate:"required,encrypt_opt"`
-	Data   map[string]any                            `json:"data" validate:"omitempty"`
-	Config map[string]plugin_entities.ProviderConfig `json:"config" validate:"omitempty,dive"`
+	Opt       EncryptOpt                                `json:"opt" validate:"required,encrypt_opt"`
+	Namespace EncryptNamespace                          `json:"namespace" validate:"required,encrypt_namespace"`
+	Identity  string                                    `json:"identity" validate:"required"`
+	Data      map[string]any                            `json:"data" validate:"omitempty"`
+	Config    map[string]plugin_entities.ProviderConfig `json:"config" validate:"omitempty,dive"`
 }
 
 type InvokeEncryptRequest struct {
@@ -133,6 +147,23 @@ type InvokeEncryptRequest struct {
 	InvokeEncryptSchema
 }
 
+func (r *InvokeEncryptRequest) EncryptRequired(settings map[string]any) bool {
+	if r.Config == nil {
+		return false
+	}
+
+	// filter out which key needs encrypt
+	for k := range settings {
+		if config, ok := r.Config[k]; ok {
+			if config.Type == plugin_entities.CONFIG_TYPE_SECRET_INPUT {
+				return true
+			}
+		}
+	}
+
+	return false
+}
+
 type InvokeToolRequest struct {
 	BaseInvokeDifyRequest
 	ToolType requests.ToolType `json:"tool_type" validate:"required,tool_type"`

+ 35 - 3
internal/service/endpoint.go

@@ -8,6 +8,7 @@ import (
 	"time"
 
 	"github.com/gin-gonic/gin"
+	"github.com/langgenius/dify-plugin-daemon/internal/core/dify_invocation"
 	"github.com/langgenius/dify-plugin-daemon/internal/core/plugin_daemon"
 	"github.com/langgenius/dify-plugin-daemon/internal/core/plugin_daemon/access_types"
 	"github.com/langgenius/dify-plugin-daemon/internal/core/plugin_manager"
@@ -40,6 +41,34 @@ func Endpoint(
 		return
 	}
 
+	// fetch endpoint declaration
+	endpoint_declaration := runtime.Configuration().Endpoint
+	if endpoint_declaration == nil {
+		ctx.JSON(404, gin.H{"error": "endpoint declaration not found"})
+		return
+	}
+
+	// decrypt settings
+	settings, err := dify_invocation.InvokeEncrypt(&dify_invocation.InvokeEncryptRequest{
+		BaseInvokeDifyRequest: dify_invocation.BaseInvokeDifyRequest{
+			TenantId: endpoint.TenantID,
+			UserId:   "",
+			Type:     dify_invocation.INVOKE_TYPE_ENCRYPT,
+		},
+		InvokeEncryptSchema: dify_invocation.InvokeEncryptSchema{
+			Opt:       dify_invocation.ENCRYPT_OPT_DECRYPT,
+			Namespace: dify_invocation.ENCRYPT_NAMESPACE_ENDPOINT,
+			Identity:  endpoint.ID,
+			Data:      endpoint.GetSettings(),
+			Config:    endpoint_declaration.Settings,
+		},
+	})
+
+	if err != nil {
+		ctx.JSON(500, gin.H{"error": "failed to decrypt data"})
+		return
+	}
+
 	session := session_manager.NewSession(
 		endpoint.TenantID,
 		"",
@@ -53,9 +82,12 @@ func Endpoint(
 
 	session.BindRuntime(runtime)
 
-	status_code, headers, response, err := plugin_daemon.InvokeEndpoint(session, &requests.RequestInvokeEndpoint{
-		RawHttpRequest: hex.EncodeToString(buffer.Bytes()),
-	})
+	status_code, headers, response, err := plugin_daemon.InvokeEndpoint(
+		session, &requests.RequestInvokeEndpoint{
+			RawHttpRequest: hex.EncodeToString(buffer.Bytes()),
+			Settings:       settings,
+		},
+	)
 	if err != nil {
 		ctx.JSON(500, gin.H{"error": err.Error()})
 		return

+ 5 - 2
internal/types/entities/plugin_entities/endpoint_declaration.go

@@ -35,7 +35,10 @@ func init() {
 }
 
 type EndpointDeclaration struct {
-	Path     string                    `json:"path" yaml:"path" validate:"required"`
-	Method   EndpointMethod            `json:"method" yaml:"method" validate:"required,is_available_endpoint_method"`
+	Path   string         `json:"path" yaml:"path" validate:"required"`
+	Method EndpointMethod `json:"method" yaml:"method" validate:"required,is_available_endpoint_method"`
+}
+
+type EndpointProviderDeclaration struct {
 	Settings map[string]ProviderConfig `json:"settings" validate:"omitempty,dive"`
 }

+ 12 - 9
internal/types/entities/plugin_entities/plugin_declaration.go

@@ -127,15 +127,18 @@ type PluginExecution struct {
 }
 
 type PluginDeclaration struct {
-	Version   string                    `json:"version" yaml:"version" validate:"required,version"`
-	Type      DifyManifestType          `json:"type" yaml:"type" validate:"required,eq=plugin"`
-	Author    string                    `json:"author" yaml:"author" validate:"required,max=128"`
-	Name      string                    `json:"name" yaml:"name" validate:"required,max=128" enum:"plugin"`
-	CreatedAt time.Time                 `json:"created_at" yaml:"created_at" validate:"required"`
-	Resource  PluginResourceRequirement `json:"resource" yaml:"resource" validate:"required"`
-	Plugins   []string                  `json:"plugins" yaml:"plugins" validate:"required,dive,max=128"`
-	Execution PluginExecution           `json:"execution" yaml:"execution" validate:"required"`
-	Meta      PluginMeta                `json:"meta" yaml:"meta" validate:"required"`
+	Version   string                       `json:"version" yaml:"version" validate:"required,version"`
+	Type      DifyManifestType             `json:"type" yaml:"type" validate:"required,eq=plugin"`
+	Author    string                       `json:"author" yaml:"author" validate:"required,max=128"`
+	Name      string                       `json:"name" yaml:"name" validate:"required,max=128" enum:"plugin"`
+	CreatedAt time.Time                    `json:"created_at" yaml:"created_at" validate:"required"`
+	Resource  PluginResourceRequirement    `json:"resource" yaml:"resource" validate:"required"`
+	Plugins   []string                     `json:"plugins" yaml:"plugins" validate:"required,dive,max=128"`
+	Execution PluginExecution              `json:"execution" yaml:"execution" validate:"required"`
+	Meta      PluginMeta                   `json:"meta" yaml:"meta" validate:"required"`
+	Endpoint  *EndpointProviderDeclaration `json:"endpoints" validate:"omitempty"`
+	Models    *ModelProviderConfiguration  `json:"models" validate:"omitempty"`
+	Tools     *ToolProviderConfiguration   `json:"tools" validate:"omitempty"`
 }
 
 var (

+ 0 - 9
internal/types/entities/plugin_entities/provider_declaration.go

@@ -2,12 +2,3 @@ package plugin_entities
 
 type GenericProviderDeclaration struct {
 }
-
-type ModelProviderDeclaration struct {
-}
-
-type ToolProviderDeclaration struct {
-}
-
-type EndpointProviderDeclaration struct {
-}