mirror of
https://github.com/langgenius/dify.git
synced 2026-01-14 06:07:33 +08:00
- Initialized `response` variable in `trigger.py` to ensure proper handling in the trigger endpoint. - Updated `http_parser.py` to conditionally set `CONTENT_TYPE` and `CONTENT_LENGTH` headers for improved robustness. - Changed `datetime.utcnow()` to `datetime.now(UTC)` in `sqlalchemy_workflow_trigger_log_repository.py` and `rate_limiter.py` for consistent time zone handling. - Refactored `async_workflow_service.py` to use the public method `get_tenant_owner_timezone` for better encapsulation. - Simplified subscription retrieval logic in `plugin_parameter_service.py` for clarity. These changes improve code reliability and maintainability while ensuring accurate time management and request processing.
112 lines
4.9 KiB
Python
112 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_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.provider_ids import TriggerProviderID
|
|
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))
|
|
subscription: TriggerProviderSubscriptionApiEntity | SubscriptionBuilder | None
|
|
if credential_id:
|
|
subscription = (
|
|
TriggerSubscriptionBuilderService.get_subscription_builder(credential_id)
|
|
or TriggerProviderService.get_subscription_by_id(tenant_id, credential_id)
|
|
)
|
|
else:
|
|
subscription = 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
|
|
)
|