plugin.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. from collections.abc import Sequence
  2. from pydantic import BaseModel
  3. from core.plugin.entities.plugin import PluginDeclaration, PluginEntity, PluginInstallationSource
  4. from core.plugin.entities.plugin_daemon import PluginInstallTask, PluginInstallTaskStartResponse
  5. from core.plugin.manager.base import BasePluginManager
  6. class PluginInstallationManager(BasePluginManager):
  7. def fetch_plugin_by_identifier(
  8. self,
  9. tenant_id: str,
  10. identifier: str,
  11. ) -> bool:
  12. return self._request_with_plugin_daemon_response(
  13. "GET",
  14. f"plugin/{tenant_id}/management/fetch/identifier",
  15. bool,
  16. params={"plugin_unique_identifier": identifier},
  17. )
  18. def list_plugins(self, tenant_id: str) -> list[PluginEntity]:
  19. return self._request_with_plugin_daemon_response(
  20. "GET",
  21. f"plugin/{tenant_id}/management/list",
  22. list[PluginEntity],
  23. params={"page": 1, "page_size": 256},
  24. )
  25. def upload_pkg(
  26. self,
  27. tenant_id: str,
  28. pkg: bytes,
  29. verify_signature: bool = False,
  30. ) -> str:
  31. """
  32. Upload a plugin package and return the plugin unique identifier.
  33. """
  34. body = {
  35. "dify_pkg": ("dify_pkg", pkg, "application/octet-stream"),
  36. }
  37. data = {
  38. "verify_signature": "true" if verify_signature else "false",
  39. }
  40. return self._request_with_plugin_daemon_response(
  41. "POST",
  42. f"plugin/{tenant_id}/management/install/upload",
  43. str,
  44. files=body,
  45. data=data,
  46. )
  47. def install_from_identifiers(
  48. self, tenant_id: str, identifiers: Sequence[str], source: PluginInstallationSource, meta: dict
  49. ) -> PluginInstallTaskStartResponse:
  50. """
  51. Install a plugin from an identifier.
  52. """
  53. # exception will be raised if the request failed
  54. return self._request_with_plugin_daemon_response(
  55. "POST",
  56. f"plugin/{tenant_id}/management/install/identifiers",
  57. PluginInstallTaskStartResponse,
  58. data={
  59. "plugin_unique_identifiers": identifiers,
  60. "source": source,
  61. "meta": meta,
  62. },
  63. headers={"Content-Type": "application/json"},
  64. )
  65. def fetch_plugin_installation_tasks(self, tenant_id: str, page: int, page_size: int) -> Sequence[PluginInstallTask]:
  66. """
  67. Fetch plugin installation tasks.
  68. """
  69. return self._request_with_plugin_daemon_response(
  70. "GET",
  71. f"plugin/{tenant_id}/management/install/tasks",
  72. list[PluginInstallTask],
  73. params={"page": page, "page_size": page_size},
  74. )
  75. def fetch_plugin_installation_task(self, tenant_id: str, task_id: str) -> PluginInstallTask:
  76. """
  77. Fetch a plugin installation task.
  78. """
  79. return self._request_with_plugin_daemon_response(
  80. "GET",
  81. f"plugin/{tenant_id}/management/install/tasks/{task_id}",
  82. PluginInstallTask,
  83. )
  84. def delete_plugin_installation_task(self, tenant_id: str, task_id: str) -> bool:
  85. """
  86. Delete a plugin installation task.
  87. """
  88. return self._request_with_plugin_daemon_response(
  89. "POST",
  90. f"plugin/{tenant_id}/management/install/tasks/{task_id}/delete",
  91. bool,
  92. )
  93. def fetch_plugin_manifest(self, tenant_id: str, plugin_unique_identifier: str) -> PluginDeclaration:
  94. """
  95. Fetch a plugin manifest.
  96. """
  97. class PluginDeclarationResponse(BaseModel):
  98. declaration: PluginDeclaration
  99. return self._request_with_plugin_daemon_response(
  100. "GET",
  101. f"plugin/{tenant_id}/management/fetch/manifest",
  102. PluginDeclarationResponse,
  103. params={"plugin_unique_identifier": plugin_unique_identifier},
  104. ).declaration
  105. def uninstall(self, tenant_id: str, plugin_installation_id: str) -> bool:
  106. """
  107. Uninstall a plugin.
  108. """
  109. return self._request_with_plugin_daemon_response(
  110. "POST",
  111. f"plugin/{tenant_id}/management/uninstall",
  112. bool,
  113. data={
  114. "plugin_installation_id": plugin_installation_id,
  115. },
  116. headers={"Content-Type": "application/json"},
  117. )