app_tool_provider.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. from typing import Any, Dict, List
  2. from core.tools.entities.tool_entities import ToolProviderType, ToolParamter, ToolParamterOption
  3. from core.tools.tool.tool import Tool
  4. from core.tools.entities.common_entities import I18nObject
  5. from core.tools.provider.tool_provider import ToolProviderController
  6. from extensions.ext_database import db
  7. from models.tools import PublishedAppTool
  8. from models.model import App, AppModelConfig
  9. import logging
  10. logger = logging.getLogger(__name__)
  11. class AppBasedToolProviderEntity(ToolProviderController):
  12. @property
  13. def app_type(self) -> ToolProviderType:
  14. return ToolProviderType.APP_BASED
  15. def _validate_credentials(self, tool_name: str, credentials: Dict[str, Any]) -> None:
  16. pass
  17. def validate_parameters(self, tool_name: str, tool_parameters: Dict[str, Any]) -> None:
  18. pass
  19. def get_tools(self, user_id: str) -> List[Tool]:
  20. db_tools: List[PublishedAppTool] = db.session.query(PublishedAppTool).filter(
  21. PublishedAppTool.user_id == user_id,
  22. ).all()
  23. if not db_tools or len(db_tools) == 0:
  24. return []
  25. tools: List[Tool] = []
  26. for db_tool in db_tools:
  27. tool = {
  28. 'identity': {
  29. 'author': db_tool.author,
  30. 'name': db_tool.tool_name,
  31. 'label': {
  32. 'en_US': db_tool.tool_name,
  33. 'zh_Hans': db_tool.tool_name
  34. },
  35. 'icon': ''
  36. },
  37. 'description': {
  38. 'human': {
  39. 'en_US': db_tool.description_i18n.en_US,
  40. 'zh_Hans': db_tool.description_i18n.zh_Hans
  41. },
  42. 'llm': db_tool.llm_description
  43. },
  44. 'parameters': []
  45. }
  46. # get app from db
  47. app: App = db_tool.app
  48. if not app:
  49. logger.error(f"app {db_tool.app_id} not found")
  50. continue
  51. app_model_config: AppModelConfig = app.app_model_config
  52. user_input_form_list = app_model_config.user_input_form_list
  53. for input_form in user_input_form_list:
  54. # get type
  55. form_type = input_form.keys()[0]
  56. default = input_form[form_type]['default']
  57. required = input_form[form_type]['required']
  58. label = input_form[form_type]['label']
  59. variable_name = input_form[form_type]['variable_name']
  60. options = input_form[form_type].get('options', [])
  61. if form_type == 'paragraph' or form_type == 'text-input':
  62. tool['parameters'].append(ToolParamter(
  63. name=variable_name,
  64. label=I18nObject(
  65. en_US=label,
  66. zh_Hans=label
  67. ),
  68. human_description=I18nObject(
  69. en_US=label,
  70. zh_Hans=label
  71. ),
  72. llm_description=label,
  73. form=ToolParamter.ToolParameterForm.FORM,
  74. type=ToolParamter.ToolParameterType.STRING,
  75. required=required,
  76. default=default
  77. ))
  78. elif form_type == 'select':
  79. tool['parameters'].append(ToolParamter(
  80. name=variable_name,
  81. label=I18nObject(
  82. en_US=label,
  83. zh_Hans=label
  84. ),
  85. human_description=I18nObject(
  86. en_US=label,
  87. zh_Hans=label
  88. ),
  89. llm_description=label,
  90. form=ToolParamter.ToolParameterForm.FORM,
  91. type=ToolParamter.ToolParameterType.SELECT,
  92. required=required,
  93. default=default,
  94. options=[ToolParamterOption(
  95. value=option,
  96. label=I18nObject(
  97. en_US=option,
  98. zh_Hans=option
  99. )
  100. ) for option in options]
  101. ))
  102. tools.append(Tool(**tool))
  103. return tools