Feat/workflow phase2 (#4687)

This commit is contained in:
Yeuoly
2024-05-27 22:01:11 +08:00
committed by GitHub
parent 45deaee762
commit e852a21634
139 changed files with 5997 additions and 779 deletions

View File

@@ -1,7 +1,6 @@
from typing import Any
from core.tools.entities.common_entities import I18nObject
from core.tools.entities.tool_bundle import ApiBasedToolBundle
from core.tools.entities.tool_bundle import ApiToolBundle
from core.tools.entities.tool_entities import (
ApiProviderAuthType,
ToolCredentialsOption,
@@ -15,11 +14,11 @@ from extensions.ext_database import db
from models.tools import ApiToolProvider
class ApiBasedToolProviderController(ToolProviderController):
class ApiToolProviderController(ToolProviderController):
provider_id: str
@staticmethod
def from_db(db_provider: ApiToolProvider, auth_type: ApiProviderAuthType) -> 'ApiBasedToolProviderController':
def from_db(db_provider: ApiToolProvider, auth_type: ApiProviderAuthType) -> 'ApiToolProviderController':
credentials_schema = {
'auth_type': ToolProviderCredentials(
name='auth_type',
@@ -79,9 +78,11 @@ class ApiBasedToolProviderController(ToolProviderController):
else:
raise ValueError(f'invalid auth type {auth_type}')
return ApiBasedToolProviderController(**{
user_name = db_provider.user.name if db_provider.user_id else ''
return ApiToolProviderController(**{
'identity': {
'author': db_provider.user.name if db_provider.user_id and db_provider.user else '',
'author': user_name,
'name': db_provider.name,
'label': {
'en_US': db_provider.name,
@@ -98,16 +99,10 @@ class ApiBasedToolProviderController(ToolProviderController):
})
@property
def app_type(self) -> ToolProviderType:
return ToolProviderType.API_BASED
def _validate_credentials(self, tool_name: str, credentials: dict[str, Any]) -> None:
pass
def provider_type(self) -> ToolProviderType:
return ToolProviderType.API
def validate_parameters(self, tool_name: str, tool_parameters: dict[str, Any]) -> None:
pass
def _parse_tool_bundle(self, tool_bundle: ApiBasedToolBundle) -> ApiTool:
def _parse_tool_bundle(self, tool_bundle: ApiToolBundle) -> ApiTool:
"""
parse tool bundle to tool
@@ -136,7 +131,7 @@ class ApiBasedToolProviderController(ToolProviderController):
'parameters' : tool_bundle.parameters if tool_bundle.parameters else [],
})
def load_bundled_tools(self, tools: list[ApiBasedToolBundle]) -> list[ApiTool]:
def load_bundled_tools(self, tools: list[ApiToolBundle]) -> list[ApiTool]:
"""
load bundled tools

View File

@@ -11,10 +11,10 @@ from models.tools import PublishedAppTool
logger = logging.getLogger(__name__)
class AppBasedToolProviderEntity(ToolProviderController):
class AppToolProviderEntity(ToolProviderController):
@property
def app_type(self) -> ToolProviderType:
return ToolProviderType.APP_BASED
def provider_type(self) -> ToolProviderType:
return ToolProviderType.APP
def _validate_credentials(self, tool_name: str, credentials: dict[str, Any]) -> None:
pass

View File

@@ -1,6 +1,6 @@
import os.path
from core.tools.entities.user_entities import UserToolProvider
from core.tools.entities.api_entities import UserToolProvider
from core.utils.position_helper import get_position_map, sort_by_position_map

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.aippt.tools.aippt import AIPPTGenerateTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,3 +10,9 @@ class AIPPTProvider(BuiltinToolProviderController):
AIPPTGenerateTool._get_api_token(credentials, user_id='__dify_system__')
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.PRODUCTIVITY,
ToolLabelEnum.DESIGN,
]

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.arxiv.tools.arxiv_search import ArxivSearchTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -7,7 +8,7 @@ class ArxivProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
try:
ArxivSearchTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -17,4 +18,9 @@ class ArxivProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SEARCH,
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.azuredalle.tools.dalle3 import DallE3Tool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,7 +10,7 @@ class AzureDALLEProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
DallE3Tool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -22,3 +23,8 @@ class AzureDALLEProvider(BuiltinToolProviderController):
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.IMAGE
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.bing.tools.bing_web_search import BingSearchTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,7 +10,7 @@ class BingProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
BingSearchTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).validate_credentials(
@@ -21,3 +22,8 @@ class BingProvider(BuiltinToolProviderController):
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SEARCH
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.brave.tools.brave_search import BraveSearchTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,7 +10,7 @@ class BraveProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
BraveSearchTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -19,4 +20,9 @@ class BraveProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SEARCH,
]

View File

@@ -2,6 +2,7 @@ import matplotlib.pyplot as plt
from fontTools.ttLib import TTFont
from matplotlib.font_manager import findSystemFonts
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.chart.tools.line import LinearChartTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -44,7 +45,7 @@ class ChartProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
try:
LinearChartTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -54,4 +55,9 @@ class ChartProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.DESIGN, ToolLabelEnum.PRODUCTIVITY, ToolLabelEnum.UTILITIES
]

View File

@@ -1,8 +1,14 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
class CodeToolProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
pass
pass
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.PRODUCTIVITY
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.dalle.tools.dalle2 import DallE2Tool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,7 +10,7 @@ class DALLEProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
DallE2Tool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -21,4 +22,9 @@ class DALLEProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.IMAGE, ToolLabelEnum.PRODUCTIVITY
]

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.devdocs.tools.searchDevDocs import SearchDevDocsTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -7,7 +8,7 @@ class DevDocsProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
try:
SearchDevDocsTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -18,4 +19,9 @@ class DevDocsProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SEARCH, ToolLabelEnum.PRODUCTIVITY
]

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.provider.builtin.dingtalk.tools.dingtalk_group_bot import DingTalkGroupBotTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -6,3 +7,8 @@ class DingTalkProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
DingTalkGroupBotTool()
pass
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SOCIAL
]

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.duckduckgo.tools.duckduckgo_search import DuckDuckGoSearchTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -7,7 +8,7 @@ class DuckDuckGoProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
try:
DuckDuckGoSearchTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -17,4 +18,9 @@ class DuckDuckGoProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SEARCH
]

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.provider.builtin.feishu.tools.feishu_group_bot import FeishuGroupBotTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -6,3 +7,8 @@ class FeishuProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
FeishuGroupBotTool()
pass
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SOCIAL
]

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.firecrawl.tools.crawl import CrawlTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -8,7 +9,7 @@ class FirecrawlProvider(BuiltinToolProviderController):
try:
# Example validation using the Crawl tool
CrawlTool().fork_tool_runtime(
meta={"credentials": credentials}
runtime={"credentials": credentials}
).invoke(
user_id='',
tool_parameters={
@@ -20,4 +21,9 @@ class FirecrawlProvider(BuiltinToolProviderController):
}
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SEARCH, ToolLabelEnum.UTILITIES
]

