Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

plugin_parameter_service.py 2.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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.configuration import ProviderConfigEncrypter
  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. tool_configuration = ProviderConfigEncrypter(
  36. tenant_id=tenant_id,
  37. config=[x.to_basic_provider_config() for x in provider_controller.get_credentials_schema()],
  38. provider_type=provider_controller.provider_type.value,
  39. provider_identity=provider_controller.entity.identity.name,
  40. )
  41. # check if credentials are required
  42. if not provider_controller.need_credentials:
  43. credentials = {}
  44. else:
  45. # fetch credentials from db
  46. with Session(db.engine) as session:
  47. db_record = (
  48. session.query(BuiltinToolProvider)
  49. .filter(
  50. BuiltinToolProvider.tenant_id == tenant_id,
  51. BuiltinToolProvider.provider == provider,
  52. )
  53. .first()
  54. )
  55. if db_record is None:
  56. raise ValueError(f"Builtin provider {provider} not found when fetching credentials")
  57. credentials = tool_configuration.decrypt(db_record.credentials)
  58. case _:
  59. raise ValueError(f"Invalid provider type: {provider_type}")
  60. return (
  61. DynamicSelectClient()
  62. .fetch_dynamic_select_options(tenant_id, user_id, plugin_id, provider, action, credentials, parameter)
  63. .options
  64. )