接口架构与请求流程
API 架构与请求流程
相关源文件
本章引用的主要源码文件:
api/controllers/console/__init__.pyapi/controllers/console/admin.pyapi/controllers/console/apikey.pyapi/controllers/console/app/wraps.pyapi/controllers/console/billing/billing.pyapi/controllers/console/billing/compliance.pyapi/controllers/console/error.pyapi/controllers/console/extension.pyapi/controllers/console/wraps.pyapi/controllers/service_api/wraps.pyapi/core/app/apps/agent_chat/app_config_manager.pyapi/core/app/features/rate_limiting/rate_limit.pyapi/dev/generate_swagger_markdown_docs.pyapi/dev/generate_swagger_specs.pyapi/dify_app.pyapi/enums/quota_type.pyapi/extensions/ext_login.pyapi/libs/external_api.pyapi/libs/flask_restx_compat.pyapi/libs/gmpy2_pkcs10aep_cipher.pyapi/libs/infinite_scroll_pagination.pyapi/libs/login.pyapi/libs/passport.pyapi/libs/rsa.pyapi/libs/sendgrid.pyapi/models/oauth.pyapi/models/trigger.pyapi/services/app_generate_service.pyapi/services/async_workflow_service.pyapi/services/billing_service.pyapi/services/errors/app.pyapi/services/feature_service.pyapi/services/quota_service.pyapi/tasks/trigger_processing_tasks.pyapi/tasks/workflow_schedule_tasks.pyapi/tests/test_containers_integration_tests/controllers/console/test_api_based_extension.pyapi/tests/test_containers_integration_tests/services/test_billing_service.pyapi/tests/unit_tests/commands/test_generate_swagger_markdown_docs.pyapi/tests/unit_tests/commands/test_generate_swagger_specs.pyapi/tests/unit_tests/controllers/console/test_extension.pyapi/tests/unit_tests/controllers/console/test_workspace_members.pyapi/tests/unit_tests/controllers/console/workspace/test_workspace.pyapi/tests/unit_tests/controllers/test_swagger.pyapi/tests/unit_tests/core/app/features/rate_limiting/conftest.pyapi/tests/unit_tests/core/app/features/rate_limiting/test_rate_limit.pyapi/tests/unit_tests/extensions/test_ext_login.pyapi/tests/unit_tests/libs/test_login.pyapi/tests/unit_tests/services/test_app_generate_service.pyapi/tests/unit_tests/services/test_async_workflow_service.pyapi/tests/unit_tests/services/test_billing_service.pyapi/tests/unit_tests/services/tools/__init__.pypackages/dify-ui/src/dialog/index.stories.tsxpackages/dify-ui/src/field/__tests__/index.spec.tsx
目的与范围
本文档描述了 Dify 的 API 层架构,包括控制台 API 与服务 API 的区别、请求路由模式、认证机制以及常见的请求/响应流程。它涵盖了外部客户端如何通过 RESTful 端点与平台交互。
关于具体 API 端点(聊天、补全、工作流)的详细信息,请参见 9.2、9.3 和 9.4。关于认证与授权机制,请参见 8.2 和 8.3。关于整体服务拓扑,请参见 2.1。
双 API 架构:控制台 API 与服务 API
Dify 提供了两种不同的 API 接口,它们具有不同的用途和认证模式:
| API 类型 | 基础路径 | 用途 | 认证方式 | 典型用户 |
|---|---|---|---|---|
| 控制台 API | /console/api | 内部管理操作(应用配置、数据集管理、成员管理) | 基于会话(Passport)+ CSRF | Web 控制台前端 |
| 服务 API | /api 或 /v1 | 外部应用访问(聊天消息、补全、工作流执行) | API 密钥(Bearer 令牌) | 外部客户端、SDK、集成 |
API 架构图
来源: api/controllers/console/__init__.py:8-15、api/controllers/service_api/wraps.py:61-61、api/libs/external_api.py:123-134
服务 API 认证
服务 API 使用 API 密钥认证,通过 Authorization HTTP 请求头并采用 Bearer 令牌方案实现。该认证由 @validate_app_token 装饰器强制执行。
认证流程与数据映射
@validate_app_token 装饰器执行以下几个关键步骤:
- 从数据库中验证
ApiTokenapi/controllers/service_api/wraps.py:61-61。 - 检索关联的
App模型,并检查其状态和 API 启用情况api/controllers/service_api/wraps.py:63-71。 - 如果提供了
fetch_user_arg,则根据请求体、查询参数或表单中的user参数解析或创建EndUserapi/controllers/service_api/wraps.py:82-99。 - 将
app_model和end_user注入到视图函数的参数中api/controllers/service_api/wraps.py:79-99。 - 对于没有终端用户上下文的请求,它会识别
Tenant所有者,以便为下游服务填充current_userapi/controllers/service_api/wraps.py:105-124。
来源: api/controllers/service_api/wraps.py:55-134、api/services/end_user_service.py:1-20、api/extensions/ext_login.py:53-73
请求流程架构
核心执行管线
AppGenerateService 充当所有应用执行类型的中央编排器,在分发到特定生成器之前管理速率限制和配额。
来源: api/services/app_generate_service.py:89-152、api/services/quota_service.py:27-27、api/core/app/features/rate_limiting/rate_limit.py:17-18
响应模式:流式与阻塞
Dify 支持两种主要的响应模式,通常由请求载荷中的 streaming 布尔值或 response_mode 参数决定。
阻塞模式
请求会等待完整执行完成后才返回。服务层会返回最终结果对象。对于工作流执行,当流式传输禁用时,通常由 workflow_based_app_execution_task 处理 api/services/app_generate_service.py:180-184。
流式模式
使用服务器发送事件(SSE)。当启用流式传输时,AppGenerateService 会返回一个生成器(事件流)。对于高级聊天和工作流,它会通过 _build_streaming_task_on_subscribe 协调后台任务的启动,以确保客户端不会错过初始事件 api/services/app_generate_service.py:41-85。
来源: api/services/app_generate_service.py:95-95、api/services/app_generate_service.py:156-178、api/services/app_generate_service.py:41-85
追踪 ID 传播
Dify 通过追踪 ID 传播支持可观测性,将外部请求与内部跨度关联起来。
- 提取:在生成过程中,可以使用
AppGenerateHandler逻辑从请求头中提取外部追踪 IDapi/services/app_generate_service.py:88-89。 - 传播:
AppGenerateService.generate上的@trace_span装饰器确保执行跨度被正确父级化和追踪api/services/app_generate_service.py:88-88。 - SSE 协调:在流式模式下,由
RateLimit.gen_request_key()生成的request_id充当执行生命周期的唯一标识符api/services/app_generate_service.py:117-119。
来源: api/services/app_generate_service.py:88-89、api/extensions/otel.py:22-22、api/services/app_generate_service.py:117-119
计费与功能检查
对于云版和企业版,API 层与 BillingService 和 FeatureService 集成,以强制执行配额和许可证约束。
- 功能检索:
FeatureService.get_features(tenant_id)从环境变量、计费 API 和企业版许可证信息中聚合数据api/services/feature_service.py:187-207。 - 配额强制执行:
BillingService提供了预留和提交配额的方法(例如,用于工作流执行)api/services/billing_service.py:209-237。 - 访问拦截器:控制台和服务 API 包装器中的装饰器(如
@cloud_edition_billing_resource_check)会在超出限制(应用、成员、向量空间)时阻止操作api/controllers/console/wraps.py:94-133、api/controllers/service_api/wraps.py:136-166。 - 速率限制:
cloud_edition_billing_rate_limit_check实现了基于 Redis 的滑动窗口速率限制,用于知识库操作api/controllers/console/wraps.py:161-180。
来源: api/services/feature_service.py:187-207、api/services/billing_service.py:188-237、api/controllers/console/wraps.py:94-133、api/controllers/service_api/wraps.py:136-166、api/controllers/console/wraps.py:161-180