View File

@@ -2,6 +2,7 @@ import urllib.parse
import requests
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -24,3 +25,9 @@ class GaodeProvider(BuiltinToolProviderController):
raise ToolProviderCredentialValidationError("Gaode API Key is invalid. {}".format(e))
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.UTILITIES, ToolLabelEnum.PRODUCTIVITY,
ToolLabelEnum.WEATHER, ToolLabelEnum.TRAVEL
]

View File

@@ -1,5 +1,6 @@
import requests
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -30,3 +31,8 @@ class GihubProvider(BuiltinToolProviderController):
raise ToolProviderCredentialValidationError("Github API Key and Api Version is invalid. {}".format(e))
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.UTILITIES
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.google.tools.google_search import GoogleSearchTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,7 +10,7 @@ class GoogleProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
GoogleSearchTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -20,4 +21,9 @@ class GoogleProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SEARCH
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,4 +10,9 @@ class GoogleProvider(BuiltinToolProviderController):
try:
pass
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SEARCH, ToolLabelEnum.PRODUCTIVITY
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.judge0ce.tools.executeCode import ExecuteCodeTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,7 +10,7 @@ class Judge0CEProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
ExecuteCodeTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -20,4 +21,9 @@ class Judge0CEProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.OTHER, ToolLabelEnum.UTILITIES
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.maths.tools.eval_expression import EvaluateExpressionTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -16,3 +17,8 @@ class MathsProvider(BuiltinToolProviderController):
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.UTILITIES, ToolLabelEnum.PRODUCTIVITY
]

