dataset_retriever_tool.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. from collections.abc import Generator
  2. from typing import Any, Optional
  3. from core.app.app_config.entities import DatasetRetrieveConfigEntity
  4. from core.app.entities.app_invoke_entities import InvokeFrom
  5. from core.callback_handler.index_tool_callback_handler import DatasetIndexToolCallbackHandler
  6. from core.rag.retrieval.dataset_retrieval import DatasetRetrieval
  7. from core.tools.__base.tool import Tool
  8. from core.tools.__base.tool_runtime import ToolRuntime
  9. from core.tools.entities.common_entities import I18nObject
  10. from core.tools.entities.tool_entities import (
  11. ToolDescription,
  12. ToolEntity,
  13. ToolIdentity,
  14. ToolInvokeMessage,
  15. ToolParameter,
  16. ToolProviderType,
  17. )
  18. from core.tools.utils.dataset_retriever.dataset_retriever_base_tool import DatasetRetrieverBaseTool
  19. class DatasetRetrieverTool(Tool):
  20. def __init__(self, entity: ToolEntity, runtime: ToolRuntime, retrieval_tool: DatasetRetrieverBaseTool) -> None:
  21. super().__init__(entity, runtime)
  22. self.retrieval_tool = retrieval_tool
  23. @staticmethod
  24. def get_dataset_tools(
  25. tenant_id: str,
  26. dataset_ids: list[str],
  27. retrieve_config: DatasetRetrieveConfigEntity | None,
  28. return_resource: bool,
  29. invoke_from: InvokeFrom,
  30. hit_callback: DatasetIndexToolCallbackHandler,
  31. user_id: str,
  32. inputs: dict,
  33. ) -> list["DatasetRetrieverTool"]:
  34. """
  35. get dataset tool
  36. """
  37. # check if retrieve_config is valid
  38. if dataset_ids is None or len(dataset_ids) == 0:
  39. return []
  40. if retrieve_config is None:
  41. return []
  42. feature = DatasetRetrieval()
  43. # save original retrieve strategy, and set retrieve strategy to SINGLE
  44. # Agent only support SINGLE mode
  45. original_retriever_mode = retrieve_config.retrieve_strategy
  46. retrieve_config.retrieve_strategy = DatasetRetrieveConfigEntity.RetrieveStrategy.SINGLE
  47. retrieval_tools = feature.to_dataset_retriever_tool(
  48. tenant_id=tenant_id,
  49. dataset_ids=dataset_ids,
  50. retrieve_config=retrieve_config,
  51. return_resource=return_resource,
  52. invoke_from=invoke_from,
  53. hit_callback=hit_callback,
  54. user_id=user_id,
  55. inputs=inputs,
  56. )
  57. if retrieval_tools is None or len(retrieval_tools) == 0:
  58. return []
  59. # restore retrieve strategy
  60. retrieve_config.retrieve_strategy = original_retriever_mode
  61. # convert retrieval tools to Tools
  62. tools = []
  63. for retrieval_tool in retrieval_tools:
  64. tool = DatasetRetrieverTool(
  65. retrieval_tool=retrieval_tool,
  66. entity=ToolEntity(
  67. identity=ToolIdentity(
  68. provider="", author="", name=retrieval_tool.name, label=I18nObject(en_US="", zh_Hans="")
  69. ),
  70. parameters=[],
  71. description=ToolDescription(human=I18nObject(en_US="", zh_Hans=""), llm=retrieval_tool.description),
  72. ),
  73. runtime=ToolRuntime(tenant_id=tenant_id),
  74. )
  75. tools.append(tool)
  76. return tools
  77. def get_runtime_parameters(
  78. self,
  79. conversation_id: Optional[str] = None,
  80. app_id: Optional[str] = None,
  81. message_id: Optional[str] = None,
  82. ) -> list[ToolParameter]:
  83. return [
  84. ToolParameter(
  85. name="query",
  86. label=I18nObject(en_US="", zh_Hans=""),
  87. human_description=I18nObject(en_US="", zh_Hans=""),
  88. type=ToolParameter.ToolParameterType.STRING,
  89. form=ToolParameter.ToolParameterForm.LLM,
  90. llm_description="Query for the dataset to be used to retrieve the dataset.",
  91. required=True,
  92. default="",
  93. placeholder=I18nObject(en_US="", zh_Hans=""),
  94. ),
  95. ]
  96. def tool_provider_type(self) -> ToolProviderType:
  97. return ToolProviderType.DATASET_RETRIEVAL
  98. def _invoke(
  99. self,
  100. user_id: str,
  101. tool_parameters: dict[str, Any],
  102. conversation_id: Optional[str] = None,
  103. app_id: Optional[str] = None,
  104. message_id: Optional[str] = None,
  105. ) -> Generator[ToolInvokeMessage, None, None]:
  106. """
  107. invoke dataset retriever tool
  108. """
  109. query = tool_parameters.get("query")
  110. if not query:
  111. yield self.create_text_message(text="please input query")
  112. else:
  113. # invoke dataset retriever tool
  114. result = self.retrieval_tool._run(query=query)
  115. yield self.create_text_message(text=result)
  116. def validate_credentials(
  117. self, credentials: dict[str, Any], parameters: dict[str, Any], format_only: bool = False
  118. ) -> str | None:
  119. """
  120. validate the credentials for dataset retriever tool
  121. """
  122. pass