manager.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package plugin_manager
  2. import (
  3. "fmt"
  4. "github.com/langgenius/dify-plugin-daemon/internal/cluster"
  5. "github.com/langgenius/dify-plugin-daemon/internal/core/dify_invocation"
  6. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_manager/installer"
  7. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_manager/media_manager"
  8. "github.com/langgenius/dify-plugin-daemon/internal/core/plugin_manager/serverless"
  9. "github.com/langgenius/dify-plugin-daemon/internal/types/app"
  10. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
  11. "github.com/langgenius/dify-plugin-daemon/internal/utils/cache"
  12. "github.com/langgenius/dify-plugin-daemon/internal/utils/lock"
  13. "github.com/langgenius/dify-plugin-daemon/internal/utils/log"
  14. "github.com/langgenius/dify-plugin-daemon/internal/utils/mapping"
  15. )
  16. type PluginManager struct {
  17. m mapping.Map[string, plugin_entities.PluginLifetime]
  18. cluster *cluster.Cluster
  19. maxPluginPackageSize int64
  20. workingDirectory string
  21. // mediaManager is used to manage media files like plugin icons, images, etc.
  22. mediaManager *media_manager.MediaManager
  23. // running plugin in storage contains relations between plugin packages and their running instances
  24. runningPluginInStorage mapping.Map[string, string]
  25. // start process lock
  26. startProcessLock *lock.HighGranularityLock
  27. // serverless runtime
  28. installer installer.Installer
  29. }
  30. var (
  31. manager *PluginManager
  32. )
  33. func InitManager(cluster *cluster.Cluster, configuration *app.Config) {
  34. manager = &PluginManager{
  35. cluster: cluster,
  36. maxPluginPackageSize: configuration.MaxPluginPackageSize,
  37. workingDirectory: configuration.PluginWorkingPath,
  38. mediaManager: media_manager.NewMediaManager(
  39. configuration.PluginMediaCachePath,
  40. configuration.PluginMediaCacheSize,
  41. ),
  42. startProcessLock: lock.NewHighGranularityLock(),
  43. }
  44. if configuration.Platform == app.PLATFORM_AWS_LAMBDA {
  45. manager.installer = installer.AwsInstaller
  46. serverless.Init(configuration)
  47. } else if configuration.Platform == app.PLATFORM_LOCAL {
  48. manager.installer = installer.LocalInstaller
  49. }
  50. manager.Init(configuration)
  51. }
  52. func Manager() *PluginManager {
  53. return manager
  54. }
  55. func (p *PluginManager) Add(
  56. plugin plugin_entities.PluginLifetime,
  57. ) error {
  58. identity, err := plugin.Identity()
  59. if err != nil {
  60. return err
  61. }
  62. p.m.Store(identity.String(), plugin)
  63. return nil
  64. }
  65. func (p *PluginManager) Get(
  66. identity plugin_entities.PluginUniqueIdentifier,
  67. ) plugin_entities.PluginLifetime {
  68. if v, ok := p.m.Load(identity.String()); ok {
  69. return v
  70. }
  71. // check if plugin is a serverless runtime
  72. plugin_session_interface, err := p.getServerlessPluginRuntime(identity)
  73. if err != nil {
  74. return nil
  75. }
  76. return plugin_session_interface
  77. }
  78. func (p *PluginManager) GetAsset(id string) ([]byte, error) {
  79. return p.mediaManager.Get(id)
  80. }
  81. func (p *PluginManager) Init(configuration *app.Config) {
  82. // TODO: init plugin manager
  83. log.Info("start plugin manager daemon...")
  84. // init redis client
  85. if err := cache.InitRedisClient(
  86. fmt.Sprintf("%s:%d", configuration.RedisHost, configuration.RedisPort),
  87. configuration.RedisPass,
  88. ); err != nil {
  89. log.Panic("init redis client failed: %s", err.Error())
  90. }
  91. if err := dify_invocation.InitDifyInvocationDaemon(
  92. configuration.PluginInnerApiURL, configuration.PluginInnerApiKey,
  93. ); err != nil {
  94. log.Panic("init dify invocation daemon failed: %s", err.Error())
  95. }
  96. // start local watcher
  97. if configuration.Platform == app.PLATFORM_LOCAL {
  98. p.startLocalWatcher(configuration)
  99. }
  100. // start remote watcher
  101. p.startRemoteWatcher(configuration)
  102. }