浏览代码

feat: webhook

Yeuoly 11 月之前
父节点
当前提交
9dad6260fb
共有 4 个文件被更改,包括 50 次插入13 次删除
  1. 23 0
      internal/server/controllers/webhook.go
  2. 20 11
      internal/server/http.go
  3. 5 2
      internal/server/middleware.go
  4. 2 0
      internal/types/app/config.go

+ 23 - 0
internal/server/controllers/webhook.go

@@ -0,0 +1,23 @@
+package controllers
+
+import (
+	"github.com/gin-gonic/gin"
+)
+
+func WebhookHead(c *gin.Context) {
+}
+
+func WebhookGet(c *gin.Context) {
+}
+
+func WebhookPost(c *gin.Context) {
+}
+
+func WebhookPut(c *gin.Context) {
+}
+
+func WebhookDelete(c *gin.Context) {
+}
+
+func WebhookOptions(c *gin.Context) {
+}

+ 20 - 11
internal/server/http.go

@@ -16,61 +16,61 @@ func (app *App) server(config *app.Config) {
 	engine.POST(
 	engine.POST(
 		"/plugin/tool/invoke",
 		"/plugin/tool/invoke",
 		CheckingKey(config.PluginInnerApiKey),
 		CheckingKey(config.PluginInnerApiKey),
-		app.Redirect(),
+		app.RedirectPluginInvoke(),
 		controllers.InvokeTool,
 		controllers.InvokeTool,
 	)
 	)
 	engine.POST(
 	engine.POST(
 		"/plugin/tool/validate_credentials",
 		"/plugin/tool/validate_credentials",
 		CheckingKey(config.PluginInnerApiKey),
 		CheckingKey(config.PluginInnerApiKey),
-		app.Redirect(),
+		app.RedirectPluginInvoke(),
 		controllers.ValidateToolCredentials,
 		controllers.ValidateToolCredentials,
 	)
 	)
 	engine.POST(
 	engine.POST(
 		"/plugin/llm/invoke",
 		"/plugin/llm/invoke",
 		CheckingKey(config.PluginInnerApiKey),
 		CheckingKey(config.PluginInnerApiKey),
-		app.Redirect(),
+		app.RedirectPluginInvoke(),
 		controllers.InvokeLLM,
 		controllers.InvokeLLM,
 	)
 	)
 	engine.POST(
 	engine.POST(
 		"/plugin/text_embedding/invoke",
 		"/plugin/text_embedding/invoke",
 		CheckingKey(config.PluginInnerApiKey),
 		CheckingKey(config.PluginInnerApiKey),
-		app.Redirect(),
+		app.RedirectPluginInvoke(),
 		controllers.InvokeTextEmbedding,
 		controllers.InvokeTextEmbedding,
 	)
 	)
 	engine.POST(
 	engine.POST(
 		"/plugin/rerank/invoke",
 		"/plugin/rerank/invoke",
 		CheckingKey(config.PluginInnerApiKey),
 		CheckingKey(config.PluginInnerApiKey),
-		app.Redirect(),
+		app.RedirectPluginInvoke(),
 		controllers.InvokeRerank,
 		controllers.InvokeRerank,
 	)
 	)
 	engine.POST(
 	engine.POST(
 		"/plugin/tts/invoke",
 		"/plugin/tts/invoke",
 		CheckingKey(config.PluginInnerApiKey),
 		CheckingKey(config.PluginInnerApiKey),
-		app.Redirect(),
+		app.RedirectPluginInvoke(),
 		controllers.InvokeTTS,
 		controllers.InvokeTTS,
 	)
 	)
 	engine.POST(
 	engine.POST(
 		"/plugin/speech2text/invoke",
 		"/plugin/speech2text/invoke",
 		CheckingKey(config.PluginInnerApiKey),
 		CheckingKey(config.PluginInnerApiKey),
-		app.Redirect(),
+		app.RedirectPluginInvoke(),
 		controllers.InvokeSpeech2Text,
 		controllers.InvokeSpeech2Text,
 	)
 	)
 	engine.POST(
 	engine.POST(
 		"/plugin/moderation/invoke",
 		"/plugin/moderation/invoke",
 		CheckingKey(config.PluginInnerApiKey),
 		CheckingKey(config.PluginInnerApiKey),
-		app.Redirect(),
+		app.RedirectPluginInvoke(),
 		controllers.InvokeModeration,
 		controllers.InvokeModeration,
 	)
 	)
 	engine.POST(
 	engine.POST(
 		"/plugin/model/validate_provider_credentials",
 		"/plugin/model/validate_provider_credentials",
 		CheckingKey(config.PluginInnerApiKey),
 		CheckingKey(config.PluginInnerApiKey),
-		app.Redirect(),
+		app.RedirectPluginInvoke(),
 		controllers.ValidateProviderCredentials,
 		controllers.ValidateProviderCredentials,
 	)
 	)
 	engine.POST(
 	engine.POST(
 		"/plugin/model/validate_model_credentials",
 		"/plugin/model/validate_model_credentials",
 		CheckingKey(config.PluginInnerApiKey),
 		CheckingKey(config.PluginInnerApiKey),
-		app.Redirect(),
+		app.RedirectPluginInvoke(),
 		controllers.ValidateModelCredentials,
 		controllers.ValidateModelCredentials,
 	)
 	)
 
 
@@ -78,10 +78,19 @@ func (app *App) server(config *app.Config) {
 		engine.POST(
 		engine.POST(
 			"/plugin/debugging/key",
 			"/plugin/debugging/key",
 			CheckingKey(config.PluginInnerApiKey),
 			CheckingKey(config.PluginInnerApiKey),
-			app.Redirect(),
+			app.RedirectPluginInvoke(),
 			controllers.GetRemoteDebuggingKey,
 			controllers.GetRemoteDebuggingKey,
 		)
 		)
 	}
 	}
 
 