View File

@@ -1,5 +1,6 @@
import requests
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -34,3 +35,8 @@ class OpenweatherProvider(BuiltinToolProviderController):
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.WEATHER
]

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.pubmed.tools.pubmed_search import PubMedSearchTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -7,7 +8,7 @@ class PubMedProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
try:
PubMedSearchTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -17,4 +18,9 @@ class PubMedProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.MEDICAL, ToolLabelEnum.SEARCH
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.qrcode.tools.qrcode_generator import QRCodeGeneratorTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -14,3 +15,8 @@ class QRCodeProvider(BuiltinToolProviderController):
})
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.UTILITIES
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.searxng.tools.searxng_search import SearXNGSearchTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,7 +10,7 @@ class SearXNGProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
SearXNGSearchTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -22,4 +23,9 @@ class SearXNGProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SEARCH, ToolLabelEnum.PRODUCTIVITY
]

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.provider.builtin.slack.tools.slack_webhook import SlackWebhookTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -6,3 +7,8 @@ class SlackProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
SlackWebhookTool()
pass
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SOCIAL
]

View File

@@ -1,5 +1,6 @@
import json
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.spark.tools.spark_img_generation import spark_response
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -38,3 +39,8 @@ class SparkProvider(BuiltinToolProviderController):
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.IMAGE
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.provider.builtin.stability.tools.base import BaseStabilityAuthorization
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -12,4 +13,9 @@ class StabilityToolProvider(BuiltinToolProviderController, BaseStabilityAuthoriz
"""
This method is responsible for validating the credentials.
"""
self.sd_validate_credentials(credentials)
self.sd_validate_credentials(credentials)
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.IMAGE
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.stablediffusion.tools.stable_diffusion import StableDiffusionTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,9 +10,14 @@ class StableDiffusionProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
StableDiffusionTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).validate_models()
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.IMAGE
]

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.stackexchange.tools.searchStackExQuestions import SearchStackExQuestionsTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -7,7 +8,7 @@ class StackExchangeProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
try:
SearchStackExQuestionsTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -22,4 +23,9 @@ class StackExchangeProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SEARCH, ToolLabelEnum.UTILITIES
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.tavily.tools.tavily_search import TavilySearchTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,7 +10,7 @@ class TavilyProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
TavilySearchTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -26,4 +27,9 @@ class TavilyProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SEARCH
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.time.tools.current_time import CurrentTimeTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -13,4 +14,9 @@ class WikiPediaProvider(BuiltinToolProviderController):
tool_parameters={},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.UTILITIES
]

View File

@@ -2,6 +2,7 @@ from typing import Any
import requests
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -31,4 +32,9 @@ class TrelloProvider(BuiltinToolProviderController):
raise ToolProviderCredentialValidationError("Error validating Trello credentials")
except requests.exceptions.RequestException as e:
# Handle other exceptions, such as connection errors
raise ToolProviderCredentialValidationError("Error validating Trello credentials")
raise ToolProviderCredentialValidationError("Error validating Trello credentials")
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.PRODUCTIVITY
]

View File

