您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

plugin_parameter_service.py 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. from collections.abc import Mapping, Sequence
  2. from typing import Any, Literal
  3. from sqlalchemy.orm import Session
  4. from core.plugin.entities.parameters import PluginParameterOption
  5. from core.plugin.impl.dynamic_select import DynamicSelectClient
  6. from core.tools.tool_manager import ToolManager
  7. from core.tools.utils.encryption import create_tool_provider_encrypter
  8. from extensions.ext_database import db
  9. from models.tools import BuiltinToolProvider
  10. class PluginParameterService:
  11. @staticmethod
  12. def get_dynamic_select_options(
  13. tenant_id: str,
  14. user_id: str,
  15. plugin_id: str,
  16. provider: str,
  17. action: str,
  18. parameter: str,
  19. provider_type: Literal["tool"],
  20. ) -> Sequence[PluginParameterOption]:
  21. """
  22. Get dynamic select options for a plugin parameter.
  23. Args:
  24. tenant_id: The tenant ID.
  25. plugin_id: The plugin ID.
  26. provider: The provider name.
  27. action: The action name.
  28. parameter: The parameter name.
  29. """
  30. credentials: Mapping[str, Any] = {}
  31. match provider_type:
  32. case "tool":
  33. provider_controller = ToolManager.get_builtin_provider(provider, tenant_id)
  34. # init tool configuration
  35. encrypter, _ = create_tool_provider_encrypter(
  36. tenant_id=tenant_id,
  37. controller=provider_controller,
  38. )
  39. # check if credentials are required
  40. if not provider_controller.need_credentials:
  41. credentials = {}
  42. else:
  43. # fetch credentials from db
  44. with Session(db.engine) as session:
  45. db_record = (
  46. session.query(BuiltinToolProvider)
  47. .where(
  48. BuiltinToolProvider.tenant_id == tenant_id,
  49. BuiltinToolProvider.provider == provider,
  50. )
  51. .first()
  52. )
  53. if db_record is None:
  54. raise ValueError(f"Builtin provider {provider} not found when fetching credentials")
  55. credentials = encrypter.decrypt(db_record.credentials)
  56. case _:
  57. raise ValueError(f"Invalid provider type: {provider_type}")
  58. return (
  59. DynamicSelectClient()
  60. .fetch_dynamic_select_options(tenant_id, user_id, plugin_id, provider, action, credentials, parameter)
  61. .options
  62. )