http_server.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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. sentrygin "github.com/getsentry/sentry-go/gin"
  15. )
  16. // server starts a http server and returns a function to stop it
  17. func (app *App) server(config *app.Config) func() {
  18. engine := gin.Default()
  19. engine.GET("/health/check", controllers.HealthCheck(config))
  20. endpointGroup := engine.Group("/e")
  21. awsLambdaTransactionGroup := engine.Group("/backwards-invocation")
  22. pluginGroup := engine.Group("/plugin/:tenant_id")
  23. pprofGroup := engine.Group("/debug/pprof")
  24. if config.SentryEnabled {
  25. // setup sentry for all groups
  26. sentryGroup := []*gin.RouterGroup{
  27. endpointGroup,
  28. awsLambdaTransactionGroup,
  29. pluginGroup,
  30. }
  31. for _, group := range sentryGroup {
  32. group.Use(sentrygin.New(sentrygin.Options{
  33. Repanic: true,
  34. }))
  35. }
  36. }
  37. app.endpointGroup(endpointGroup, config)
  38. app.awsLambdaTransactionGroup(awsLambdaTransactionGroup, config)
  39. app.pluginGroup(pluginGroup, config)
  40. app.pprofGroup(pprofGroup, config)
  41. srv := &http.Server{
  42. Addr: fmt.Sprintf(":%d", config.ServerPort),
  43. Handler: engine,
  44. }
  45. go func() {
  46. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  47. log.Panic("listen: %s\n", err)
  48. }
  49. }()
  50. return func() {
  51. if err := srv.Shutdown(context.Background()); err != nil {
  52. log.Panic("Server Shutdown: %s\n", err)
  53. }
  54. }
  55. }
  56. func (app *App) pluginGroup(group *gin.RouterGroup, config *app.Config) {
  57. group.Use(CheckingKey(config.ServerKey))
  58. app.remoteDebuggingGroup(group.Group("/debugging"), config)
  59. app.pluginDispatchGroup(group.Group("/dispatch"), config)
  60. app.pluginManagementGroup(group.Group("/management"), config)
  61. app.endpointManagementGroup(group.Group("/endpoint"))
  62. app.pluginAssetGroup(group.Group("/asset"))
  63. }
  64. func (app *App) pluginDispatchGroup(group *gin.RouterGroup, config *app.Config) {
  65. group.Use(app.FetchPluginInstallation())
  66. group.Use(app.RedirectPluginInvoke())
  67. group.Use(app.InitClusterID())
  68. group.POST("/tool/invoke", controllers.InvokeTool(config))
  69. group.POST("/tool/validate_credentials", controllers.ValidateToolCredentials(config))
  70. group.POST("/tool/get_runtime_parameters", controllers.GetToolRuntimeParameters(config))
  71. group.POST("/agent_strategy/invoke", controllers.InvokeAgentStrategy(config))
  72. group.POST("/llm/invoke", controllers.InvokeLLM(config))
  73. group.POST("/llm/num_tokens", controllers.GetLLMNumTokens(config))
  74. group.POST("/text_embedding/invoke", controllers.InvokeTextEmbedding(config))
  75. group.POST("/text_embedding/num_tokens", controllers.GetTextEmbeddingNumTokens(config))
  76. group.POST("/rerank/invoke", controllers.InvokeRerank(config))
  77. group.POST("/tts/invoke", controllers.InvokeTTS(config))
  78. group.POST("/tts/model/voices", controllers.GetTTSModelVoices(config))
  79. group.POST("/speech2text/invoke", controllers.InvokeSpeech2Text(config))
  80. group.POST("/moderation/invoke", controllers.InvokeModeration(config))
  81. group.POST("/model/validate_provider_credentials", controllers.ValidateProviderCredentials(config))
  82. group.POST("/model/validate_model_credentials", controllers.ValidateModelCredentials(config))
  83. group.POST("/model/schema", controllers.GetAIModelSchema(config))
  84. }
  85. func (app *App) remoteDebuggingGroup(group *gin.RouterGroup, config *app.Config) {
  86. if config.PluginRemoteInstallingEnabled != nil && *config.PluginRemoteInstallingEnabled {
  87. group.POST("/key", CheckingKey(config.ServerKey), controllers.GetRemoteDebuggingKey)
  88. }
  89. }
  90. func (app *App) endpointGroup(group *gin.RouterGroup, config *app.Config) {
  91. if config.PluginEndpointEnabled != nil && *config.PluginEndpointEnabled {
  92. group.HEAD("/:hook_id/*path", app.Endpoint())
  93. group.POST("/:hook_id/*path", app.Endpoint())
  94. group.GET("/:hook_id/*path", app.Endpoint())
  95. group.PUT("/:hook_id/*path", app.Endpoint())
  96. group.DELETE("/:hook_id/*path", app.Endpoint())
  97. group.OPTIONS("/:hook_id/*path", app.Endpoint())
  98. }
  99. }
  100. func (appRef *App) awsLambdaTransactionGroup(group *gin.RouterGroup, config *app.Config) {
  101. if config.Platform == app.PLATFORM_SERVERLESS {
  102. appRef.awsTransactionHandler = transaction.NewAWSTransactionHandler(
  103. time.Duration(config.MaxServerlessTransactionTimeout) * time.Second,
  104. )
  105. group.POST(
  106. "/transaction",
  107. service.HandleAWSPluginTransaction(appRef.awsTransactionHandler),
  108. )
  109. }
  110. }
  111. func (app *App) endpointManagementGroup(group *gin.RouterGroup) {
  112. group.POST("/setup", controllers.SetupEndpoint)
  113. group.POST("/remove", controllers.RemoveEndpoint)
  114. group.POST("/update", controllers.UpdateEndpoint)
  115. group.GET("/list", controllers.ListEndpoints)
  116. group.GET("/list/plugin", controllers.ListPluginEndpoints)
  117. group.POST("/enable", controllers.EnableEndpoint)
  118. group.POST("/disable", controllers.DisableEndpoint)
  119. }
  120. func (app *App) pluginManagementGroup(group *gin.RouterGroup, config *app.Config) {
  121. group.POST("/install/upload/package", gzip.Gzip(gzip.DefaultCompression), controllers.UploadPlugin(config))
  122. group.POST("/install/upload/bundle", gzip.Gzip(gzip.DefaultCompression), controllers.UploadBundle(config))
  123. group.POST("/install/identifiers", controllers.InstallPluginFromIdentifiers(config))
  124. group.POST("/install/upgrade", controllers.UpgradePlugin(config))
  125. group.GET("/install/tasks/:id", controllers.FetchPluginInstallationTask)
  126. group.POST("/install/tasks/delete_all", controllers.DeleteAllPluginInstallationTasks)
  127. group.POST("/install/tasks/:id/delete", controllers.DeletePluginInstallationTask)
  128. group.POST("/install/tasks/:id/delete/*identifier", controllers.DeletePluginInstallationItemFromTask)
  129. group.GET("/install/tasks", controllers.FetchPluginInstallationTasks)
  130. group.GET("/fetch/manifest", gzip.Gzip(gzip.DefaultCompression), controllers.FetchPluginManifest)
  131. group.GET("/fetch/identifier", controllers.FetchPluginFromIdentifier)
  132. group.POST("/uninstall", controllers.UninstallPlugin)
  133. group.GET("/list", gzip.Gzip(gzip.DefaultCompression), controllers.ListPlugins)
  134. group.POST("/installation/fetch/batch", controllers.BatchFetchPluginInstallationByIDs)
  135. group.POST("/installation/missing", controllers.FetchMissingPluginInstallations)
  136. group.GET("/models", gzip.Gzip(gzip.DefaultCompression), controllers.ListModels)
  137. group.GET("/tools", gzip.Gzip(gzip.DefaultCompression), controllers.ListTools)
  138. group.GET("/tool", gzip.Gzip(gzip.DefaultCompression), controllers.GetTool)
  139. group.POST("/tools/check_existence", controllers.CheckToolExistence)
  140. group.GET("/agent_strategies", gzip.Gzip(gzip.DefaultCompression), controllers.ListAgentStrategies)
  141. group.GET("/agent_strategy", gzip.Gzip(gzip.DefaultCompression), controllers.GetAgentStrategy)
  142. }
  143. func (app *App) pluginAssetGroup(group *gin.RouterGroup) {
  144. group.GET("/:id", gzip.Gzip(gzip.DefaultCompression), controllers.GetAsset)
  145. }
  146. func (app *App) pprofGroup(group *gin.RouterGroup, config *app.Config) {
  147. if config.PPROFEnabled {
  148. group.Use(CheckingKey(config.ServerKey))
  149. group.GET("/", controllers.PprofIndex)
  150. group.GET("/cmdline", controllers.PprofCmdline)
  151. group.GET("/profile", controllers.PprofProfile)
  152. group.GET("/symbol", controllers.PprofSymbol)
  153. group.GET("/trace", controllers.PprofTrace)
  154. group.GET("/goroutine", controllers.PprofGoroutine)
  155. group.GET("/heap", controllers.PprofHeap)
  156. group.GET("/allocs", controllers.PprofAllocs)
  157. group.GET("/block", controllers.PprofBlock)
  158. group.GET("/mutex", controllers.PprofMutex)
  159. group.GET("/threadcreate", controllers.PprofThreadcreate)
  160. }
  161. }