選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

configuration.py 5.5KB

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