mirror of
https://github.com/YFGaia/dify-plus.git
synced 2026-06-04 10:14:00 +08:00
f26fe2f4d2
# Conflicts:
# .gitignore
# README.md
# api/.env.example
# api/Dockerfile
# api/commands.py
# api/configs/app_config.py
# api/controllers/console/__init__.py
# api/controllers/console/apikey.py
# api/controllers/console/app/statistic.py
# api/controllers/service_api/app/app.py
# api/controllers/service_api/app/audio.py
# api/controllers/service_api/app/completion.py
# api/controllers/service_api/app/conversation.py
# api/controllers/service_api/app/file.py
# api/controllers/service_api/app/message.py
# api/controllers/service_api/app/workflow.py
# api/controllers/service_api/wraps.py
# api/controllers/web/completion.py
# api/core/app/apps/advanced_chat/app_generator.py
# api/core/app/apps/advanced_chat/generate_task_pipeline.py
# api/core/app/apps/agent_chat/app_generator.py
# api/core/app/apps/workflow/app_generator.py
# api/core/app/apps/workflow/generate_task_pipeline.py
# api/core/app/task_pipeline/workflow_cycle_manage.py
# api/core/helper/code_executor/code_executor.py
# api/core/tools/builtin_tool/providers/code/tools/simple_code.py
# api/core/workflow/nodes/code/code_node.py
# api/docker/entrypoint.sh
# api/events/event_handlers/__init__.py
# api/extensions/ext_celery.py
# api/extensions/ext_commands.py
# api/models/model.py
# api/models/workflow.py
# api/poetry.lock
# api/pyproject.toml
# api/services/app_service.py
# api/services/feature_service.py
# api/services/workspace_service.py
# web/.env.example
# web/Dockerfile
# web/app/(commonLayout)/apps/Apps.tsx
# web/app/components/apps/app-card.tsx
# web/app/components/base/chat/embedded-chatbot/index.tsx
# web/app/components/base/mermaid/index.tsx
# web/app/components/develop/index.tsx
# web/app/components/develop/secret-key/secret-key-modal.tsx
# web/app/components/develop/secret-key/style.module.css
# web/app/components/develop/template/template.zh.mdx
# web/app/components/explore/app-list/index.tsx
# web/app/components/explore/category.tsx
# web/app/components/explore/sidebar/index.tsx
# web/app/components/header/account-dropdown/index.tsx
# web/app/components/header/index.tsx
# web/app/components/share/utils.ts
# web/app/layout.tsx
# web/app/signin/components/mail-and-password-auth.tsx
# web/app/signin/normal-form.tsx
# web/app/signin/page.module.css
# web/context/app-context.tsx
# web/i18n/i18next-config.ts
# web/i18n/ja-JP/login.ts
# web/i18n/ko-KR/login.ts
#
if dify_config.WORKFLOW_LOG_CLEANUP_ENABLED:
# 2:00 AM every day
imports.append("schedule.clean_workflow_runlogs_precise")
beat_schedule["clean_workflow_runlogs_precise"] = {
"task": "schedule.clean_workflow_runlogs_precise.clean_workflow_runlogs_precise",
"schedule": crontab(minute="0", hour="2"),
} web/package.json
# web/pnpm-lock.yaml
# web/types/feature.ts
117 lines
4.1 KiB
Python
117 lines
4.1 KiB
Python
import logging
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
from pydantic.fields import FieldInfo
|
|
from pydantic_settings import BaseSettings, PydanticBaseSettingsSource, SettingsConfigDict, TomlConfigSettingsSource
|
|
|
|
from libs.file_utils import search_file_upwards
|
|
|
|
from .deploy import DeploymentConfig
|
|
from .enterprise import EnterpriseFeatureConfig
|
|
from .extra import ExtraServiceConfig
|
|
from .feature import FeatureConfig
|
|
from .middleware import MiddlewareConfig
|
|
from .observability import ObservabilityConfig
|
|
from .extend import ExtendConfig # 二开部分 新增配置
|
|
from .packaging import PackagingInfo
|
|
from .remote_settings_sources import RemoteSettingsSource, RemoteSettingsSourceConfig, RemoteSettingsSourceName
|
|
from .remote_settings_sources.apollo import ApolloSettingsSource
|
|
from .remote_settings_sources.nacos import NacosSettingsSource
|
|
|
|
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 RemoteSettingsSourceName.NACOS:
|
|
remote_source = NacosSettingsSource(current_state)
|
|
case _:
|
|
logger.warning("Unsupported remote source: %s", 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,
|
|
# Observability configs
|
|
ObservabilityConfig,
|
|
# Remote source configs
|
|
RemoteSettingsSourceConfig,
|
|
# Enterprise feature configs
|
|
# **Before using, please contact business@dify.ai by email to inquire about licensing matters.**
|
|
EnterpriseFeatureConfig,
|
|
# 二开部分 新增配置
|
|
ExtendConfig,
|
|
):
|
|
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,
|
|
TomlConfigSettingsSource(
|
|
settings_cls=settings_cls,
|
|
toml_file=search_file_upwards(
|
|
base_dir_path=Path(__file__).parent,
|
|
target_file_name="pyproject.toml",
|
|
max_search_parent_depth=2,
|
|
),
|
|
),
|
|
)
|