mirror of
https://github.com/langgenius/dify.git
synced 2026-01-14 06:07:33 +08:00
- Refactored `PluginFetchDynamicSelectOptionsApi` to replace the `extra` argument with `credential_id`, improving clarity in dynamic option fetching. - Updated `ProviderConfigEncrypter` to rename `mask_tool_credentials` to `mask_credentials` for consistency, and added a new method to maintain backward compatibility. - Enhanced `PluginParameterService` to utilize `credential_id` for fetching subscriptions, improving the handling of trigger credentials. - Adjusted various components and types in the frontend to replace `tool_name` with `trigger_name`, ensuring consistency across the application. - Introduced `multiple` property in `TriggerParameter` to support multi-select functionality. These changes improve the integration of triggers and plugins, enhance code clarity, and align naming conventions across the codebase.
113 lines
4.9 KiB
Python
113 lines
4.9 KiB
Python
from collections.abc import Mapping, Sequence
|
|
from typing import Any, Literal
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from core.plugin.entities.parameters import PluginParameterOption
|
|
from core.plugin.entities.plugin import TriggerProviderID
|
|
from core.plugin.entities.plugin_daemon import CredentialType
|
|
from core.plugin.impl.dynamic_select import DynamicSelectClient
|
|
from core.tools.tool_manager import ToolManager
|
|
from core.tools.utils.encryption import create_tool_provider_encrypter
|
|
from core.trigger.entities.api_entities import TriggerProviderSubscriptionApiEntity
|
|
from core.trigger.entities.entities import SubscriptionBuilder
|
|
from core.trigger.trigger_manager import TriggerManager
|
|
from extensions.ext_database import db
|
|
from models.tools import BuiltinToolProvider
|
|
from services.trigger.trigger_provider_service import TriggerProviderService
|
|
from services.trigger.trigger_subscription_builder_service import TriggerSubscriptionBuilderService
|
|
|
|
|
|
class PluginParameterService:
|
|
@staticmethod
|
|
def get_dynamic_select_options(
|
|
tenant_id: str,
|
|
user_id: str,
|
|
plugin_id: str,
|
|
provider: str,
|
|
action: str,
|
|
parameter: str,
|
|
credential_id: str | None,
|
|
provider_type: Literal["tool", "trigger"],
|
|
) -> Sequence[PluginParameterOption]:
|
|
"""
|
|
Get dynamic select options for a plugin parameter.
|
|
|
|
Args:
|
|
tenant_id: The tenant ID.
|
|
plugin_id: The plugin ID.
|
|
provider: The provider name.
|
|
action: The action name.
|
|
parameter: The parameter name.
|
|
"""
|
|
credentials: Mapping[str, Any] = {}
|
|
credential_type: str = CredentialType.UNAUTHORIZED.value
|
|
match provider_type:
|
|
case "tool":
|
|
provider_controller = ToolManager.get_builtin_provider(provider, tenant_id)
|
|
# init tool configuration
|
|
encrypter, _ = create_tool_provider_encrypter(
|
|
tenant_id=tenant_id,
|
|
controller=provider_controller,
|
|
)
|
|
|
|
# check if credentials are required
|
|
if not provider_controller.need_credentials:
|
|
credentials = {}
|
|
else:
|
|
# fetch credentials from db
|
|
with Session(db.engine) as session:
|
|
if credential_id:
|
|
db_record = (
|
|
session.query(BuiltinToolProvider)
|
|
.where(
|
|
BuiltinToolProvider.tenant_id == tenant_id,
|
|
BuiltinToolProvider.provider == provider,
|
|
BuiltinToolProvider.id == credential_id,
|
|
)
|
|
.first()
|
|
)
|
|
else:
|
|
db_record = (
|
|
session.query(BuiltinToolProvider)
|
|
.where(
|
|
BuiltinToolProvider.tenant_id == tenant_id,
|
|
BuiltinToolProvider.provider == provider,
|
|
)
|
|
.order_by(BuiltinToolProvider.is_default.desc(), BuiltinToolProvider.created_at.asc())
|
|
.first()
|
|
)
|
|
|
|
if db_record is None:
|
|
raise ValueError(f"Builtin provider {provider} not found when fetching credentials")
|
|
|
|
credentials = encrypter.decrypt(db_record.credentials)
|
|
credential_type = db_record.credential_type
|
|
case "trigger":
|
|
provider_controller = TriggerManager.get_trigger_provider(tenant_id, TriggerProviderID(provider))
|
|
if credential_id:
|
|
subscription: TriggerProviderSubscriptionApiEntity | SubscriptionBuilder | None = (
|
|
TriggerSubscriptionBuilderService.get_subscription_builder(credential_id)
|
|
or TriggerProviderService.get_subscription_by_id(tenant_id, credential_id)
|
|
)
|
|
else:
|
|
subscription: TriggerProviderSubscriptionApiEntity | SubscriptionBuilder | None = (
|
|
TriggerProviderService.get_subscription_by_id(tenant_id)
|
|
)
|
|
|
|
if subscription is None:
|
|
raise ValueError(f"Subscription {credential_id} not found")
|
|
|
|
credentials = subscription.credentials
|
|
credential_type = subscription.credential_type or CredentialType.UNAUTHORIZED
|
|
case _:
|
|
raise ValueError(f"Invalid provider type: {provider_type}")
|
|
|
|
return (
|
|
DynamicSelectClient()
|
|
.fetch_dynamic_select_options(
|
|
tenant_id, user_id, plugin_id, provider, action, credentials, credential_type, parameter
|
|
)
|
|
.options
|
|
)
|