plugin.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import datetime
  2. from collections.abc import Mapping
  3. from enum import Enum
  4. from typing import Any, Optional
  5. from pydantic import BaseModel, Field, model_validator
  6. from core.model_runtime.entities.provider_entities import ProviderEntity
  7. from core.plugin.entities.base import BasePluginEntity
  8. from core.plugin.entities.endpoint import EndpointProviderDeclaration
  9. from core.tools.entities.common_entities import I18nObject
  10. from core.tools.entities.tool_entities import ToolProviderEntity
  11. class PluginInstallationSource(str, Enum):
  12. Github = "github"
  13. Marketplace = "marketplace"
  14. Package = "package"
  15. Remote = "remote"
  16. class PluginResourceRequirements(BaseModel):
  17. memory: int
  18. class Permission(BaseModel):
  19. class Tool(BaseModel):
  20. enabled: Optional[bool] = Field(default=False)
  21. class Model(BaseModel):
  22. enabled: Optional[bool] = Field(default=False)
  23. llm: Optional[bool] = Field(default=False)
  24. text_embedding: Optional[bool] = Field(default=False)
  25. rerank: Optional[bool] = Field(default=False)
  26. tts: Optional[bool] = Field(default=False)
  27. speech2text: Optional[bool] = Field(default=False)
  28. moderation: Optional[bool] = Field(default=False)
  29. class Node(BaseModel):
  30. enabled: Optional[bool] = Field(default=False)
  31. class Endpoint(BaseModel):
  32. enabled: Optional[bool] = Field(default=False)
  33. class Storage(BaseModel):
  34. enabled: Optional[bool] = Field(default=False)
  35. size: int = Field(ge=1024, le=1073741824, default=1048576)
  36. tool: Optional[Tool] = Field(default=None)
  37. model: Optional[Model] = Field(default=None)
  38. node: Optional[Node] = Field(default=None)
  39. endpoint: Optional[Endpoint] = Field(default=None)
  40. storage: Storage = Field(default=None)
  41. permission: Optional[Permission]
  42. class PluginCategory(str, Enum):
  43. Tool = "tool"
  44. Model = "model"
  45. Extension = "extension"
  46. class PluginDeclaration(BaseModel):
  47. class Plugins(BaseModel):
  48. tools: Optional[list[str]] = Field(default_factory=list)
  49. models: Optional[list[str]] = Field(default_factory=list)
  50. endpoints: Optional[list[str]] = Field(default_factory=list)
  51. version: str = Field(..., pattern=r"^\d{1,4}(\.\d{1,4}){1,3}(-\w{1,16})?$")
  52. author: Optional[str] = Field(..., pattern=r"^[a-zA-Z0-9_-]{1,64}$")
  53. name: str = Field(..., pattern=r"^[a-z0-9_-]{1,128}$")
  54. description: I18nObject
  55. icon: str
  56. label: I18nObject
  57. category: PluginCategory
  58. created_at: datetime.datetime
  59. resource: PluginResourceRequirements
  60. plugins: Plugins
  61. verified: bool = Field(default=False)
  62. tool: Optional[ToolProviderEntity] = None
  63. model: Optional[ProviderEntity] = None
  64. endpoint: Optional[EndpointProviderDeclaration] = None
  65. @model_validator(mode="before")
  66. @classmethod
  67. def validate_category(cls, values: dict) -> dict:
  68. # auto detect category
  69. if values.get("tool"):
  70. values["category"] = PluginCategory.Tool
  71. elif values.get("model"):
  72. values["category"] = PluginCategory.Model
  73. else:
  74. values["category"] = PluginCategory.Extension
  75. return values
  76. class PluginEntity(BasePluginEntity):
  77. name: str
  78. plugin_id: str
  79. plugin_unique_identifier: str
  80. declaration: PluginDeclaration
  81. installation_id: str
  82. tenant_id: str
  83. endpoints_setups: int
  84. endpoints_active: int
  85. runtime_type: str
  86. version: str
  87. latest_version: Optional[str] = None
  88. latest_unique_identifier: Optional[str] = None
  89. source: PluginInstallationSource
  90. meta: Mapping[str, Any]
  91. @model_validator(mode="after")
  92. def set_plugin_id(self):
  93. if self.declaration.tool:
  94. self.declaration.tool.plugin_id = self.plugin_id
  95. return self
  96. class GithubPackage(BaseModel):
  97. repo: str
  98. version: str
  99. package: str
  100. class GithubVersion(BaseModel):
  101. repo: str
  102. version: str