提供方与模型架构
提供商与模型架构
相关源文件
本维基页面基于以下文件生成:
api/core/agent/output_parser/cot_output_parser.pyapi/core/app/app_config/easy_ui_based_app/model_config/converter.pyapi/core/app/llm/model_access.pyapi/core/entities/model_entities.pyapi/core/entities/provider_configuration.pyapi/core/hosting_configuration.pyapi/core/model_manager.pyapi/core/provider_manager.pyapi/core/schemas/resolver.pyapi/services/enterprise/enterprise_service.pyapi/services/entities/model_provider_entities.pyapi/services/model_load_balancing_service.pyapi/services/model_provider_service.pyapi/tests/integration_tests/model_runtime/__mock/plugin_model.pyapi/tests/test_containers_integration_tests/services/test_api_based_extension_service.pyapi/tests/test_containers_integration_tests/services/test_model_load_balancing_service.pyapi/tests/test_containers_integration_tests/services/test_model_provider_service.pyapi/tests/unit_tests/core/entities/test_entities_provider_configuration.pyapi/tests/unit_tests/core/test_model_manager.pyapi/tests/unit_tests/core/test_provider_configuration.pyapi/tests/unit_tests/core/test_provider_manager.pyapi/tests/unit_tests/models/test_provider_models.pyapi/tests/unit_tests/services/test_model_load_balancing_service.py
目的与范围
本文档描述了 Dify 中的提供商与模型管理系统,该系统负责处理与 100 多个大语言模型(LLM)提供商(如 OpenAI、Anthropic 等)及其模型的集成。内容涵盖:
- 提供商、模型和凭证的数据库模型
- 运行时架构(
ModelManager、ProviderManager、ProviderConfiguration) - 凭证管理与解析
- 负载均衡配置
- 模型实例的创建与校验
关于这些提供商在执行过程中如何被调用的信息,请参阅模型调用管线。关于配额扣除和信用额度追踪,请参阅配额管理与信用池。
架构总览:
该系统由三个主要层级组成:
- 数据库层:
api/models/provider.py中的 SQLAlchemy 模型api/models/provider.py:1-372 - 管理层:用于配置组装的
ProviderManager和ModelManager类api/core/provider_manager.py:64-79,api/core/model_manager.py:35-56 - 运行时层:
ModelInstance的创建和凭证解析api/core/model_manager.py:35-56
核心数据库模式
提供商与模型架构由多个相互关联的数据库表组成,用于管理提供商配置、模型设置、凭证和租户偏好。
实体关系图
来源: api/models/provider.py:49-372
提供商类型与配额系统
提供商类型
系统支持两种在 ProviderType 枚举中定义的提供商类型:
| 类型 | 描述 | 使用场景 |
|---|---|---|
SYSTEM | 具有系统级配置的预定义提供商 | 由 Dify 管理的内置提供商 |
CUSTOM | 用户配置的提供商 | 自定义 API 端点、自托管模型 |
来源: api/models/provider.py:19-28
配额类型
对于托管(云)环境,系统通过 ProviderQuotaType 追踪三种配额类型 api/core/entities/provider_entities.py:18-34:
| 配额类型 | 描述 | 追踪方式 |
|---|---|---|
PAID | 为托管提供商购买的配额 | 从 quota_used 中扣除,受 quota_limit 限制 |
FREE | 第三方提供商提供的免费额度 | 不在 Dify 配额系统中追踪 |
TRIAL | 托管提供商的试用配额 | 有时间或使用量限制的试用信用额度 |
托管配置: 在云模式下,HostingConfiguration 会使用环境变量为 Azure OpenAI 和 Anthropic 等提供商初始化这些配额 api/core/hosting_configuration.py:52-66。
提供方与 ProviderModel 层级
提供方模型
Provider 表代表一个已配置的提供商实例。关键字段如下:
# api/models/provider.py:49-127
class Provider(TypeBase):
__tablename__ = "providers"
id: Mapped[str] # UUID 主键
tenant_id: Mapped[str] # 工作空间隔离
provider_name: Mapped[str] # 例如 "openai"
provider_type: Mapped[str] # "custom" 或 "system"
is_valid: Mapped[bool] # 凭证校验状态
credential_id: Mapped[str | None] # 外键,关联 ProviderCredential
# 配额字段
quota_type: Mapped[str | None] # "paid"、"free" 或 "trial"
quota_limit: Mapped[int | None] # 最大配额
quota_used: Mapped[int | None] # 当前使用量
来源: api/models/provider.py:49-127
ProviderModel 模型
ProviderModel 表代表提供商内的单个模型:
# api/models/provider.py:129-177
class ProviderModel(TypeBase):
__tablename__ = "provider_models"
id: Mapped[str] # UUID 主键
tenant_id: Mapped[str] # 工作空间隔离
provider_name: Mapped[str] # 父级提供商
model_name: Mapped[str] # 例如 "gpt-4"
model_type: Mapped[str] # "llm"、"text-embedding" 等
credential_id: Mapped[str | None] # 外键,关联 ProviderModelCredential
来源: api/models/provider.py:129-177
凭证管理架构
系统实现了一个两级凭证层级:提供商级凭证和模型级凭证,两者均以加密方式存储。
凭证层级
ProviderCredential 和 ProviderModelCredential
ProviderCredential 为每个提供商存储多个命名的凭证 api/models/provider.py:315-338。ProviderModelCredential 存储特定于模型的凭证,允许每个模型使用不同的 API 密钥 api/models/provider.py:341-372。两者都使用 encrypted_config 来存储敏感数据。
负载均衡架构
负载均衡系统为每个模型启用多个凭证配置,以实现高可用性和速率限制分发。
负载均衡组件
LBModelManager: 当启用负载均衡时,ModelInstance 会初始化一个 LBModelManager api/core/model_manager.py:105-114。该管理器负责在调用期间从 load_balancing_configs 列表中选择凭证 api/core/model_manager.py:51-56。
来源: api/models/provider.py:284-312, api/core/model_manager.py:83-116, api/services/model_load_balancing_service.py:45-167
运行时架构
ModelManager 和 ProviderManager
运行时层使用两个关键的管理器类来访问配置:
| 类 | 位置 | 用途 |
|---|---|---|
ProviderManager | api/core/provider_manager.py | 管理租户范围内的提供商配置组装和缓存 api/core/provider_manager.py:64-79。 |
ProviderConfiguration | api/core/entities/provider_configuration.py | 用于管理凭证的增删改查(CRUD)、负载均衡和模型启用的实体 api/core/entities/provider_configuration.py:57-72。 |
ModelInstance | api/core/model_manager.py | 在运行时代表一个特定模型,持有其解析后的凭证和负载均衡管理器 api/core/model_manager.py:35-56。 |
凭证解析
ProviderConfiguration 类根据提供商类型解析凭证:
# api/core/entities/provider_configuration.py:115-150
def get_current_credentials(self, model_type: ModelType, model: str) -> dict[str, Any] | None:
if self.using_provider_type == ProviderType.SYSTEM:
# 从系统范围的托管配置中解析
return self.system_configuration.credentials.copy()
else:
# 从自定义的模型级或提供商级配置中解析
# ...
来源: api/core/entities/provider_configuration.py:115-170
桥梁:自然语言到代码实体空间的映射
来源: api/core/provider_manager.py:64-100, api/core/entities/provider_configuration.py:57-72, api/core/model_manager.py:35-56, api/services/model_load_balancing_service.py:45-58
模型参数与提供商服务
系统提供专用服务来处理高级提供商操作和模型模式解析。
ModelProviderService
ModelProviderService 作为控制台 API 的主要接口,用于获取提供商列表和模型配置 api/services/model_provider_service.py:24-32。它通过清理 CustomModelConfiguration 对象,确保敏感凭证不会在列表视图中暴露 api/services/model_provider_service.py:78-95。
ModelLoadBalancingService
该服务管理负载均衡配置的生命周期,包括为特定模型启用/禁用负载均衡,以及管理代表默认提供商/模型凭证的 __inherit__ 配置 api/services/model_load_balancing_service.py:50-91, api/services/model_load_balancing_service.py:147-168。
桥梁:请求流到代码实体的映射
来源: api/services/model_provider_service.py:56-68, api/services/model_load_balancing_service.py:50-70, api/models/provider.py:257-282, api/models/provider.py:284-312