manager.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package plugin_manager
  2. import (
  3. "fmt"
  4. "sync"
  5. "github.com/langgenius/dify-plugin-daemon/internal/cluster"
  6. "github.com/langgenius/dify-plugin-daemon/internal/core/dify_invocation"
  7. "github.com/langgenius/dify-plugin-daemon/internal/types/app"
  8. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
  9. "github.com/langgenius/dify-plugin-daemon/internal/utils/cache"
  10. "github.com/langgenius/dify-plugin-daemon/internal/utils/log"
  11. )
  12. type PluginManager struct {
  13. m sync.Map
  14. cluster *cluster.Cluster
  15. maxPluginPackageSize int64
  16. workingDirectory string
  17. }
  18. var (
  19. manager *PluginManager
  20. )
  21. func InitGlobalPluginManager(cluster *cluster.Cluster, configuration *app.Config) {
  22. manager = &PluginManager{
  23. cluster: cluster,
  24. maxPluginPackageSize: configuration.MaxPluginPackageSize,
  25. workingDirectory: configuration.PluginWorkingPath,
  26. }
  27. manager.Init(configuration)
  28. }
  29. func GetGlobalPluginManager() *PluginManager {
  30. return manager
  31. }
  32. func (p *PluginManager) Add(plugin plugin_entities.PluginRuntimeInterface) error {
  33. identity, err := plugin.Identity()
  34. if err != nil {
  35. return err
  36. }
  37. p.m.Store(identity.String(), plugin)
  38. return nil
  39. }
  40. func (p *PluginManager) List() []plugin_entities.PluginRuntimeInterface {
  41. var runtimes []plugin_entities.PluginRuntimeInterface
  42. p.m.Range(func(key, value interface{}) bool {
  43. if v, ok := value.(plugin_entities.PluginRuntimeInterface); ok {
  44. runtimes = append(runtimes, v)
  45. }
  46. return true
  47. })
  48. return runtimes
  49. }
  50. func (p *PluginManager) Get(identity plugin_entities.PluginUniqueIdentifier) plugin_entities.PluginRuntimeInterface {
  51. if v, ok := p.m.Load(identity.String()); ok {
  52. if r, ok := v.(plugin_entities.PluginRuntimeInterface); ok {
  53. return r
  54. }
  55. }
  56. return nil
  57. }
  58. func (p *PluginManager) Init(configuration *app.Config) {
  59. // TODO: init plugin manager
  60. log.Info("start plugin manager daemon...")
  61. // init redis client
  62. if err := cache.InitRedisClient(
  63. fmt.Sprintf("%s:%d", configuration.RedisHost, configuration.RedisPort),
  64. configuration.RedisPass,
  65. ); err != nil {
  66. log.Panic("init redis client failed: %s", err.Error())
  67. }
  68. if err := dify_invocation.InitDifyInvocationDaemon(
  69. configuration.PluginInnerApiURL, configuration.PluginInnerApiKey,
  70. ); err != nil {
  71. log.Panic("init dify invocation daemon failed: %s", err.Error())
  72. }
  73. // start local watcher
  74. p.startLocalWatcher(configuration)
  75. // start remote watcher
  76. p.startRemoteWatcher(configuration)
  77. }