Forráskód Böngészése

fix(configs): Update pydantic settings in config files (#6023)

-LAN- 9 hónapja
szülő
commit
c436454cd4
30 módosított fájl, 115 hozzáadás és 93 törlés
  1. 0 1
      api/configs/__init__.py
  2. 4 8
      api/configs/app_config.py
  3. 3 2
      api/configs/deploy/__init__.py
  4. 3 2
      api/configs/enterprise/__init__.py
  5. 0 2
      api/configs/extra/__init__.py
  6. 3 2
      api/configs/extra/notion_config.py
  7. 3 2
      api/configs/extra/sentry_config.py
  8. 24 23
      api/configs/feature/__init__.py
  9. 10 9
      api/configs/feature/hosted_service/__init__.py
  10. 5 4
      api/configs/middleware/__init__.py
  11. 3 2
      api/configs/middleware/cache/redis_config.py
  12. 3 2
      api/configs/middleware/storage/aliyun_oss_storage_config.py
  13. 3 2
      api/configs/middleware/storage/amazon_s3_storage_config.py
  14. 3 2
      api/configs/middleware/storage/azure_blob_storage_config.py
  15. 3 2
      api/configs/middleware/storage/google_cloud_storage_config.py
  16. 3 2
      api/configs/middleware/storage/oci_storage_config.py
  17. 3 2
      api/configs/middleware/storage/tencent_cos_storage_config.py
  18. 3 2
      api/configs/middleware/vdb/chroma_config.py
  19. 3 2
      api/configs/middleware/vdb/milvus_config.py
  20. 3 2
      api/configs/middleware/vdb/opensearch_config.py
  21. 3 2
      api/configs/middleware/vdb/oracle_config.py
  22. 3 2
      api/configs/middleware/vdb/pgvector_config.py
  23. 3 2
      api/configs/middleware/vdb/pgvectors_config.py
  24. 3 2
      api/configs/middleware/vdb/qdrant_config.py
  25. 3 2
      api/configs/middleware/vdb/relyt_config.py
  26. 3 2
      api/configs/middleware/vdb/tencent_vector_config.py
  27. 3 2
      api/configs/middleware/vdb/tidb_vector_config.py
  28. 3 2
      api/configs/middleware/vdb/weaviate_config.py
  29. 3 2
      api/configs/packaging/__init__.py
  30. 3 0
      api/tests/unit_tests/configs/test_dify_config.py

+ 0 - 1
api/configs/__init__.py

@@ -1,4 +1,3 @@
-
 from .app_config import DifyConfig
 
 dify_config = DifyConfig()

+ 4 - 8
api/configs/app_config.py

@@ -1,5 +1,5 @@
-from pydantic import computed_field
-from pydantic_settings import BaseSettings, SettingsConfigDict
+from pydantic import Field, computed_field
+from pydantic_settings import SettingsConfigDict
 
 from configs.deploy import DeploymentConfig
 from configs.enterprise import EnterpriseFeatureConfig
@@ -9,13 +9,7 @@ from configs.middleware import MiddlewareConfig
 from configs.packaging import PackagingInfo
 
 
-# TODO: Both `BaseModel` and `BaseSettings` has `model_config` attribute but they are in different types.
-# This inheritance is depends on the order of the classes.
-# It is better to use `BaseSettings` as the base class.
 class DifyConfig(
-    # based on pydantic-settings
-    BaseSettings,
-
     # Packaging info
     PackagingInfo,
 
@@ -35,11 +29,13 @@ class DifyConfig(
     # **Before using, please contact business@dify.ai by email to inquire about licensing matters.**
     EnterpriseFeatureConfig,
 ):
+    DEBUG: bool = Field(default=False, description='whether to enable debug mode.')
 
     model_config = SettingsConfigDict(
         # read from dotenv format config file
         env_file='.env',
         env_file_encoding='utf-8',
+        frozen=True,
 
         # ignore extra attributes
         extra='ignore',

+ 3 - 2
api/configs/deploy/__init__.py

@@ -1,7 +1,8 @@
-from pydantic import BaseModel, Field
+from pydantic import Field
+from pydantic_settings import BaseSettings
 
 
-class DeploymentConfig(BaseModel):
+class DeploymentConfig(BaseSettings):
     """
     Deployment configs
     """

+ 3 - 2
api/configs/enterprise/__init__.py

@@ -1,7 +1,8 @@
-from pydantic import BaseModel, Field
+from pydantic import Field
+from pydantic_settings import BaseSettings
 
 
-class EnterpriseFeatureConfig(BaseModel):
+class EnterpriseFeatureConfig(BaseSettings):
     """
     Enterprise feature configs.
     **Before using, please contact business@dify.ai by email to inquire about licensing matters.**

+ 0 - 2
api/configs/extra/__init__.py

@@ -1,5 +1,3 @@
-from pydantic import BaseModel
-
 from configs.extra.notion_config import NotionConfig
 from configs.extra.sentry_config import SentryConfig
 

+ 3 - 2
api/configs/extra/notion_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field
+from pydantic import Field
+from pydantic_settings import BaseSettings
 
 
-class NotionConfig(BaseModel):
+class NotionConfig(BaseSettings):
     """
     Notion integration configs
     """

+ 3 - 2
api/configs/extra/sentry_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, NonNegativeFloat
+from pydantic import Field, NonNegativeFloat
+from pydantic_settings import BaseSettings
 
 
-class SentryConfig(BaseModel):
+class SentryConfig(BaseSettings):
     """
     Sentry configs
     """

+ 24 - 23
api/configs/feature/__init__.py

@@ -1,11 +1,12 @@
 from typing import Optional
 
-from pydantic import AliasChoices, BaseModel, Field, NonNegativeInt, PositiveInt, computed_field
+from pydantic import AliasChoices, Field, NonNegativeInt, PositiveInt, computed_field
+from pydantic_settings import BaseSettings
 
 from configs.feature.hosted_service import HostedServiceConfig
 
 
-class SecurityConfig(BaseModel):
+class SecurityConfig(BaseSettings):
     """
     Secret Key configs
     """
@@ -22,7 +23,7 @@ class SecurityConfig(BaseModel):
         default=24,
     )
 
-class AppExecutionConfig(BaseModel):
+class AppExecutionConfig(BaseSettings):
     """
     App Execution configs
     """
@@ -32,7 +33,7 @@ class AppExecutionConfig(BaseModel):
     )
 
 
-class CodeExecutionSandboxConfig(BaseModel):
+class CodeExecutionSandboxConfig(BaseSettings):
     """
     Code Execution Sandbox configs
     """
@@ -47,7 +48,7 @@ class CodeExecutionSandboxConfig(BaseModel):
     )
 
 
-class EndpointConfig(BaseModel):
+class EndpointConfig(BaseSettings):
     """
     Module URL configs
     """
@@ -76,7 +77,7 @@ class EndpointConfig(BaseModel):
     )
 
 
-class FileAccessConfig(BaseModel):
+class FileAccessConfig(BaseSettings):
     """
     File Access configs
     """
@@ -95,7 +96,7 @@ class FileAccessConfig(BaseModel):
     )
 
 
-class FileUploadConfig(BaseModel):
+class FileUploadConfig(BaseSettings):
     """
     File Uploading configs
     """
@@ -120,7 +121,7 @@ class FileUploadConfig(BaseModel):
     )
 
 
-class HttpConfig(BaseModel):
+class HttpConfig(BaseSettings):
     """
     HTTP configs
     """
@@ -152,7 +153,7 @@ class HttpConfig(BaseModel):
         return self.inner_WEB_API_CORS_ALLOW_ORIGINS.split(',')
 
 
-class InnerAPIConfig(BaseModel):
+class InnerAPIConfig(BaseSettings):
     """
     Inner API configs
     """
@@ -167,7 +168,7 @@ class InnerAPIConfig(BaseModel):
     )
 
 
-class LoggingConfig(BaseModel):
+class LoggingConfig(BaseSettings):
     """
     Logging configs
     """
@@ -199,7 +200,7 @@ class LoggingConfig(BaseModel):
     )
 
 
-class ModelLoadBalanceConfig(BaseModel):
+class ModelLoadBalanceConfig(BaseSettings):
     """
     Model load balance configs
     """
@@ -209,7 +210,7 @@ class ModelLoadBalanceConfig(BaseModel):
     )
 
 
-class BillingConfig(BaseModel):
+class BillingConfig(BaseSettings):
     """
     Platform Billing Configurations
     """
@@ -219,7 +220,7 @@ class BillingConfig(BaseModel):
     )
 
 
-class UpdateConfig(BaseModel):
+class UpdateConfig(BaseSettings):
     """
     Update configs
     """
@@ -229,7 +230,7 @@ class UpdateConfig(BaseModel):
     )
 
 
-class WorkflowConfig(BaseModel):
+class WorkflowConfig(BaseSettings):
     """
     Workflow feature configs
     """
@@ -250,7 +251,7 @@ class WorkflowConfig(BaseModel):
     )
 
 
-class OAuthConfig(BaseModel):
+class OAuthConfig(BaseSettings):
     """
     oauth configs
     """
@@ -280,7 +281,7 @@ class OAuthConfig(BaseModel):
     )
 
 
-class ModerationConfig(BaseModel):
+class ModerationConfig(BaseSettings):
     """
     Moderation in app configs.
     """
@@ -292,7 +293,7 @@ class ModerationConfig(BaseModel):
     )
 
 
-class ToolConfig(BaseModel):
+class ToolConfig(BaseSettings):
     """
     Tool configs
     """
@@ -303,7 +304,7 @@ class ToolConfig(BaseModel):
     )
 
 
-class MailConfig(BaseModel):
+class MailConfig(BaseSettings):
     """
     Mail Configurations
     """
@@ -359,7 +360,7 @@ class MailConfig(BaseModel):
     )
 
 
-class RagEtlConfig(BaseModel):
+class RagEtlConfig(BaseSettings):
     """
     RAG ETL Configurations.
     """
@@ -385,7 +386,7 @@ class RagEtlConfig(BaseModel):
     )
 
 
-class DataSetConfig(BaseModel):
+class DataSetConfig(BaseSettings):
     """
     Dataset configs
     """
@@ -396,7 +397,7 @@ class DataSetConfig(BaseModel):
     )
 
 
-class WorkspaceConfig(BaseModel):
+class WorkspaceConfig(BaseSettings):
     """
     Workspace configs
     """
@@ -407,7 +408,7 @@ class WorkspaceConfig(BaseModel):
     )
 
 
-class IndexingConfig(BaseModel):
+class IndexingConfig(BaseSettings):
     """
     Indexing configs.
     """
@@ -418,7 +419,7 @@ class IndexingConfig(BaseModel):
     )
 
 
-class ImageFormatConfig(BaseModel):
+class ImageFormatConfig(BaseSettings):
     MULTIMODAL_SEND_IMAGE_FORMAT: str = Field(
         description='multi model send image format, support base64, url, default is base64',
         default='base64',

+ 10 - 9
api/configs/feature/hosted_service/__init__.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, NonNegativeInt
+from pydantic import Field, NonNegativeInt
+from pydantic_settings import BaseSettings
 
 
-class HostedOpenAiConfig(BaseModel):
+class HostedOpenAiConfig(BaseSettings):
     """
     Hosted OpenAI service config
     """
@@ -68,7 +69,7 @@ class HostedOpenAiConfig(BaseModel):
     )
 
 
-class HostedAzureOpenAiConfig(BaseModel):
+class HostedAzureOpenAiConfig(BaseSettings):
     """
     Hosted OpenAI service config
     """
@@ -94,7 +95,7 @@ class HostedAzureOpenAiConfig(BaseModel):
     )
 
 
-class HostedAnthropicConfig(BaseModel):
+class HostedAnthropicConfig(BaseSettings):
     """
     Hosted Azure OpenAI service config
     """
@@ -125,7 +126,7 @@ class HostedAnthropicConfig(BaseModel):
     )
 
 
-class HostedMinmaxConfig(BaseModel):
+class HostedMinmaxConfig(BaseSettings):
     """
     Hosted Minmax service config
     """
@@ -136,7 +137,7 @@ class HostedMinmaxConfig(BaseModel):
     )
 
 
-class HostedSparkConfig(BaseModel):
+class HostedSparkConfig(BaseSettings):
     """
     Hosted Spark service config
     """
@@ -147,7 +148,7 @@ class HostedSparkConfig(BaseModel):
     )
 
 
-class HostedZhipuAIConfig(BaseModel):
+class HostedZhipuAIConfig(BaseSettings):
     """
     Hosted Minmax service config
     """
@@ -158,7 +159,7 @@ class HostedZhipuAIConfig(BaseModel):
     )
 
 
-class HostedModerationConfig(BaseModel):
+class HostedModerationConfig(BaseSettings):
     """
     Hosted Moderation service config
     """
@@ -174,7 +175,7 @@ class HostedModerationConfig(BaseModel):
     )
 
 
-class HostedFetchAppTemplateConfig(BaseModel):
+class HostedFetchAppTemplateConfig(BaseSettings):
     """
     Hosted Moderation service config
     """

+ 5 - 4
api/configs/middleware/__init__.py

@@ -1,6 +1,7 @@
 from typing import Any, Optional
 
-from pydantic import BaseModel, Field, NonNegativeInt, PositiveInt, computed_field
+from pydantic import Field, NonNegativeInt, PositiveInt, computed_field
+from pydantic_settings import BaseSettings
 
 from configs.middleware.cache.redis_config import RedisConfig
 from configs.middleware.storage.aliyun_oss_storage_config import AliyunOSSStorageConfig
@@ -22,7 +23,7 @@ from configs.middleware.vdb.tidb_vector_config import TiDBVectorConfig
 from configs.middleware.vdb.weaviate_config import WeaviateConfig
 
 
-class StorageConfig(BaseModel):
+class StorageConfig(BaseSettings):
     STORAGE_TYPE: str = Field(
         description='storage type,'
                     ' default to `local`,'
@@ -36,14 +37,14 @@ class StorageConfig(BaseModel):
     )
 
 
-class VectorStoreConfig(BaseModel):
+class VectorStoreConfig(BaseSettings):
     VECTOR_STORE: Optional[str] = Field(
         description='vector store type',
         default=None,
     )
 
 
-class KeywordStoreConfig(BaseModel):
+class KeywordStoreConfig(BaseSettings):
     KEYWORD_STORE: str = Field(
         description='keyword store type',
         default='jieba',

+ 3 - 2
api/configs/middleware/cache/redis_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, NonNegativeInt, PositiveInt
+from pydantic import Field, NonNegativeInt, PositiveInt
+from pydantic_settings import BaseSettings
 
 
-class RedisConfig(BaseModel):
+class RedisConfig(BaseSettings):
     """
     Redis configs
     """

+ 3 - 2
api/configs/middleware/storage/aliyun_oss_storage_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field
+from pydantic import Field
+from pydantic_settings import BaseSettings
 
 
-class AliyunOSSStorageConfig(BaseModel):
+class AliyunOSSStorageConfig(BaseSettings):
     """
     Aliyun storage configs
     """

+ 3 - 2
api/configs/middleware/storage/amazon_s3_storage_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field
+from pydantic import Field
+from pydantic_settings import BaseSettings
 
 
-class S3StorageConfig(BaseModel):
+class S3StorageConfig(BaseSettings):
     """
     S3 storage configs
     """

+ 3 - 2
api/configs/middleware/storage/azure_blob_storage_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field
+from pydantic import Field
+from pydantic_settings import BaseSettings
 
 
-class AzureBlobStorageConfig(BaseModel):
+class AzureBlobStorageConfig(BaseSettings):
     """
     Azure Blob storage configs
     """

+ 3 - 2
api/configs/middleware/storage/google_cloud_storage_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field
+from pydantic import Field
+from pydantic_settings import BaseSettings
 
 
-class GoogleCloudStorageConfig(BaseModel):
+class GoogleCloudStorageConfig(BaseSettings):
     """
     Google Cloud storage configs
     """

+ 3 - 2
api/configs/middleware/storage/oci_storage_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field
+from pydantic import Field
+from pydantic_settings import BaseSettings
 
 
-class OCIStorageConfig(BaseModel):
+class OCIStorageConfig(BaseSettings):
     """
     OCI storage configs
     """

+ 3 - 2
api/configs/middleware/storage/tencent_cos_storage_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field
+from pydantic import Field
+from pydantic_settings import BaseSettings
 
 
-class TencentCloudCOSStorageConfig(BaseModel):
+class TencentCloudCOSStorageConfig(BaseSettings):
     """
     Tencent Cloud COS storage configs
     """

+ 3 - 2
api/configs/middleware/vdb/chroma_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, PositiveInt
+from pydantic import Field, PositiveInt
+from pydantic_settings import BaseSettings
 
 
-class ChromaConfig(BaseModel):
+class ChromaConfig(BaseSettings):
     """
     Chroma configs
     """

+ 3 - 2
api/configs/middleware/vdb/milvus_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, PositiveInt
+from pydantic import Field, PositiveInt
+from pydantic_settings import BaseSettings
 
 
-class MilvusConfig(BaseModel):
+class MilvusConfig(BaseSettings):
     """
     Milvus configs
     """

+ 3 - 2
api/configs/middleware/vdb/opensearch_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, PositiveInt
+from pydantic import Field, PositiveInt
+from pydantic_settings import BaseSettings
 
 
-class OpenSearchConfig(BaseModel):
+class OpenSearchConfig(BaseSettings):
     """
     OpenSearch configs
     """

+ 3 - 2
api/configs/middleware/vdb/oracle_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, PositiveInt
+from pydantic import Field, PositiveInt
+from pydantic_settings import BaseSettings
 
 
-class OracleConfig(BaseModel):
+class OracleConfig(BaseSettings):
     """
     ORACLE configs
     """

+ 3 - 2
api/configs/middleware/vdb/pgvector_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, PositiveInt
+from pydantic import Field, PositiveInt
+from pydantic_settings import BaseSettings
 
 
-class PGVectorConfig(BaseModel):
+class PGVectorConfig(BaseSettings):
     """
     PGVector configs
     """

+ 3 - 2
api/configs/middleware/vdb/pgvectors_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, PositiveInt
+from pydantic import Field, PositiveInt
+from pydantic_settings import BaseSettings
 
 
-class PGVectoRSConfig(BaseModel):
+class PGVectoRSConfig(BaseSettings):
     """
     PGVectoRS configs
     """

+ 3 - 2
api/configs/middleware/vdb/qdrant_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, NonNegativeInt, PositiveInt
+from pydantic import Field, NonNegativeInt, PositiveInt
+from pydantic_settings import BaseSettings
 
 
-class QdrantConfig(BaseModel):
+class QdrantConfig(BaseSettings):
     """
     Qdrant configs
     """

+ 3 - 2
api/configs/middleware/vdb/relyt_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, PositiveInt
+from pydantic import Field, PositiveInt
+from pydantic_settings import BaseSettings
 
 
-class RelytConfig(BaseModel):
+class RelytConfig(BaseSettings):
     """
     Relyt configs
     """

+ 3 - 2
api/configs/middleware/vdb/tencent_vector_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, NonNegativeInt, PositiveInt
+from pydantic import Field, NonNegativeInt, PositiveInt
+from pydantic_settings import BaseSettings
 
 
-class TencentVectorDBConfig(BaseModel):
+class TencentVectorDBConfig(BaseSettings):
     """
     Tencent Vector configs
     """

+ 3 - 2
api/configs/middleware/vdb/tidb_vector_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, PositiveInt
+from pydantic import Field, PositiveInt
+from pydantic_settings import BaseSettings
 
 
-class TiDBVectorConfig(BaseModel):
+class TiDBVectorConfig(BaseSettings):
     """
     TiDB Vector configs
     """

+ 3 - 2
api/configs/middleware/vdb/weaviate_config.py

@@ -1,9 +1,10 @@
 from typing import Optional
 
-from pydantic import BaseModel, Field, PositiveInt
+from pydantic import Field, PositiveInt
+from pydantic_settings import BaseSettings
 
 
-class WeaviateConfig(BaseModel):
+class WeaviateConfig(BaseSettings):
     """
     Weaviate configs
     """

+ 3 - 2
api/configs/packaging/__init__.py

@@ -1,7 +1,8 @@
-from pydantic import BaseModel, Field
+from pydantic import Field
+from pydantic_settings import BaseSettings
 
 
-class PackagingInfo(BaseModel):
+class PackagingInfo(BaseSettings):
     """
     Packaging build information
     """

+ 3 - 0
api/tests/unit_tests/configs/test_dify_config.py

@@ -21,6 +21,7 @@ def example_env_file(tmp_path, monkeypatch) -> str:
 
 
 def test_dify_config_undefined_entry(example_env_file):
+    # NOTE: See https://github.com/microsoft/pylance-release/issues/6099 for more details about this type error.
     # load dotenv file with pydantic-settings
     config = DifyConfig(_env_file=example_env_file)
 
@@ -43,6 +44,8 @@ def test_dify_config(example_env_file):
     assert config.SENTRY_TRACES_SAMPLE_RATE == 1.0
 
 
+# NOTE: If there is a `.env` file in your Workspace, this test might not succeed as expected.
+# This is due to `pymilvus` loading all the variables from the `.env` file into `os.environ`.
 def test_flask_configs(example_env_file):
     flask_app = Flask('app')
     flask_app.config.from_mapping(DifyConfig(_env_file=example_env_file).model_dump())