manage_plugin.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. package service
  2. import (
  3. "time"
  4. "github.com/langgenius/dify-plugin-daemon/internal/db"
  5. "github.com/langgenius/dify-plugin-daemon/internal/types/entities"
  6. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/manifest_entities"
  7. "github.com/langgenius/dify-plugin-daemon/internal/types/entities/plugin_entities"
  8. "github.com/langgenius/dify-plugin-daemon/internal/types/models"
  9. "github.com/langgenius/dify-plugin-daemon/internal/utils/cache/helper"
  10. "github.com/langgenius/dify-plugin-daemon/internal/utils/strings"
  11. )
  12. func ListPlugins(tenant_id string, page int, page_size int) *entities.Response {
  13. type installation struct {
  14. ID string `json:"id"`
  15. Name string `json:"name"`
  16. PluginID string `json:"plugin_id"`
  17. TenantID string `json:"tenant_id"`
  18. PluginUniqueIdentifier string `json:"plugin_unique_identifier"`
  19. EndpointsActive int `json:"endpoints_active"`
  20. EndpointsSetups int `json:"endpoints_setups"`
  21. InstallationID string `json:"installation_id"`
  22. Declaration *plugin_entities.PluginDeclaration `json:"declaration"`
  23. RuntimeType plugin_entities.PluginRuntimeType `json:"runtime_type"`
  24. Version manifest_entities.Version `json:"version"`
  25. CreatedAt time.Time `json:"created_at"`
  26. UpdatedAt time.Time `json:"updated_at"`
  27. Source string `json:"source"`
  28. Meta map[string]any `json:"meta"`
  29. }
  30. pluginInstallations, err := db.GetAll[models.PluginInstallation](
  31. db.Equal("tenant_id", tenant_id),
  32. db.Page(page, page_size),
  33. )
  34. if err != nil {
  35. return entities.NewErrorResponse(-500, err.Error())
  36. }
  37. data := make([]installation, 0, len(pluginInstallations))
  38. for _, plugin_installation := range pluginInstallations {
  39. pluginUniqueIdentifier, err := plugin_entities.NewPluginUniqueIdentifier(
  40. plugin_installation.PluginUniqueIdentifier,
  41. )
  42. if err != nil {
  43. return entities.NewErrorResponse(-500, err.Error())
  44. }
  45. pluginDeclaration, err := helper.CombinedGetPluginDeclaration(
  46. pluginUniqueIdentifier,
  47. tenant_id,
  48. plugin_entities.PluginRuntimeType(plugin_installation.RuntimeType),
  49. )
  50. if err != nil {
  51. return entities.NewErrorResponse(-500, err.Error())
  52. }
  53. data = append(data, installation{
  54. ID: plugin_installation.ID,
  55. Name: pluginDeclaration.Name,
  56. TenantID: plugin_installation.TenantID,
  57. PluginID: pluginUniqueIdentifier.PluginID(),
  58. PluginUniqueIdentifier: pluginUniqueIdentifier.String(),
  59. InstallationID: plugin_installation.ID,
  60. Declaration: pluginDeclaration,
  61. EndpointsSetups: plugin_installation.EndpointsSetups,
  62. EndpointsActive: plugin_installation.EndpointsActive,
  63. RuntimeType: plugin_entities.PluginRuntimeType(plugin_installation.RuntimeType),
  64. Version: pluginDeclaration.Version,
  65. CreatedAt: plugin_installation.CreatedAt,
  66. UpdatedAt: plugin_installation.UpdatedAt,
  67. Source: plugin_installation.Source,
  68. Meta: plugin_installation.Meta,
  69. })
  70. }
  71. return entities.NewSuccessResponse(data)
  72. }
  73. // Using plugin_ids to fetch plugin installations
  74. func BatchFetchPluginInstallationByIDs(tenant_id string, plugin_ids []string) *entities.Response {
  75. if len(plugin_ids) == 0 {
  76. return entities.NewSuccessResponse([]models.PluginInstallation{})
  77. }
  78. pluginInstallations, err := db.GetAll[models.PluginInstallation](
  79. db.Equal("tenant_id", tenant_id),
  80. db.InArray("plugin_id", strings.Map(plugin_ids, func(id string) any { return id })),
  81. db.Page(1, 256), // TODO: pagination
  82. )
  83. if err != nil {
  84. return entities.NewErrorResponse(-500, err.Error())
  85. }
  86. return entities.NewSuccessResponse(pluginInstallations)
  87. }
  88. // check which plugin is missing
  89. func FetchMissingPluginInstallations(tenant_id string, plugin_unique_identifiers []plugin_entities.PluginUniqueIdentifier) *entities.Response {
  90. result := make([]plugin_entities.PluginUniqueIdentifier, 0, len(plugin_unique_identifiers))
  91. if len(plugin_unique_identifiers) == 0 {
  92. return entities.NewSuccessResponse(result)
  93. }
  94. installed, err := db.GetAll[models.PluginInstallation](
  95. db.Equal("tenant_id", tenant_id),
  96. db.InArray(
  97. "plugin_unique_identifier",
  98. strings.Map(
  99. plugin_unique_identifiers,
  100. func(id plugin_entities.PluginUniqueIdentifier) any {
  101. return id.String()
  102. },
  103. ),
  104. ),
  105. db.Page(1, 256), // TODO: pagination
  106. )
  107. if err != nil {
  108. return entities.NewErrorResponse(-500, err.Error())
  109. }
  110. // check which plugin is missing
  111. for _, pluginUniqueIdentifier := range plugin_unique_identifiers {
  112. found := false
  113. for _, installed_plugin := range installed {
  114. if installed_plugin.PluginUniqueIdentifier == pluginUniqueIdentifier.String() {
  115. found = true
  116. break
  117. }
  118. }
  119. if !found {
  120. result = append(result, pluginUniqueIdentifier)
  121. }
  122. }
  123. return entities.NewSuccessResponse(result)
  124. }
  125. func ListTools(tenant_id string, page int, page_size int) *entities.Response {
  126. providers, err := db.GetAll[models.ToolInstallation](
  127. db.Equal("tenant_id", tenant_id),
  128. db.Page(page, page_size),
  129. )
  130. if err != nil {
  131. return entities.NewErrorResponse(-500, err.Error())
  132. }
  133. return entities.NewSuccessResponse(providers)
  134. }
  135. func ListModels(tenant_id string, page int, page_size int) *entities.Response {
  136. providers, err := db.GetAll[models.AIModelInstallation](
  137. db.Equal("tenant_id", tenant_id),
  138. db.Page(page, page_size),
  139. )
  140. if err != nil {
  141. return entities.NewErrorResponse(-500, err.Error())
  142. }
  143. return entities.NewSuccessResponse(providers)
  144. }
  145. func GetTool(tenant_id string, plugin_id string, provider string) *entities.Response {
  146. // try get tool
  147. tool, err := db.GetOne[models.ToolInstallation](
  148. db.Equal("tenant_id", tenant_id),
  149. db.Equal("plugin_id", plugin_id),
  150. )
  151. if err != nil {
  152. return entities.NewErrorResponse(-500, err.Error())
  153. }
  154. if tool.Provider != provider {
  155. return entities.NewErrorResponse(-404, "tool not found")
  156. }
  157. return entities.NewSuccessResponse(tool)
  158. }