@@ -3,6 +3,7 @@ from typing import Any
from twilio.base.exceptions import TwilioRestException
from twilio.rest import Client
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -26,4 +27,9 @@ class TwilioProvider(BuiltinToolProviderController):
except KeyError as e:
raise ToolProviderCredentialValidationError(f"Missing required credential: {e}") from e
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SOCIAL
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.vectorizer.tools.vectorizer import VectorizerTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,7 +10,7 @@ class VectorizerProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
VectorizerTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -20,4 +21,9 @@ class VectorizerProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.PRODUCTIVITY, ToolLabelEnum.IMAGE
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.webscraper.tools.webscraper import WebscraperTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,7 +10,7 @@ class WebscraperProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
WebscraperTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -20,4 +21,9 @@ class WebscraperProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.PRODUCTIVITY
]

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.provider.builtin.wecom.tools.wecom_group_bot import WecomGroupBotTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -6,3 +7,8 @@ class WecomProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
WecomGroupBotTool()
pass
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SOCIAL
]

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.wikipedia.tools.wikipedia_search import WikiPediaSearchTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -7,7 +8,7 @@ class WikiPediaProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
try:
WikiPediaSearchTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -17,4 +18,9 @@ class WikiPediaProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.SEARCH
]

View File

@@ -1,5 +1,6 @@
from typing import Any
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.wolframalpha.tools.wolframalpha import WolframAlphaTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -9,7 +10,7 @@ class GoogleProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
try:
WolframAlphaTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -19,4 +20,9 @@ class GoogleProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.PRODUCTIVITY, ToolLabelEnum.UTILITIES
]

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.yahoo.tools.ticker import YahooFinanceSearchTickerTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -7,7 +8,7 @@ class YahooFinanceProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
try:
YahooFinanceSearchTickerTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -17,4 +18,9 @@ class YahooFinanceProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.BUSINESS, ToolLabelEnum.FINANCE
]

View File

@@ -1,3 +1,4 @@
from core.tools.entities.values import ToolLabelEnum
from core.tools.errors import ToolProviderCredentialValidationError
from core.tools.provider.builtin.youtube.tools.videos import YoutubeVideosAnalyticsTool
from core.tools.provider.builtin_tool_provider import BuiltinToolProviderController
@@ -7,7 +8,7 @@ class YahooFinanceProvider(BuiltinToolProviderController):
def _validate_credentials(self, credentials: dict) -> None:
try:
YoutubeVideosAnalyticsTool().fork_tool_runtime(
meta={
runtime={
"credentials": credentials,
}
).invoke(
@@ -19,4 +20,9 @@ class YahooFinanceProvider(BuiltinToolProviderController):
},
)
except Exception as e:
raise ToolProviderCredentialValidationError(str(e))
raise ToolProviderCredentialValidationError(str(e))
def _get_tool_labels(self) -> list[ToolLabelEnum]:
return [
ToolLabelEnum.VIDEOS
]

View File