+	if config.PluginWebhookEnabled {
+		engine.HEAD("/webhook/:hook_id/*path", controllers.WebhookHead)
+		engine.POST("/webhook/:hook_id/*path", controllers.WebhookPost)
+		engine.GET("/webhook/:hook_id/*path", controllers.WebhookGet)
+		engine.PUT("/webhook/:hook_id/*path", controllers.WebhookPut)
+		engine.DELETE("/webhook/:hook_id/*path", controllers.WebhookDelete)
+		engine.OPTIONS("/webhook/:hook_id/*path", controllers.WebhookOptions)
+	}
+
 	engine.Run(fmt.Sprintf(":%d", config.ServerPort))
 	engine.Run(fmt.Sprintf(":%d", config.ServerPort))
 }
 }

+ 5 - 2
internal/server/middleware.go

@@ -35,8 +35,8 @@ func (g *ginContextReader) Close() error {
 	return nil
 	return nil
 }
 }
 
 
-// Redirect redirects the request to the correct cluster node
-func (app *App) Redirect() gin.HandlerFunc {
+// RedirectPluginInvoke redirects the request to the correct cluster node
+func (app *App) RedirectPluginInvoke() gin.HandlerFunc {
 	return func(ctx *gin.Context) {
 	return func(ctx *gin.Context) {
 		// get plugin identity
 		// get plugin identity
 		raw, err := ctx.GetRawData()
 		raw, err := ctx.GetRawData()
@@ -107,6 +107,9 @@ func (app *App) Redirect() gin.HandlerFunc {
 					ctx.Writer.Write(buf[:n])
 					ctx.Writer.Write(buf[:n])
 				}
 				}
 			}
 			}
+
+			ctx.Abort()
+			return
 		} else {
 		} else {
 			ctx.Next()
 			ctx.Next()
 		}
 		}

+ 2 - 0
internal/types/app/config.go

@@ -18,6 +18,8 @@ type Config struct {
 	PluginRemoteInstallingMaxConn          int    `envconfig:"PLUGIN_REMOTE_INSTALLING_MAX_CONN"`
 	PluginRemoteInstallingMaxConn          int    `envconfig:"PLUGIN_REMOTE_INSTALLING_MAX_CONN"`
 	PluginRemoteInstallServerEventLoopNums int    `envconfig:"PLUGIN_REMOTE_INSTALL_SERVER_EVENT_LOOP_NUMS"`
 	PluginRemoteInstallServerEventLoopNums int    `envconfig:"PLUGIN_REMOTE_INSTALL_SERVER_EVENT_LOOP_NUMS"`
 
 
+	PluginWebhookEnabled bool `envconfig:"PLUGIN_WEBHOOK_ENABLED"`
+
 	StoragePath        string `envconfig:"STORAGE_PATH"  validate:"required"`
 	StoragePath        string `envconfig:"STORAGE_PATH"  validate:"required"`
 	ProcessCachingPath string `envconfig:"PROCESS_CACHING_PATH"  validate:"required"`
 	ProcessCachingPath string `envconfig:"PROCESS_CACHING_PATH"  validate:"required"`