| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | 
							- import logging
 - from typing import Any
 - 
 - from pydantic.fields import FieldInfo
 - from pydantic_settings import BaseSettings, PydanticBaseSettingsSource, SettingsConfigDict
 - 
 - from .deploy import DeploymentConfig
 - from .enterprise import EnterpriseFeatureConfig
 - from .extra import ExtraServiceConfig
 - from .feature import FeatureConfig
 - from .middleware import MiddlewareConfig
 - from .packaging import PackagingInfo
 - from .remote_settings_sources import RemoteSettingsSource, RemoteSettingsSourceConfig, RemoteSettingsSourceName
 - from .remote_settings_sources.apollo import ApolloSettingsSource
 - 
 - logger = logging.getLogger(__name__)
 - 
 - 
 - class RemoteSettingsSourceFactory(PydanticBaseSettingsSource):
 -     def __init__(self, settings_cls: type[BaseSettings]):
 -         super().__init__(settings_cls)
 - 
 -     def get_field_value(self, field: FieldInfo, field_name: str) -> tuple[Any, str, bool]:
 -         raise NotImplementedError
 - 
 -     def __call__(self) -> dict[str, Any]:
 -         current_state = self.current_state
 -         remote_source_name = current_state.get("REMOTE_SETTINGS_SOURCE_NAME")
 -         if not remote_source_name:
 -             return {}
 - 
 -         remote_source: RemoteSettingsSource | None = None
 -         match remote_source_name:
 -             case RemoteSettingsSourceName.APOLLO:
 -                 remote_source = ApolloSettingsSource(current_state)
 -             case _:
 -                 logger.warning(f"Unsupported remote source: {remote_source_name}")
 -                 return {}
 - 
 -         d: dict[str, Any] = {}
 - 
 -         for field_name, field in self.settings_cls.model_fields.items():
 -             field_value, field_key, value_is_complex = remote_source.get_field_value(field, field_name)
 -             field_value = remote_source.prepare_field_value(field_name, field, field_value, value_is_complex)
 -             if field_value is not None:
 -                 d[field_key] = field_value
 - 
 -         return d
 - 
 - 
 - class DifyConfig(
 -     # Packaging info
 -     PackagingInfo,
 -     # Deployment configs
 -     DeploymentConfig,
 -     # Feature configs
 -     FeatureConfig,
 -     # Middleware configs
 -     MiddlewareConfig,
 -     # Extra service configs
 -     ExtraServiceConfig,
 -     # Remote source configs
 -     RemoteSettingsSourceConfig,
 -     # Enterprise feature configs
 -     # **Before using, please contact business@dify.ai by email to inquire about licensing matters.**
 -     EnterpriseFeatureConfig,
 - ):
 -     model_config = SettingsConfigDict(
 -         # read from dotenv format config file
 -         env_file=".env",
 -         env_file_encoding="utf-8",
 -         # ignore extra attributes
 -         extra="ignore",
 -     )
 - 
 -     # Before adding any config,
 -     # please consider to arrange it in the proper config group of existed or added
 -     # for better readability and maintainability.
 -     # Thanks for your concentration and consideration.
 - 
 -     @classmethod
 -     def settings_customise_sources(
 -         cls,
 -         settings_cls: type[BaseSettings],
 -         init_settings: PydanticBaseSettingsSource,
 -         env_settings: PydanticBaseSettingsSource,
 -         dotenv_settings: PydanticBaseSettingsSource,
 -         file_secret_settings: PydanticBaseSettingsSource,
 -     ) -> tuple[PydanticBaseSettingsSource, ...]:
 -         return (
 -             init_settings,
 -             env_settings,
 -             RemoteSettingsSourceFactory(settings_cls),
 -             dotenv_settings,
 -             file_secret_settings,
 -         )
 
 
  |