@@ -2,8 +2,9 @@ from abc import abstractmethod
from os import listdir, path
from typing import Any
from core.tools.entities.api_entities import UserToolProviderCredentials
from core.tools.entities.tool_entities import ToolParameter, ToolProviderCredentials, ToolProviderType
from core.tools.entities.user_entities import UserToolProviderCredentials
from core.tools.entities.values import ToolLabelEnum, default_tool_label_dict
from core.tools.errors import (
ToolNotFoundError,
ToolParameterValidationError,
@@ -19,7 +20,7 @@ from core.utils.module_import_helper import load_single_subclass_from_source
class BuiltinToolProviderController(ToolProviderController):
def __init__(self, **data: Any) -> None:
if self.app_type == ToolProviderType.API_BASED or self.app_type == ToolProviderType.APP_BASED:
if self.provider_type == ToolProviderType.API or self.provider_type == ToolProviderType.APP:
super().__init__(**data)
return
@@ -129,13 +130,29 @@ class BuiltinToolProviderController(ToolProviderController):
len(self.credentials_schema) != 0
@property
def app_type(self) -> ToolProviderType:
def provider_type(self) -> ToolProviderType:
"""
returns the type of the provider
:return: type of the provider
"""
return ToolProviderType.BUILT_IN
@property
def tool_labels(self) -> list[str]:
"""
returns the labels of the provider
:return: labels of the provider
"""
label_enums = self._get_tool_labels()
return [default_tool_label_dict[label].name for label in label_enums]
def _get_tool_labels(self) -> list[ToolLabelEnum]:
"""
returns the labels of the provider
"""
return []
def validate_parameters(self, tool_id: int, tool_name: str, tool_parameters: dict[str, Any]) -> None:
"""

View File

@@ -3,13 +3,13 @@ from typing import Any, Optional
from pydantic import BaseModel
from core.tools.entities.api_entities import UserToolProviderCredentials
from core.tools.entities.tool_entities import (
ToolParameter,
ToolProviderCredentials,
ToolProviderIdentity,
ToolProviderType,
)
from core.tools.entities.user_entities import UserToolProviderCredentials
from core.tools.errors import ToolNotFoundError, ToolParameterValidationError, ToolProviderCredentialValidationError
from core.tools.tool.tool import Tool
@@ -67,7 +67,7 @@ class ToolProviderController(BaseModel, ABC):
return tool.parameters
@property
def app_type(self) -> ToolProviderType:
def provider_type(self) -> ToolProviderType:
"""
returns the type of the provider
@@ -197,26 +197,4 @@ class ToolProviderController(BaseModel, ABC):
default_value = str(default_value)
credentials[credential_name] = default_value
def validate_credentials(self, credentials: dict[str, Any]) -> None:
"""
validate the credentials of the provider
:param tool_name: the name of the tool, defined in `get_tools`
:param credentials: the credentials of the tool
"""
# validate credentials format
self.validate_credentials_format(credentials)
# validate credentials
self._validate_credentials(credentials)
@abstractmethod
def _validate_credentials(self, credentials: dict[str, Any]) -> None:
"""
validate the credentials of the provider
:param tool_name: the name of the tool, defined in `get_tools`
:param credentials: the credentials of the tool
"""
pass

View File

@@ -0,0 +1,230 @@
from typing import Optional
from core.app.app_config.entities import VariableEntity
from core.app.apps.workflow.app_config_manager import WorkflowAppConfigManager
from core.model_runtime.entities.common_entities import I18nObject
from core.tools.entities.tool_entities import (
ToolDescription,
ToolIdentity,
ToolParameter,
ToolParameterOption,
ToolProviderType,
)
from core.tools.provider.tool_provider import ToolProviderController
from core.tools.tool.workflow_tool import WorkflowTool
from core.tools.utils.workflow_configuration_sync import WorkflowToolConfigurationUtils
from extensions.ext_database import db
from models.model import App, AppMode
from models.tools import WorkflowToolProvider
from models.workflow import Workflow
class WorkflowToolProviderController(ToolProviderController):
provider_id: str
@classmethod
def from_db(cls, db_provider: WorkflowToolProvider) -> 'WorkflowToolProviderController':
app = db_provider.app
if not app:
raise ValueError('app not found')
controller = WorkflowToolProviderController(**{
'identity': {
'author': db_provider.user.name if db_provider.user_id and db_provider.user else '',
'name': db_provider.label,
'label': {
'en_US': db_provider.label,
'zh_Hans': db_provider.label
},
'description': {
'en_US': db_provider.description,
'zh_Hans': db_provider.description
},
'icon': db_provider.icon,
},
'credentials_schema': {},
'provider_id': db_provider.id or '',
})
# init tools
controller.tools = [controller._get_db_provider_tool(db_provider, app)]
return controller
@property
def provider_type(self) -> ToolProviderType:
return ToolProviderType.WORKFLOW
def _get_db_provider_tool(self, db_provider: WorkflowToolProvider, app: App) -> WorkflowTool:
"""
get db provider tool
:param db_provider: the db provider
:param app: the app
:return: the tool
"""
workflow: Workflow = db.session.query(Workflow).filter(
Workflow.app_id == db_provider.app_id,
Workflow.version == db_provider.version
).first()
if not workflow:
raise ValueError('workflow not found')
# fetch start node
graph: dict = workflow.graph_dict
features_dict: dict = workflow.features_dict
features = WorkflowAppConfigManager.convert_features(
config_dict=features_dict,
app_mode=AppMode.WORKFLOW
)
parameters = db_provider.parameter_configurations
variables = WorkflowToolConfigurationUtils.get_workflow_graph_variables(graph)
def fetch_workflow_variable(variable_name: str) -> VariableEntity:
return next(filter(lambda x: x.variable == variable_name, variables), None)
user = db_provider.user
workflow_tool_parameters = []
for parameter in parameters:
variable = fetch_workflow_variable(parameter.name)
if variable:
parameter_type = None
options = None
if variable.type in [
VariableEntity.Type.TEXT_INPUT,
VariableEntity.Type.PARAGRAPH,
]:
parameter_type = ToolParameter.ToolParameterType.STRING
elif variable.type in [
VariableEntity.Type.SELECT
]:
parameter_type = ToolParameter.ToolParameterType.SELECT
elif variable.type in [
VariableEntity.Type.NUMBER
]:
parameter_type = ToolParameter.ToolParameterType.NUMBER
else:
raise ValueError(f'unsupported variable type {variable.type}')
if variable.type == VariableEntity.Type.SELECT and variable.options:
options = [
ToolParameterOption(
value=option,
label=I18nObject(
en_US=option,
zh_Hans=option
)
) for option in variable.options
]
workflow_tool_parameters.append(
ToolParameter(
name=parameter.name,
label=I18nObject(
en_US=variable.label,
zh_Hans=variable.label
),
human_description=I18nObject(
en_US=parameter.description,
zh_Hans=parameter.description
),
type=parameter_type,
form=parameter.form,
llm_description=parameter.description,
required=variable.required,
options=options,
default=variable.default
)
)
elif features.file_upload:
workflow_tool_parameters.append(
ToolParameter(
name=parameter.name,
label=I18nObject(
en_US=parameter.name,
zh_Hans=parameter.name
),
human_description=I18nObject(
en_US=parameter.description,
zh_Hans=parameter.description
),
type=ToolParameter.ToolParameterType.FILE,
llm_description=parameter.description,
required=False,
form=parameter.form,
)
)
else:
raise ValueError('variable not found')
return WorkflowTool(
identity=ToolIdentity(
author=user.name if user else '',
name=db_provider.name,
label=I18nObject(
en_US=db_provider.label,
zh_Hans=db_provider.label
),
provider=self.provider_id,
icon=db_provider.icon,
),
description=ToolDescription(
human=I18nObject(
en_US=db_provider.description,
zh_Hans=db_provider.description
),
llm=db_provider.description,
),
parameters=workflow_tool_parameters,
is_team_authorization=True,
workflow_app_id=app.id,
workflow_entities={
'app': app,
'workflow': workflow,
},
version=db_provider.version,
workflow_call_depth=0,
label=db_provider.label
)
def get_tools(self, user_id: str, tenant_id: str) -> list[WorkflowTool]:
"""
fetch tools from database
:param user_id: the user id
:param tenant_id: the tenant id
:return: the tools
"""
if self.tools is not None:
return self.tools
db_providers: WorkflowToolProvider = db.session.query(WorkflowToolProvider).filter(
WorkflowToolProvider.tenant_id == tenant_id,
WorkflowToolProvider.app_id == self.provider_id,
).first()
if not db_providers:
return []
self.tools = [self._get_db_provider_tool(db_providers, db_providers.app)]
return self.tools
def get_tool(self, tool_name: str) -> Optional[WorkflowTool]:
"""
get tool by name
:param tool_name: the name of the tool
:return: the tool
"""
if self.tools is None:
return None
for tool in self.tools:
if tool.identity.name == tool_name:
return tool
return None