http_server.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package server
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "time"
  7. "github.com/gin-contrib/gzip"
  8. "github.com/gin-gonic/gin"
  9. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_daemon/backwards_invocation/transaction"
  10. "github.com/langgenius/dify-plugin-daemon/internal/server/controllers"
  11. "github.com/langgenius/dify-plugin-daemon/internal/service"
  12. "github.com/langgenius/dify-plugin-daemon/internal/types/app"
  13. "github.com/langgenius/dify-plugin-daemon/internal/utils/log"
  14. )
  15. func (app *App) server(config *app.Config) func() {
  16. engine := gin.Default()
  17. engine.GET("/health/check", controllers.HealthCheck)
  18. app.endpointGroup(engine.Group("/e"), config)
  19. app.awsLambdaTransactionGroup(engine.Group("/backwards-invocation"), config)
  20. app.pluginGroup(engine.Group("/plugin/:tenant_id"), config)
  21. srv := &http.Server{
  22. Addr: fmt.Sprintf(":%d", config.ServerPort),
  23. Handler: engine,
  24. }
  25. go func() {
  26. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  27. log.Panic("listen: %s\n", err)
  28. }
  29. }()
  30. return func() {
  31. if err := srv.Shutdown(context.Background()); err != nil {
  32. log.Panic("Server Shutdown: %s\n", err)
  33. }
  34. }
  35. }
  36. func (app *App) pluginGroup(group *gin.RouterGroup, config *app.Config) {
  37. group.Use(CheckingKey(config.ServerKey))
  38. app.remoteDebuggingGroup(group.Group("/debugging"), config)
  39. app.pluginDispatchGroup(group.Group("/dispatch"), config)
  40. app.pluginManagementGroup(group.Group("/management"), config)
  41. app.endpointManagementGroup(group.Group("/endpoint"))
  42. app.pluginAssetGroup(group.Group("/asset"))
  43. }
  44. func (app *App) pluginDispatchGroup(group *gin.RouterGroup, config *app.Config) {
  45. group.Use(app.FetchPluginInstallation())
  46. group.Use(app.RedirectPluginInvoke())
  47. group.Use(app.InitClusterID())
  48. group.POST("/tool/invoke", controllers.InvokeTool(config))
  49. group.POST("/tool/validate_credentials", controllers.ValidateToolCredentials(config))
  50. group.POST("/tool/get_runtime_parameters", controllers.GetToolRuntimeParameters(config))
  51. group.POST("/llm/invoke", controllers.InvokeLLM(config))
  52. group.POST("/llm/num_tokens", controllers.GetLLMNumTokens(config))
  53. group.POST("/text_embedding/invoke", controllers.InvokeTextEmbedding(config))
  54. group.POST("/text_embedding/num_tokens", controllers.GetTextEmbeddingNumTokens(config))
  55. group.POST("/rerank/invoke", controllers.InvokeRerank(config))
  56. group.POST("/tts/invoke", controllers.InvokeTTS(config))
  57. group.POST("/tts/model/voices", controllers.GetTTSModelVoices(config))
  58. group.POST("/speech2text/invoke", controllers.InvokeSpeech2Text(config))
  59. group.POST("/moderation/invoke", controllers.InvokeModeration(config))
  60. group.POST("/model/validate_provider_credentials", controllers.ValidateProviderCredentials(config))
  61. group.POST("/model/validate_model_credentials", controllers.ValidateModelCredentials(config))
  62. group.POST("/model/schema", controllers.GetAIModelSchema(config))
  63. }
  64. func (app *App) remoteDebuggingGroup(group *gin.RouterGroup, config *app.Config) {
  65. if config.PluginRemoteInstallingEnabled {
  66. group.POST("/key", CheckingKey(config.ServerKey), controllers.GetRemoteDebuggingKey)
  67. }
  68. }
  69. func (app *App) endpointGroup(group *gin.RouterGroup, config *app.Config) {
  70. if config.PluginEndpointEnabled {
  71. group.HEAD("/:hook_id/*path", app.Endpoint())
  72. group.POST("/:hook_id/*path", app.Endpoint())
  73. group.GET("/:hook_id/*path", app.Endpoint())
  74. group.PUT("/:hook_id/*path", app.Endpoint())
  75. group.DELETE("/:hook_id/*path", app.Endpoint())
  76. group.OPTIONS("/:hook_id/*path", app.Endpoint())
  77. }
  78. }
  79. func (appRef *App) awsLambdaTransactionGroup(group *gin.RouterGroup, config *app.Config) {
  80. if config.Platform == app.PLATFORM_AWS_LAMBDA {
  81. appRef.aws_transaction_handler = transaction.NewAWSTransactionHandler(
  82. time.Duration(config.MaxAWSLambdaTransactionTimeout) * time.Second,
  83. )
  84. group.POST(
  85. "/transaction",
  86. service.HandleAWSPluginTransaction(appRef.aws_transaction_handler),
  87. )
  88. }
  89. }
  90. func (app *App) endpointManagementGroup(group *gin.RouterGroup) {
  91. group.POST("/setup", controllers.SetupEndpoint)
  92. group.POST("/remove", controllers.RemoveEndpoint)
  93. group.POST("/update", controllers.UpdateEndpoint)
  94. group.GET("/list", controllers.ListEndpoints)
  95. group.GET("/list/plugin", controllers.ListPluginEndpoints)
  96. group.POST("/enable", controllers.EnableEndpoint)
  97. group.POST("/disable", controllers.DisableEndpoint)
  98. }
  99. func (app *App) pluginManagementGroup(group *gin.RouterGroup, config *app.Config) {
  100. group.POST("/install/upload", controllers.UploadPlugin(config))
  101. group.POST("/install/identifiers", controllers.InstallPluginFromIdentifiers(config))
  102. group.POST("/install/upgrade", controllers.UpgradePlugin(config))
  103. group.GET("/install/tasks/:id", controllers.FetchPluginInstallationTask)
  104. group.POST("/install/tasks/:id/delete", controllers.DeletePluginInstallationTask)
  105. group.POST("/install/tasks/:id/delete/*identifier", controllers.DeletePluginInstallationItemFromTask)
  106. group.GET("/install/tasks", controllers.FetchPluginInstallationTasks)
  107. group.GET("/fetch/manifest", controllers.FetchPluginManifest)
  108. group.GET("/fetch/identifier", controllers.FetchPluginFromIdentifier)
  109. group.POST("/uninstall", controllers.UninstallPlugin)
  110. group.GET("/list", gzip.Gzip(gzip.DefaultCompression), controllers.ListPlugins)
  111. group.GET("/models", gzip.Gzip(gzip.DefaultCompression), controllers.ListModels)
  112. group.GET("/tools", gzip.Gzip(gzip.DefaultCompression), controllers.ListTools)
  113. group.GET("/tool", gzip.Gzip(gzip.DefaultCompression), controllers.GetTool)
  114. }
  115. func (app *App) pluginAssetGroup(group *gin.RouterGroup) {
  116. group.GET("/:id", gzip.Gzip(gzip.DefaultCompression), controllers.GetAsset)
  117. }