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.

configuration.py 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. from copy import deepcopy
  2. from typing import Any
  3. from core.helper import encrypter
  4. from core.helper.tool_parameter_cache import ToolParameterCache, ToolParameterCacheType
  5. from core.tools.__base.tool import Tool
  6. from core.tools.entities.tool_entities import (
  7. ToolParameter,
  8. ToolProviderType,
  9. )
  10. class ToolParameterConfigurationManager:
  11. """
  12. Tool parameter configuration manager
  13. """
  14. tenant_id: str
  15. tool_runtime: Tool
  16. provider_name: str
  17. provider_type: ToolProviderType
  18. identity_id: str
  19. def __init__(
  20. self, tenant_id: str, tool_runtime: Tool, provider_name: str, provider_type: ToolProviderType, identity_id: str
  21. ) -> None:
  22. self.tenant_id = tenant_id
  23. self.tool_runtime = tool_runtime
  24. self.provider_name = provider_name
  25. self.provider_type = provider_type
  26. self.identity_id = identity_id
  27. def _deep_copy(self, parameters: dict[str, Any]) -> dict[str, Any]:
  28. """
  29. deep copy parameters
  30. """
  31. return deepcopy(parameters)
  32. def _merge_parameters(self) -> list[ToolParameter]:
  33. """
  34. merge parameters
  35. """
  36. # get tool parameters
  37. tool_parameters = self.tool_runtime.entity.parameters or []
  38. # get tool runtime parameters
  39. runtime_parameters = self.tool_runtime.get_runtime_parameters()
  40. # override parameters
  41. current_parameters = tool_parameters.copy()
  42. for runtime_parameter in runtime_parameters:
  43. found = False
  44. for index, parameter in enumerate(current_parameters):
  45. if parameter.name == runtime_parameter.name and parameter.form == runtime_parameter.form:
  46. current_parameters[index] = runtime_parameter
  47. found = True
  48. break
  49. if not found and runtime_parameter.form == ToolParameter.ToolParameterForm.FORM:
  50. current_parameters.append(runtime_parameter)
  51. return current_parameters
  52. def mask_tool_parameters(self, parameters: dict[str, Any]) -> dict[str, Any]:
  53. """
  54. mask tool parameters
  55. return a deep copy of parameters with masked values
  56. """
  57. parameters = self._deep_copy(parameters)
  58. # override parameters
  59. current_parameters = self._merge_parameters()
  60. for parameter in current_parameters:
  61. if (
  62. parameter.form == ToolParameter.ToolParameterForm.FORM
  63. and parameter.type == ToolParameter.ToolParameterType.SECRET_INPUT
  64. ):
  65. if parameter.name in parameters:
  66. if len(parameters[parameter.name]) > 6:
  67. parameters[parameter.name] = (
  68. parameters[parameter.name][:2]
  69. + "*" * (len(parameters[parameter.name]) - 4)
  70. + parameters[parameter.name][-2:]
  71. )
  72. else:
  73. parameters[parameter.name] = "*" * len(parameters[parameter.name])
  74. return parameters
  75. def encrypt_tool_parameters(self, parameters: dict[str, Any]) -> dict[str, Any]:
  76. """
  77. encrypt tool parameters with tenant id
  78. return a deep copy of parameters with encrypted values
  79. """
  80. # override parameters
  81. current_parameters = self._merge_parameters()
  82. parameters = self._deep_copy(parameters)
  83. for parameter in current_parameters:
  84. if (
  85. parameter.form == ToolParameter.ToolParameterForm.FORM
  86. and parameter.type == ToolParameter.ToolParameterType.SECRET_INPUT
  87. ):
  88. if parameter.name in parameters:
  89. encrypted = encrypter.encrypt_token(self.tenant_id, parameters[parameter.name])
  90. parameters[parameter.name] = encrypted
  91. return parameters
  92. def decrypt_tool_parameters(self, parameters: dict[str, Any]) -> dict[str, Any]:
  93. """
  94. decrypt tool parameters with tenant id
  95. return a deep copy of parameters with decrypted values
  96. """
  97. cache = ToolParameterCache(
  98. tenant_id=self.tenant_id,
  99. provider=f"{self.provider_type.value}.{self.provider_name}",
  100. tool_name=self.tool_runtime.entity.identity.name,
  101. cache_type=ToolParameterCacheType.PARAMETER,
  102. identity_id=self.identity_id,
  103. )
  104. cached_parameters = cache.get()
  105. if cached_parameters:
  106. return cached_parameters
  107. # override parameters
  108. current_parameters = self._merge_parameters()
  109. has_secret_input = False
  110. for parameter in current_parameters:
  111. if (
  112. parameter.form == ToolParameter.ToolParameterForm.FORM
  113. and parameter.type == ToolParameter.ToolParameterType.SECRET_INPUT
  114. ):
  115. if parameter.name in parameters:
  116. try:
  117. has_secret_input = True
  118. parameters[parameter.name] = encrypter.decrypt_token(self.tenant_id, parameters[parameter.name])
  119. except Exception:
  120. pass
  121. if has_secret_input:
  122. cache.set(parameters)
  123. return parameters
  124. def delete_tool_parameters_cache(self):
  125. cache = ToolParameterCache(
  126. tenant_id=self.tenant_id,
  127. provider=f"{self.provider_type.value}.{self.provider_name}",
  128. tool_name=self.tool_runtime.entity.identity.name,
  129. cache_type=ToolParameterCacheType.PARAMETER,
  130. identity_id=self.identity_id,
  131. )
  132. cache.delete()