app_tool_provider.py 4.1 KB

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