feat: implement error handling in dynamic select options API and update response structure

pull/21425/head
Yeuoly 11 months ago
parent fb3c1c0d7e
commit abd8f5bfab

@ -518,6 +518,7 @@ class PluginFetchDynamicSelectOptionsApi(Resource):
parser.add_argument("provider_type", type=str, required=True, location="args") parser.add_argument("provider_type", type=str, required=True, location="args")
args = parser.parse_args() args = parser.parse_args()
try:
options = PluginParameterService.get_dynamic_select_options( options = PluginParameterService.get_dynamic_select_options(
tenant_id, tenant_id,
user_id, user_id,
@ -527,6 +528,8 @@ class PluginFetchDynamicSelectOptionsApi(Resource):
args["parameter"], args["parameter"],
args["provider_type"], args["provider_type"],
) )
except PluginDaemonClientSideError as e:
raise ValueError(e)
return jsonable_encoder({"options": options}) return jsonable_encoder({"options": options})

@ -1,4 +1,4 @@
from collections.abc import Mapping from collections.abc import Mapping, Sequence
from datetime import datetime from datetime import datetime
from enum import StrEnum from enum import StrEnum
from typing import Any, Generic, Optional, TypeVar from typing import Any, Generic, Optional, TypeVar
@ -9,6 +9,7 @@ from core.agent.plugin_entities import AgentProviderEntityWithPlugin
from core.model_runtime.entities.model_entities import AIModelEntity from core.model_runtime.entities.model_entities import AIModelEntity
from core.model_runtime.entities.provider_entities import ProviderEntity from core.model_runtime.entities.provider_entities import ProviderEntity
from core.plugin.entities.base import BasePluginEntity from core.plugin.entities.base import BasePluginEntity
from core.plugin.entities.parameters import PluginParameterOption
from core.plugin.entities.plugin import PluginDeclaration, PluginEntity from core.plugin.entities.plugin import PluginDeclaration, PluginEntity
from core.tools.entities.common_entities import I18nObject from core.tools.entities.common_entities import I18nObject
from core.tools.entities.tool_entities import ToolProviderEntityWithPlugin from core.tools.entities.tool_entities import ToolProviderEntityWithPlugin
@ -186,3 +187,7 @@ class PluginOAuthCredentialsResponse(BaseModel):
class PluginListResponse(BaseModel): class PluginListResponse(BaseModel):
list: list[PluginEntity] list: list[PluginEntity]
total: int total: int
class PluginDynamicSelectOptionsResponse(BaseModel):
options: Sequence[PluginParameterOption] = Field(description="The options of the dynamic select.")

@ -1,7 +1,8 @@
from collections.abc import Mapping, Sequence from collections.abc import Mapping
from typing import Any from typing import Any
from core.plugin.entities.parameters import PluginParameterOption from core.plugin.entities.plugin import GenericProviderID
from core.plugin.entities.plugin_daemon import PluginDynamicSelectOptionsResponse
from core.plugin.impl.base import BasePluginClient from core.plugin.impl.base import BasePluginClient
@ -15,18 +16,18 @@ class DynamicSelectClient(BasePluginClient):
action: str, action: str,
credentials: Mapping[str, Any], credentials: Mapping[str, Any],
parameter: str, parameter: str,
) -> Sequence[PluginParameterOption]: ) -> PluginDynamicSelectOptionsResponse:
""" """
Fetch dynamic select options for a plugin parameter. Fetch dynamic select options for a plugin parameter.
""" """
return self._request_with_plugin_daemon_response( response = self._request_with_plugin_daemon_response_stream(
"POST", "POST",
f"plugin/{tenant_id}/dispatch/dynamic_select/fetch_parameter_options", f"plugin/{tenant_id}/dispatch/dynamic_select/fetch_parameter_options",
list[PluginParameterOption], PluginDynamicSelectOptionsResponse,
data={ data={
"user_id": user_id, "user_id": user_id,
"data": { "data": {
"provider": provider, "provider": GenericProviderID(provider).provider_name,
"credentials": credentials, "credentials": credentials,
"provider_action": action, "provider_action": action,
"parameter": parameter, "parameter": parameter,
@ -37,3 +38,8 @@ class DynamicSelectClient(BasePluginClient):
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
) )
for options in response:
return options
raise ValueError("Plugin service returned no options")

@ -36,6 +36,19 @@ class PluginParameterService:
match provider_type: match provider_type:
case "tool": case "tool":
provider_controller = ToolManager.get_builtin_provider(provider, tenant_id)
# init tool configuration
tool_configuration = ProviderConfigEncrypter(
tenant_id=tenant_id,
config=[x.to_basic_provider_config() for x in provider_controller.get_credentials_schema()],
provider_type=provider_controller.provider_type.value,
provider_identity=provider_controller.entity.identity.name,
)
# check if credentials are required
if not provider_controller.need_credentials:
credentials = {}
else:
# fetch credentials from db # fetch credentials from db
with Session(db.engine) as session: with Session(db.engine) as session:
db_record = ( db_record = (
@ -50,20 +63,12 @@ class PluginParameterService:
if db_record is None: if db_record is None:
raise ValueError(f"Builtin provider {provider} not found when fetching credentials") raise ValueError(f"Builtin provider {provider} not found when fetching credentials")
credentials = db_record.credentials credentials = tool_configuration.decrypt(db_record.credentials)
provider_controller = ToolManager.get_builtin_provider(provider, tenant_id)
# init tool configuration
tool_configuration = ProviderConfigEncrypter(
tenant_id=tenant_id,
config=[x.to_basic_provider_config() for x in provider_controller.get_credentials_schema()],
provider_type=provider_controller.provider_type.value,
provider_identity=provider_controller.entity.identity.name,
)
credentials = tool_configuration.decrypt(credentials)
case _: case _:
raise ValueError(f"Invalid provider type: {provider_type}") raise ValueError(f"Invalid provider type: {provider_type}")
return DynamicSelectClient().fetch_dynamic_select_options( return (
tenant_id, user_id, plugin_id, provider, action, credentials, parameter DynamicSelectClient()
.fetch_dynamic_select_options(tenant_id, user_id, plugin_id, provider, action, credentials, parameter)
.options
) )

Loading…
Cancel
Save