您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

credential_utils.py 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. """
  2. Credential utility functions for checking credential existence and policy compliance.
  3. """
  4. from services.enterprise.plugin_manager_service import PluginCredentialType
  5. def is_credential_exists(credential_id: str, credential_type: "PluginCredentialType") -> bool:
  6. """
  7. Check if the credential still exists in the database.
  8. :param credential_id: The credential ID to check
  9. :param credential_type: The type of credential (MODEL or TOOL)
  10. :return: True if credential exists, False otherwise
  11. """
  12. from sqlalchemy import select
  13. from sqlalchemy.orm import Session
  14. from extensions.ext_database import db
  15. from models.provider import ProviderCredential, ProviderModelCredential
  16. from models.tools import BuiltinToolProvider
  17. with Session(db.engine) as session:
  18. if credential_type == PluginCredentialType.MODEL:
  19. # Check both pre-defined and custom model credentials using a single UNION query
  20. stmt = (
  21. select(ProviderCredential.id)
  22. .where(ProviderCredential.id == credential_id)
  23. .union(select(ProviderModelCredential.id).where(ProviderModelCredential.id == credential_id))
  24. )
  25. return session.scalar(stmt) is not None
  26. if credential_type == PluginCredentialType.TOOL:
  27. return (
  28. session.scalar(select(BuiltinToolProvider.id).where(BuiltinToolProvider.id == credential_id))
  29. is not None
  30. )
  31. return False
  32. def check_credential_policy_compliance(
  33. credential_id: str, provider: str, credential_type: "PluginCredentialType", check_existence: bool = True
  34. ) -> None:
  35. """
  36. Check credential policy compliance for the given credential ID.
  37. :param credential_id: The credential ID to check
  38. :param provider: The provider name
  39. :param credential_type: The type of credential (MODEL or TOOL)
  40. :param check_existence: Whether to check if credential exists in database first
  41. :raises ValueError: If credential policy compliance check fails
  42. """
  43. from services.enterprise.plugin_manager_service import (
  44. CheckCredentialPolicyComplianceRequest,
  45. PluginManagerService,
  46. )
  47. from services.feature_service import FeatureService
  48. if not FeatureService.get_system_features().plugin_manager.enabled or not credential_id:
  49. return
  50. # Check if credential exists in database first (if requested)
  51. if check_existence:
  52. if not is_credential_exists(credential_id, credential_type):
  53. raise ValueError(f"Credential with id {credential_id} for provider {provider} not found.")
  54. # Check policy compliance
  55. PluginManagerService.check_credential_policy_compliance(
  56. CheckCredentialPolicyComplianceRequest(
  57. dify_credential_id=credential_id,
  58. provider=provider,
  59. credential_type=credential_type,
  60. )
  61. )