diff --git a/api/controllers/console/workspace/plugin.py b/api/controllers/console/workspace/plugin.py index fd3b2d3eb6..6c2bdb4154 100644 --- a/api/controllers/console/workspace/plugin.py +++ b/api/controllers/console/workspace/plugin.py @@ -503,21 +503,29 @@ class PluginFetchDynamicSelectOptionsApi(Resource): @login_required @account_initialization_required def get(self): - tenant_id = current_user.current_tenant_id - # check if the user is admin or owner if not current_user.is_admin_or_owner: raise Forbidden() + tenant_id = current_user.current_tenant_id + user_id = current_user.id + parser = reqparse.RequestParser() parser.add_argument("plugin_id", type=str, required=True, location="args") parser.add_argument("provider", type=str, required=True, location="args") parser.add_argument("action", type=str, required=True, location="args") parser.add_argument("parameter", type=str, required=True, location="args") + parser.add_argument("provider_type", type=str, required=True, location="args") args = parser.parse_args() options = PluginParameterService.get_dynamic_select_options( - tenant_id, args["plugin_id"], args["provider"], args["action"], args["parameter"] + tenant_id, + user_id, + args["plugin_id"], + args["provider"], + args["action"], + args["parameter"], + args["provider_type"], ) return jsonable_encoder({"options": options}) diff --git a/api/core/plugin/impl/dynamic_select.py b/api/core/plugin/impl/dynamic_select.py new file mode 100644 index 0000000000..f2d8b15796 --- /dev/null +++ b/api/core/plugin/impl/dynamic_select.py @@ -0,0 +1,39 @@ +from collections.abc import Mapping, Sequence +from typing import Any + +from core.plugin.entities.parameters import PluginParameterOption +from core.plugin.impl.base import BasePluginClient + + +class DynamicSelectClient(BasePluginClient): + def fetch_dynamic_select_options( + self, + tenant_id: str, + user_id: str, + plugin_id: str, + provider: str, + action: str, + credentials: Mapping[str, Any], + parameter: str, + ) -> Sequence[PluginParameterOption]: + """ + Fetch dynamic select options for a plugin parameter. + """ + return self._request_with_plugin_daemon_response( + "GET", + f"plugin/{tenant_id}/dispatch/dynamic_select/fetch_parameter_options", + list[PluginParameterOption], + data={ + "user_id": user_id, + "data": { + "provider": provider, + "credentials": credentials, + "provider_action": action, + "parameter": parameter, + }, + }, + headers={ + "X-Plugin-ID": plugin_id, + "Content-Type": "application/json", + }, + ) diff --git a/api/services/plugin/plugin_parameter_service.py b/api/services/plugin/plugin_parameter_service.py index 3db75e1fd3..aae05ea7f2 100644 --- a/api/services/plugin/plugin_parameter_service.py +++ b/api/services/plugin/plugin_parameter_service.py @@ -1,11 +1,21 @@ +from collections.abc import Sequence +from typing import Literal + from core.plugin.entities.parameters import PluginParameterOption +from core.plugin.impl.dynamic_select import DynamicSelectClient class PluginParameterService: @staticmethod def get_dynamic_select_options( - tenant_id: str, plugin_id: str, provider: str, action: str, parameter: str - ) -> list[PluginParameterOption]: + tenant_id: str, + user_id: str, + plugin_id: str, + provider: str, + action: str, + parameter: str, + provider_type: Literal["tool"], + ) -> Sequence[PluginParameterOption]: """ Get dynamic select options for a plugin parameter. @@ -14,5 +24,11 @@ class PluginParameterService: plugin_id: The plugin ID. provider: The provider name. action: The action name. + parameter: The parameter name. """ - return [] + # TODO: get credentials from db + credentials = {} + + return DynamicSelectClient().fetch_dynamic_select_options( + tenant_id, user_id, plugin_id, provider, action, credentials, parameter + ) diff --git a/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx b/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx index 93147e8c68..6eca9e6d8b 100644 --- a/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx +++ b/web/app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx @@ -329,6 +329,7 @@ const VarReferencePicker: FC = ({ const [isLoading, setIsLoading] = useState(false) const { mutateAsync: fetchDynamicOptions } = useFetchDynamicOptions( currentProvider?.plugin_id || '', currentProvider?.name || '', currentTool?.name || '', (schema as CredentialFormSchemaSelect).variable, + 'tool', ) const handleFetchDynamicOptions = async () => { if (schema?.type !== FormTypeEnum.dynamicSelect || !currentTool || !currentProvider) diff --git a/web/service/use-plugins.ts b/web/service/use-plugins.ts index 563694d5f4..ff092bb037 100644 --- a/web/service/use-plugins.ts +++ b/web/service/use-plugins.ts @@ -573,7 +573,7 @@ export const usePluginInfo = (providerName?: string) => { }) } -export const useFetchDynamicOptions = (plugin_id: string, provider: string, action: string, parameter: string) => { +export const useFetchDynamicOptions = (plugin_id: string, provider: string, action: string, parameter: string, provider_type: 'tool') => { return useMutation({ mutationFn: () => get<{ options: FormOption[] }>('/workspaces/current/plugin/parameters/dynamic-options', { params: { @@ -581,6 +581,7 @@ export const useFetchDynamicOptions = (plugin_id: string, provider: string, acti provider, action, parameter, + provider_type, }, }), })