diff --git a/.claude/skills/dify-docs-env-vars/ignored-vars.md b/.claude/skills/dify-docs-env-vars/ignored-vars.md index f217f6cb9..c1d506b97 100644 --- a/.claude/skills/dify-docs-env-vars/ignored-vars.md +++ b/.claude/skills/dify-docs-env-vars/ignored-vars.md @@ -44,6 +44,9 @@ Meaningful only on the hosted Dify Cloud deployment; self-hosted users cannot us | `TIDB_ON_QDRANT_GRPC_PORT` | Hybrid TiDB-Qdrant Cloud-only backend. | PR #721, commit 9248032 | | `CREATE_TIDB_SERVICE_JOB_ENABLED` | Cloud-side TiDB pre-provisioning job. | PR #721, commit 9248032 | | `AMPLITUDE_API_KEY` | Cloud product analytics integration. | PR #721, commit 9248032 | +| `COOKIEYES_SITE_KEY` | CookieYes consent-banner key for Dify Cloud analytics. The frontend boundary requires `EDITION=CLOUD` plus the Cloud console host (`web/app/components/base/analytics-consent/request-boundary.ts`); dify PR #39408 explicitly excludes self-hosted deployments. Companion to `AMPLITUDE_API_KEY`. | dify #39408, 1.16.1 sync audit 2026-07-23 | +| `ENABLE_TRIAL_APP` | Cloud trial-app runs on Explore. The server gate (`api/services/recommended_app_service.py`) requires the derived `DEPLOYMENT_EDITION` property to be CLOUD—i.e. the `EDITION` env var set to `CLOUD`—so the flag is inert on self-host: `can_trial` is always false and the `/trial-apps/*` endpoints 403. | dify #39562, 1.16.1 sync audit 2026-07-27 | +| `ENABLE_EXPLORE_BANNER` | Marketing banner carousel on the Explore page. Banner content comes from the `exporle_banners` DB table (sic—the table name is misspelled upstream, `api/models/model.py`), which has no CE management UI or seed data—enabling the flag on self-host renders nothing. | dify #39543, 1.16.1 sync audit 2026-07-27 | ## Experimental / internal @@ -52,6 +55,21 @@ Feature flags for unfinished or staff-only features. Not yet meant for self-host | Variable | Reason | Source | |---|---|---| | `EXPERIMENTAL_ENABLE_VINEXT` | Switches the web container to an experimental Vite-based server (`web/docker/entrypoint.sh`). Not a supported user-facing knob. | 1.14 sync audit, 2026-04-22 | +| `KNOWLEDGE_FS_ENABLED` | Feature flag for the unreleased New Knowledge (KnowledgeFS) Console bridge. Default false; every proxy route 404s and the frontend hides the UI while off (`api/controllers/console/knowledge_fs_proxy.py`). Document the group and drop these five entries when the feature ships enabled. | dify #39158/#39314, 1.16.1 sync audit 2026-07-23 | +| `KNOWLEDGE_FS_BASE_URL` | Connection setting for the flag-off KnowledgeFS bridge; inert unless `KNOWLEDGE_FS_ENABLED=true`. | dify #39158/#39314, 1.16.1 sync audit 2026-07-23 | +| `KNOWLEDGE_FS_JWT_SECRET` | Service-JWT signing secret for the flag-off KnowledgeFS bridge; inert unless enabled. | dify #39158/#39314, 1.16.1 sync audit 2026-07-23 | +| `KNOWLEDGE_FS_TIMEOUT_SECONDS` | Request timeout for the flag-off KnowledgeFS bridge; inert unless enabled. | dify #39158/#39314, 1.16.1 sync audit 2026-07-23 | +| `KNOWLEDGE_FS_SSE_READ_TIMEOUT_SECONDS` | SSE idle-read timeout for the flag-off KnowledgeFS bridge; inert unless enabled. | dify #39158/#39314, 1.16.1 sync audit 2026-07-23 | +| `ENABLE_STEP_BY_STEP_TOUR` | Staged-rollout onboarding tour (home/studio/knowledge/integration guides). Flag-off, and eligibility additionally requires `STEP_BY_STEP_TOUR_ROLLOUT_STARTED_AT`, which is Pydantic-only (`api/services/step_by_step_tour_service.py` `is_eligible`)—the tour cannot be turned on from the docker env alone. Revisit when it ships enabled. | dify #38785/#39399, 1.16.1 sync audit 2026-07-27 | + +## Enterprise-only + +Switches for the Dify Enterprise control plane. Inert at their defaults on Community Edition; enabling them without the Enterprise services makes the deployment call APIs that don't exist. Enterprise deployments configure them through the EE Helm chart, not this file. + +| Variable | Reason | Source | +|---|---|---| +| `ENTERPRISE_ENABLED` | Master switch for EE integrations (branding, SSO, license, webapp auth). At `false` it is fully inert on CE. Setting `true` makes `get_system_features` call `EnterpriseService.get_info()` against `ENTERPRISE_API_URL`, which has no CE backend—based on the code, the console then fails to load. | dify #39543, 1.16.1 sync audit 2026-07-27 | +| `RBAC_ENABLED` | Routes permission checks to the EE inner RBAC API (`rbac_permission_required` in `api/controllers/common/wraps.py` is an explicit no-op when false). On CE there is no RBAC service to answer the checks. | dify #39543, 1.16.1 sync audit 2026-07-27 | ## Verifier false positives @@ -61,3 +79,4 @@ The variable is documented in `environments.mdx`, but the verifier misreports it |---|---|---| | `ALIYUN_CLOUDBOX_ID` | Commented-out `#ALIYUN_CLOUDBOX_ID=your-cloudbox-id` in `docker/.env.example`; backend field exists in `api/configs/middleware/storage/aliyun_oss_storage_config.py`. | 1.14 sync audit, 2026-04-22 | | `DIFY_AGENT_SERVER_SECRET_KEY` | Documented with a descriptive default; `.env.example` pre-fills a development key that the docs must not reproduce (no real or example secret values in docs). | feat/agent-v2 audit, 2026-07-09 | +| `DIFY_AGENT_API_TOKEN` | Documented with a descriptive default; `.env.example` pre-fills a development bearer token that the docs describe instead of reproduce (same rule as `DIFY_AGENT_SERVER_SECRET_KEY`). | dify #39544/#39622, 1.16.1 sync audit 2026-07-27 | diff --git a/en/api-reference/openapi_service.json b/en/api-reference/openapi_service.json index da4e51da6..819034e02 100644 --- a/en/api-reference/openapi_service.json +++ b/en/api-reference/openapi_service.json @@ -1963,10 +1963,18 @@ } }, "400": { - "description": "- `app_unavailable` : The app is unavailable or misconfigured.\n- `speech_to_text_disabled` : Speech-to-text is disabled for this app.\n- `provider_not_support_speech_to_text` : The model provider does not support speech-to-text.\n- `provider_not_initialize` : No valid model provider credentials are configured.\n- `provider_quota_exceeded` : The model provider quota is exhausted.\n- `model_currently_not_support` : The current model does not support this operation.\n- `completion_request_error` : The speech recognition request failed.", + "description": "- `no_audio_uploaded` : No audio file was provided in the `file` field.\n- `app_unavailable` : The app is unavailable or misconfigured.\n- `speech_to_text_disabled` : Speech-to-text is disabled for this app.\n- `provider_not_support_speech_to_text` : The model provider does not support speech-to-text.\n- `provider_not_initialize` : No valid model provider credentials are configured.\n- `provider_quota_exceeded` : The model provider quota is exhausted.\n- `model_currently_not_support` : The current model does not support this operation.\n- `completion_request_error` : The speech recognition request failed.", "content": { "application/json": { "examples": { + "no_audio_uploaded": { + "summary": "no_audio_uploaded", + "value": { + "status": 400, + "code": "no_audio_uploaded", + "message": "Please upload your audio." + } + }, "app_unavailable": { "summary": "app_unavailable", "value": { diff --git a/en/develop-plugin/dev-guides-and-walkthroughs/tool-plugin.mdx b/en/develop-plugin/dev-guides-and-walkthroughs/tool-plugin.mdx index 5c0182dc8..9870993fa 100644 --- a/en/develop-plugin/dev-guides-and-walkthroughs/tool-plugin.mdx +++ b/en/develop-plugin/dev-guides-and-walkthroughs/tool-plugin.mdx @@ -232,7 +232,7 @@ extra: - **`identity`**: Basic information about the tool, including name, author, label, and description. - **`parameters`**: The parameter list. - **`name`** (required): Parameter name; must be unique among the tool's parameters. - - **`type`** (required): Parameter type. One of `string`, `number`, `boolean`, `select`, or `secret-input`, rendered as a string, number, boolean, dropdown, or encrypted input box. Use `secret-input` for sensitive information. + - **`type`** (required): Parameter type. One of `string`, `number`, `boolean`, `select`, `dynamic-select`, or `secret-input`, rendered as a string, number, boolean, dropdown, dynamic dropdown, or encrypted input box. `dynamic-select` options are fetched from the plugin at configuration time; use `secret-input` for sensitive information. - **`label`** (required): Parameter label, shown in the frontend. - **`form`** (required): Form type, either `llm` or `form`. - In Agent applications, `llm` means the LLM infers the parameter itself, while `form` means the parameter can be preset before using the tool. @@ -243,6 +243,26 @@ extra: - **`options`** (optional): Parameter options. - In `llm` mode, Dify passes all options to the LLM, which can infer based on them. - In `form` mode, the frontend displays the options when `type` is `select`. + - **`multiple`** (optional): For `select` and `dynamic-select` parameters, set `true` to let users pick more than one option. The value is passed as a list of option values, and `default`, if set, must then be a list. + + ```yaml + - name: formats + type: select + multiple: true + form: form + label: + en_US: Formats + options: + - label: + en_US: Markdown + value: markdown + - label: + en_US: Links + value: links + default: + - markdown + ``` + - **`default`** (optional): Default value. - **`min`** (optional): Minimum value; applies when the parameter type is `number`. - **`max`** (optional): Maximum value; applies when the parameter type is `number`. diff --git a/en/self-host/deploy/configuration/environments.mdx b/en/self-host/deploy/configuration/environments.mdx index d8cee26fd..ef1ab0839 100644 --- a/en/self-host/deploy/configuration/environments.mdx +++ b/en/self-host/deploy/configuration/environments.mdx @@ -155,6 +155,7 @@ If you use your own reverse proxy, forward `Upgrade` and `Connection` headers on | `FLASK_DEBUG` | `false` | Standard Flask debug mode flag. Not actively used by Dify; `DEBUG` is the primary control. | | `ENABLE_REQUEST_LOGGING` | `false` | Logs a compact access line (`METHOD PATH STATUS DURATION TRACE_ID`) for every HTTP request. When `LOG_LEVEL` is also set to `DEBUG`, additionally logs full request and response bodies as JSON. | | `DEPLOY_ENV` | `PRODUCTION` | Tags monitoring data in Sentry and OpenTelemetry so you can filter errors and traces by environment. Also sent as the `X-Env` response header. Does not change application behavior. | +| `EDITION` | `SELF_HOSTED` | Deployment identity, exposed to the console as `deployment_edition`. Keep the default: `CLOUD` is the mode Dify's hosted service runs in—it skips the initial admin-setup wizard and switches on billing and hosted-model behavior that talks to Dify-internal services, so a deployment set to `CLOUD` cannot complete setup. | | `MIGRATION_ENABLED` | `true` | When `true`, runs database schema migrations (`flask upgrade-db`) automatically on container startup. Docker only. Set to `false` if you run migrations separately. For source code launches, run `flask db upgrade` manually. | | `CHECK_UPDATE_URL` | `https://updates.dify.ai` | The console checks this URL for newer Dify versions. Set to empty to disable—useful for air-gapped environments or to prevent external HTTP calls. | | `OPENAI_API_BASE` | `https://api.openai.com/v1` | Legacy variable. Not actively used by Dify's own code. May be picked up by the OpenAI Python SDK if present in the environment. | @@ -1153,6 +1154,19 @@ For more details, see the [SendGrid documentation](https://www.twilio.com/docs/s |---|---|---| | `ENABLE_LEARN_APP` | `true` | Shows the Learn Dify section: tutorial templates on the Explore page, the getting-started panel when Studio has no apps, and its show/hide toggle in the help menu.
Set to `false` to hide all three. | +#### Authentication and Accounts + +By default, sign-in is email + password, and new accounts come from workspace invitations or the initial setup wizard. The toggles below relax or tighten that. + +| Variable | Default | Description | +|---|---|---| +| `ENABLE_EMAIL_PASSWORD_LOGIN` | `true` | Sign in to the console with email and password. When disabled, the password form disappears from the sign-in page and the password login, password reset, and self-serve signup endpoints all return 403. Keep at least one sign-in method enabled—if every method is off, the sign-in page shows "Authentication method not configured" and no one can log in until you change the setting back. | +| `ENABLE_EMAIL_CODE_LOGIN` | `false` | Sign in with a one-time 6-digit code sent by email instead of a password. Requires mail delivery to be configured (see [Mail Configuration](#mail-configuration))—without it, codes are never delivered. With `ALLOW_REGISTER=true`, entering a code for an unknown email also creates the account, so this doubles as a self-serve signup path. | +| `ENABLE_SOCIAL_OAUTH_LOGIN` | `false` | Shows GitHub and Google sign-in buttons on the console sign-in page. The buttons only work if the matching GitHub or Google OAuth app credentials are also configured on the API service; with the flag on but no credentials, sign-in attempts fail. First-time OAuth sign-ins create an account only when `ALLOW_REGISTER=true`. | +| `ALLOW_REGISTER` | `false` | Lets people create their own accounts: shows the sign-up link on the sign-in page (with password login enabled) and allows first-time email-code or OAuth sign-ins to create accounts. Leave `false` for an invite-only deployment—workspace invitations and the initial setup wizard always work regardless. | +| `ALLOW_CREATE_WORKSPACE` | `false` | Automatically creates a workspace for an account that doesn't belong to one—during self-serve registration and at email-code or OAuth sign-in. When `false`, such accounts must wait for a workspace invitation. The admin workspace created by the setup wizard is unaffected. | +| `ENABLE_CHANGE_EMAIL` | `true` | Lets users change their account's email address from the account settings page. The flow confirms the change with emailed verification codes, so it requires mail delivery to be configured. Set to `false` to lock account emails, e.g. when they must match an external directory. | + #### LLMOps Trace Delivery Traces of app runs are delivered to the configured LLMOps provider (Langfuse, LangSmith, Arize/Phoenix, and so on) by a background task. These variables govern its retries on transient failures. @@ -1347,6 +1361,14 @@ Generate one with: python3 -c "import secrets; print(secrets.token_urlsafe(32))" ``` +### DIFY_AGENT_API_TOKEN + +Default: (development token pre-filled in `.env.example`; must be replaced for production) + +Bearer token the Dify API presents when calling the agent backend's run API. Compose passes the same value to both services, so setting it once keeps them in agreement. + +A publicly known development token ships as the default, so the stack starts out of the box—but anyone who can reach the agent backend and knows the token can start runs. Replace it with your own random value before production use. + ### NEXT_PUBLIC_ENABLE_AGENT_V2 Default: `true` diff --git a/en/self-host/deploy/quick-start/docker-compose.mdx b/en/self-host/deploy/quick-start/docker-compose.mdx index 4d8bdc80b..049f4646f 100644 --- a/en/self-host/deploy/quick-start/docker-compose.mdx +++ b/en/self-host/deploy/quick-start/docker-compose.mdx @@ -66,7 +66,7 @@ Make sure your machine meets the following minimum system requirements. The following containers will be started: - 7 core services: `api`, `api_websocket`, `worker`, `worker_beat`, `web`, `plugin_daemon`, `agent_backend` - - 7 dependent components: `weaviate`, `db_postgres`, `redis`, `nginx`, `ssrf_proxy`, `sandbox`, `local_sandbox` + - 8 dependent components: `weaviate`, `db_postgres`, `redis`, `nginx`, `ssrf_proxy`, `agent_ssrf_proxy`, `sandbox`, `local_sandbox` - 1 one-time task: `init_permissions`, which sets storage file permissions and exits when done 4. Verify that all containers are running successfully: diff --git a/en/self-host/use-dify/build/new-agent/build.mdx b/en/self-host/use-dify/build/new-agent/build.mdx index a7090cef6..b051af667 100644 --- a/en/self-host/use-dify/build/new-agent/build.mdx +++ b/en/self-host/use-dify/build/new-agent/build.mdx @@ -15,7 +15,7 @@ If your deployment requires strong isolation or strict security or compliance co The new Agent is in beta. It's on by default on Docker Compose, with its runtime bundled in. -For production, replace [`DIFY_AGENT_SERVER_SECRET_KEY`](/en/self-host/deploy/configuration/environments#dify_agent_server_secret_key) with your own random value. +For production, replace [`DIFY_AGENT_SERVER_SECRET_KEY`](/en/self-host/deploy/configuration/environments#dify_agent_server_secret_key) and [`DIFY_AGENT_API_TOKEN`](/en/self-host/deploy/configuration/environments#dify_agent_api_token) with your own random values. ## Create an Agent diff --git a/en/self-host/use-dify/build/new-agent/overview.mdx b/en/self-host/use-dify/build/new-agent/overview.mdx index 19273ec03..f3b4766fa 100644 --- a/en/self-host/use-dify/build/new-agent/overview.mdx +++ b/en/self-host/use-dify/build/new-agent/overview.mdx @@ -15,7 +15,7 @@ If your deployment requires strong isolation or strict security or compliance co The new Agent is in beta. It's on by default on Docker Compose, with its runtime bundled in. -For production, replace [`DIFY_AGENT_SERVER_SECRET_KEY`](/en/self-host/deploy/configuration/environments#dify_agent_server_secret_key) with your own random value. +For production, replace [`DIFY_AGENT_SERVER_SECRET_KEY`](/en/self-host/deploy/configuration/environments#dify_agent_server_secret_key) and [`DIFY_AGENT_API_TOKEN`](/en/self-host/deploy/configuration/environments#dify_agent_api_token) with your own random values. An *Agent* is an AI worker you set up once and then put to work. It's a different kind of agent than the [classic Agent app](/en/self-host/use-dify/build/agent): diff --git a/en/self-host/use-dify/nodes/agent.mdx b/en/self-host/use-dify/nodes/agent.mdx index f58b04a93..237d235f3 100644 --- a/en/self-host/use-dify/nodes/agent.mdx +++ b/en/self-host/use-dify/nodes/agent.mdx @@ -6,7 +6,7 @@ description: Run an agent as a step in your workflow, reasoning and using tools The new Agent node is in beta. It's on by default on Docker Compose, with its runtime bundled in. - For production, replace [`DIFY_AGENT_SERVER_SECRET_KEY`](/en/self-host/deploy/configuration/environments#dify_agent_server_secret_key) with your own random value. + For production, replace [`DIFY_AGENT_SERVER_SECRET_KEY`](/en/self-host/deploy/configuration/environments#dify_agent_server_secret_key) and [`DIFY_AGENT_API_TOKEN`](/en/self-host/deploy/configuration/environments#dify_agent_api_token) with your own random values. @@ -137,9 +137,9 @@ description: Run an agent as a step in your workflow, reasoning and using tools You pick the agent and tell it what to do; it works through the task on its own and hands the results back to the rest of the flow. - - In a Chatflow, the agent doesn't keep conversation-scoped memory: it handles each message from scratch. - + + The new Agent node is available in Workflow apps only. + ## Choose an Agent diff --git a/ja/api-reference/openapi_service.json b/ja/api-reference/openapi_service.json index c76514365..6ab4816ee 100644 --- a/ja/api-reference/openapi_service.json +++ b/ja/api-reference/openapi_service.json @@ -1963,10 +1963,18 @@ } }, "400": { - "description": "- `app_unavailable` : アプリケーションが利用できないか、設定が正しくありません。\n- `speech_to_text_disabled` : このアプリでは音声からテキストへの変換が無効になっています。\n- `provider_not_support_speech_to_text` : モデルプロバイダーが音声認識をサポートしていません。\n- `provider_not_initialize` : 有効なモデルプロバイダーの認証情報が見つかりません。\n- `provider_quota_exceeded` : モデルプロバイダーのクォータが使い切られました。\n- `model_currently_not_support` : 現在のモデルはこの操作をサポートしていません。\n- `completion_request_error` : 音声認識リクエストに失敗しました。", + "description": "- `no_audio_uploaded` : 音声ファイルがアップロードされていません(`file` フィールドがありません)。\n- `app_unavailable` : アプリケーションが利用できないか、設定が正しくありません。\n- `speech_to_text_disabled` : このアプリでは音声からテキストへの変換が無効になっています。\n- `provider_not_support_speech_to_text` : モデルプロバイダーが音声認識をサポートしていません。\n- `provider_not_initialize` : 有効なモデルプロバイダーの認証情報が見つかりません。\n- `provider_quota_exceeded` : モデルプロバイダーのクォータが使い切られました。\n- `model_currently_not_support` : 現在のモデルはこの操作をサポートしていません。\n- `completion_request_error` : 音声認識リクエストに失敗しました。", "content": { "application/json": { "examples": { + "no_audio_uploaded": { + "summary": "no_audio_uploaded", + "value": { + "status": 400, + "code": "no_audio_uploaded", + "message": "Please upload your audio." + } + }, "app_unavailable": { "summary": "app_unavailable", "value": { diff --git a/ja/develop-plugin/dev-guides-and-walkthroughs/tool-plugin.mdx b/ja/develop-plugin/dev-guides-and-walkthroughs/tool-plugin.mdx index eba54b9e2..28f6249b9 100644 --- a/ja/develop-plugin/dev-guides-and-walkthroughs/tool-plugin.mdx +++ b/ja/develop-plugin/dev-guides-and-walkthroughs/tool-plugin.mdx @@ -234,7 +234,7 @@ extra: - **`identity`**:名前、作者、ラベル、説明などのツールの基本情報。 - **`parameters`**:パラメータリスト。 - **`name`**(必須):パラメータ名。ツールのパラメータ内で一意である必要があります。 - - **`type`**(必須):パラメータタイプ。`string`、`number`、`boolean`、`select`、`secret-input` のいずれかで、それぞれ文字列、数値、ブール値、ドロップダウン、暗号化入力ボックスとして表示されます。機密情報には `secret-input` を使用してください。 + - **`type`**(必須):パラメータタイプ。`string`、`number`、`boolean`、`select`、`dynamic-select`、`secret-input` のいずれかで、それぞれ文字列、数値、ブール値、ドロップダウン、動的ドロップダウン、暗号化入力ボックスとして表示されます。`dynamic-select` のオプションはプラグインが設定時に取得します。機密情報には `secret-input` を使用してください。 - **`label`**(必須):パラメータラベル。フロントエンドに表示されます。 - **`form`**(必須):フォームタイプ。`llm` または `form` のいずれか。 - Agent アプリケーションでは、`llm` はパラメータを LLM が自動的に推論することを意味し、`form` はツールを使用する前にパラメータを事前設定できることを意味します。 @@ -245,6 +245,26 @@ extra: - **`options`**(任意):パラメータオプション。 - `llm` モードでは、Dify はすべてのオプションを LLM に渡し、LLM がそれらに基づいて推論できます。 - `form` モードでは、`type` が `select` の場合にフロントエンドがオプションを表示します。 + - **`multiple`**(任意):`select` と `dynamic-select` パラメータで `true` にすると、複数のオプションを選択できます。値はオプション値のリストとして渡され、`default` を設定する場合はリストにする必要があります。 + + ```yaml + - name: formats + type: select + multiple: true + form: form + label: + en_US: Formats + options: + - label: + en_US: Markdown + value: markdown + - label: + en_US: Links + value: links + default: + - markdown + ``` + - **`default`**(任意):デフォルト値。 - **`min`**(任意):最小値。パラメータタイプが `number` の場合に適用されます。 - **`max`**(任意):最大値。パラメータタイプが `number` の場合に適用されます。 diff --git a/ja/self-host/deploy/configuration/environments.mdx b/ja/self-host/deploy/configuration/environments.mdx index 80f577315..33b0e5944 100644 --- a/ja/self-host/deploy/configuration/environments.mdx +++ b/ja/self-host/deploy/configuration/environments.mdx @@ -153,6 +153,7 @@ Docker ネットワーク内のサービス間通信で使用されるファイ | `FLASK_DEBUG` | `false` | 標準 Flask デバッグモードフラグ。Dify では積極的に使用されていません。`DEBUG` が主要な制御変数です。 | | `ENABLE_REQUEST_LOGGING` | `false` | すべての HTTP リクエストに対してコンパクトなアクセスログ(`METHOD PATH STATUS DURATION TRACE_ID`)を記録します。`LOG_LEVEL`が `DEBUG` に設定されている場合、完全なリクエストとレスポンスボディも JSON 形式で記録されます。 | | `DEPLOY_ENV` | `PRODUCTION` | Sentry と OpenTelemetry の監視データにタグ付けし、環境別にエラーとトレースをフィルタリングできるようにします。`X-Env` レスポンスヘッダーとしても送信されます。アプリケーションの動作は変更しません。 | +| `EDITION` | `SELF_HOSTED` | デプロイの種別を示す値で、コンソールには `deployment_edition` として公開されます。デフォルトのまま使用してください。`CLOUD` は Dify のホステッドサービス向けのモードです。初期管理者のセットアップウィザードを省略し、課金などで Dify 内部サービスを呼び出すため、`CLOUD` に設定したデプロイはセットアップを完了できません。 | | `MIGRATION_ENABLED` | `true` | `true`の場合、コンテナ起動時にデータベーススキーママイグレーション(`flask upgrade-db`)を自動実行します。Docker のみ。マイグレーションを別途実行する場合は `false`に設定してください。ソースコードからの起動では、`flask db upgrade` を手動で実行してください。 | | `CHECK_UPDATE_URL` | `https://updates.dify.ai` | コンソールがこの URL で Dify の新バージョンを確認します。空に設定すると無効化されます。エアギャップ環境や外部 HTTP コールを防止したい場合に有用です。 | | `OPENAI_API_BASE` | `https://api.openai.com/v1` | レガシー変数。Dify 自身のコードでは積極的に使用されていません。環境に存在する場合、OpenAI Python SDK に読み取られる可能性があります。 | @@ -1151,6 +1152,19 @@ Dify はアカウント招待、パスワードリセット、ログインコー |---|---|---| | `ENABLE_LEARN_APP` | `true` | Learn Dify セクションの表示を切り替えます。対象は探索ページのチュートリアルテンプレート、スタジオにアプリがないときの入門パネル、ヘルプメニューの表示切り替えです。
`false` で 3 か所とも非表示になります。 | +#### 認証とアカウント + +デフォルトでは、サインインはメールアドレスとパスワードで行い、新しいアカウントはワークスペースへの招待または初期セットアップウィザードで作成します。以下のトグルでこの方針を調整できます。 + +| 変数 | デフォルト値 | 説明 | +|---|---|---| +| `ENABLE_EMAIL_PASSWORD_LOGIN` | `true` | メールアドレスとパスワードでコンソールにサインインします。無効にすると、サインインページからパスワードフォームが消え、パスワードログイン、パスワードリセット、セルフサービス登録の各エンドポイントが 403 を返します。サインイン方法は必ず 1 つ以上有効にしてください。すべて無効にすると、認証方式が未設定である旨が表示され、設定を戻すまで誰もログインできません。 | +| `ENABLE_EMAIL_CODE_LOGIN` | `false` | パスワードの代わりに、メールで届く 6 桁のワンタイムコードでサインインします。メール送信の設定が必要です([メール設定](#メール設定) を参照)。未設定ではコードが届きません。`ALLOW_REGISTER=true` の場合、未登録のメールアドレスでコードを入力するとアカウントも作成されるため、セルフサービス登録の経路にもなります。 | +| `ENABLE_SOCIAL_OAUTH_LOGIN` | `false` | コンソールのサインインページに GitHub と Google のサインインボタンを表示します。ボタンが機能するのは、対応する GitHub または Google の OAuth アプリ認証情報を API サービスに設定した場合だけです。フラグだけ有効にして認証情報が未設定だと、サインインは失敗します。初回の OAuth サインインでアカウントが作成されるのは `ALLOW_REGISTER=true` のときだけです。 | +| `ALLOW_REGISTER` | `false` | アカウントの自己作成を許可します。サインインページに新規登録リンクを表示し(パスワードログインが有効な場合)、初回のメールコードまたは OAuth サインインでのアカウント作成を許可します。招待制にするには `false` のままにします。ワークスペースへの招待と初期セットアップウィザードは常に利用できます。 | +| `ALLOW_CREATE_WORKSPACE` | `false` | どのワークスペースにも属さないアカウントに対して、セルフサービス登録時やメールコード、OAuth サインイン時にワークスペースを自動作成します。`false` の場合、こうしたアカウントはワークスペースへの招待を待つ必要があります。セットアップウィザードが作成する管理者ワークスペースには影響しません。 | +| `ENABLE_CHANGE_EMAIL` | `true` | アカウント設定ページからメールアドレスを変更できるようにします。変更はメールの確認コードで検証されるため、メール送信の設定が必要です。外部ディレクトリと一致させる必要がある場合など、メールアドレスを固定したいときは `false` に設定します。 | + #### LLMOps トレース配信 アプリ実行のトレースは、バックグラウンドタスクが LLMOps プロバイダーへ配信します。対象のプロバイダーは Langfuse、LangSmith、Arize/Phoenix などです。以下の変数は、一時的な失敗時のリトライを制御します。 @@ -1341,6 +1355,14 @@ Agent バックエンドが内部トークンの鍵を導出するためのル python3 -c "import secrets; print(secrets.token_urlsafe(32))" ``` +### DIFY_AGENT_API_TOKEN + +デフォルト値:(`.env.example` に開発用トークンを設定済み。本番環境では必ず置き換えてください) + +Dify API が Agent バックエンドの実行 API を呼び出す際に提示する Bearer トークンです。Compose は同じ値を両方のサービスに渡すため、一度設定するだけで一致が保たれます。 + +デフォルトは公開された開発用トークンのため、デプロイはそのまま起動します。ただし、Agent バックエンドに到達でき、トークンを知っていれば誰でも実行を開始できます。本番環境で使用する前に、独自のランダムな値に置き換えてください。 + ### NEXT_PUBLIC_ENABLE_AGENT_V2 デフォルト値:`true` diff --git a/ja/self-host/deploy/quick-start/docker-compose.mdx b/ja/self-host/deploy/quick-start/docker-compose.mdx index 08d711ca6..3853219f3 100644 --- a/ja/self-host/deploy/quick-start/docker-compose.mdx +++ b/ja/self-host/deploy/quick-start/docker-compose.mdx @@ -68,7 +68,7 @@ sidebarTitle: Docker Compose 以下のコンテナが起動します: - 7 つのコアサービス:`api`、`api_websocket`、`worker`、`worker_beat`、`web`、`plugin_daemon`、`agent_backend` - - 7 つの依存コンポーネント:`weaviate`、`db_postgres`、`redis`、`nginx`、`ssrf_proxy`、`sandbox`、`local_sandbox` + - 8 つの依存コンポーネント:`weaviate`、`db_postgres`、`redis`、`nginx`、`ssrf_proxy`、`agent_ssrf_proxy`、`sandbox`、`local_sandbox` - 1 つの一時タスク:`init_permissions`(ストレージのファイル権限を設定し、完了後に終了します) 4. すべてのコンテナが正常に動作しているか確認します: diff --git a/ja/self-host/use-dify/build/new-agent/build.mdx b/ja/self-host/use-dify/build/new-agent/build.mdx index aa3650e77..bba7d2688 100644 --- a/ja/self-host/use-dify/build/new-agent/build.mdx +++ b/ja/self-host/use-dify/build/new-agent/build.mdx @@ -17,7 +17,7 @@ Community Edition では、同一の Agent を複数のエンドユーザーに 新しい Agent は Community Edition のベータ機能です。ランタイムは Docker Compose デプロイに同梱され、デフォルトで有効です。 -本番環境では、[`DIFY_AGENT_SERVER_SECRET_KEY`](/ja/self-host/deploy/configuration/environments#dify_agent_server_secret_key) を独自のランダムな値に置き換えてください。 +本番環境では、[`DIFY_AGENT_SERVER_SECRET_KEY`](/ja/self-host/deploy/configuration/environments#dify_agent_server_secret_key) と [`DIFY_AGENT_API_TOKEN`](/ja/self-host/deploy/configuration/environments#dify_agent_api_token) を独自のランダムな値に置き換えてください。 ## Agent の作成 diff --git a/ja/self-host/use-dify/build/new-agent/overview.mdx b/ja/self-host/use-dify/build/new-agent/overview.mdx index 734bab3a8..b965dac48 100644 --- a/ja/self-host/use-dify/build/new-agent/overview.mdx +++ b/ja/self-host/use-dify/build/new-agent/overview.mdx @@ -17,7 +17,7 @@ Community Edition では、同一の Agent を複数のエンドユーザーに 新しい Agent は Community Edition のベータ機能です。ランタイムは Docker Compose デプロイに同梱され、デフォルトで有効です。 -本番環境では、[`DIFY_AGENT_SERVER_SECRET_KEY`](/ja/self-host/deploy/configuration/environments#dify_agent_server_secret_key) を独自のランダムな値に置き換えてください。 +本番環境では、[`DIFY_AGENT_SERVER_SECRET_KEY`](/ja/self-host/deploy/configuration/environments#dify_agent_server_secret_key) と [`DIFY_AGENT_API_TOKEN`](/ja/self-host/deploy/configuration/environments#dify_agent_api_token) を独自のランダムな値に置き換えてください。 「Agent」は、一度セットアップすれば仕事を任せられる AI ワーカーです。[クラシック Agent アプリ](/ja/self-host/use-dify/build/agent) とは異なる、次の特徴を持つ Agent です: diff --git a/ja/self-host/use-dify/nodes/agent.mdx b/ja/self-host/use-dify/nodes/agent.mdx index 386f3ce8f..67601865c 100644 --- a/ja/self-host/use-dify/nodes/agent.mdx +++ b/ja/self-host/use-dify/nodes/agent.mdx @@ -8,7 +8,7 @@ description: "ワークフローの 1 ステップとして Agent を実行し 新しい Agent ノードはベータ版です。ランタイムは Docker Compose デプロイに同梱され、デフォルトで有効です。 - 本番環境では、[`DIFY_AGENT_SERVER_SECRET_KEY`](/ja/self-host/deploy/configuration/environments#dify_agent_server_secret_key) を独自のランダムな値に置き換えてください。 + 本番環境では、[`DIFY_AGENT_SERVER_SECRET_KEY`](/ja/self-host/deploy/configuration/environments#dify_agent_server_secret_key) と [`DIFY_AGENT_API_TOKEN`](/ja/self-host/deploy/configuration/environments#dify_agent_api_token) を独自のランダムな値に置き換えてください。 @@ -139,9 +139,9 @@ description: "ワークフローの 1 ステップとして Agent を実行し Agent を選んで、やるべきことを伝えるだけです。Agent は自力でタスクをこなし、結果をフローの続きに返します。 - - Chatflow では、Agent は会話単位の記憶を保持しません。各メッセージを毎回白紙の状態から処理します。 - + + 新しい Agent ノードは Workflow アプリでのみ使用できます。 + ## Agent の選択 diff --git a/zh/api-reference/openapi_service.json b/zh/api-reference/openapi_service.json index f1cfe2474..f6e0c6f46 100644 --- a/zh/api-reference/openapi_service.json +++ b/zh/api-reference/openapi_service.json @@ -1963,10 +1963,18 @@ } }, "400": { - "description": "- `app_unavailable` : 应用不可用或配置错误。\n- `speech_to_text_disabled` : 此应用未启用语音转文本。\n- `provider_not_support_speech_to_text` : 模型供应商不支持语音转文字。\n- `provider_not_initialize` : 未配置有效的模型供应商凭据。\n- `provider_quota_exceeded` : 模型供应商配额已用尽。\n- `model_currently_not_support` : 当前模型不支持此操作。\n- `completion_request_error` : 语音识别请求失败。", + "description": "- `no_audio_uploaded` : 未上传音频文件(`file` 字段缺失)。\n- `app_unavailable` : 应用不可用或配置错误。\n- `speech_to_text_disabled` : 此应用未启用语音转文本。\n- `provider_not_support_speech_to_text` : 模型供应商不支持语音转文字。\n- `provider_not_initialize` : 未配置有效的模型供应商凭据。\n- `provider_quota_exceeded` : 模型供应商配额已用尽。\n- `model_currently_not_support` : 当前模型不支持此操作。\n- `completion_request_error` : 语音识别请求失败。", "content": { "application/json": { "examples": { + "no_audio_uploaded": { + "summary": "no_audio_uploaded", + "value": { + "status": 400, + "code": "no_audio_uploaded", + "message": "Please upload your audio." + } + }, "app_unavailable": { "summary": "app_unavailable", "value": { diff --git a/zh/develop-plugin/dev-guides-and-walkthroughs/tool-plugin.mdx b/zh/develop-plugin/dev-guides-and-walkthroughs/tool-plugin.mdx index 0b2e4bfce..d6bce7e2c 100644 --- a/zh/develop-plugin/dev-guides-and-walkthroughs/tool-plugin.mdx +++ b/zh/develop-plugin/dev-guides-and-walkthroughs/tool-plugin.mdx @@ -234,7 +234,7 @@ extra: - **`identity`**:工具的基本信息,包括名称、作者、标签和描述。 - **`parameters`**:参数列表。 - **`name`**(必填):参数名称,在工具的参数中必须唯一。 - - **`type`**(必填):参数类型。可选值为 `string`、`number`、`boolean`、`select`、`secret-input`,分别渲染为字符串、数字、布尔值、下拉框、加密输入框。敏感信息请使用 `secret-input`。 + - **`type`**(必填):参数类型。可选值为 `string`、`number`、`boolean`、`select`、`dynamic-select`、`secret-input`,分别渲染为字符串、数字、布尔值、下拉框、动态下拉框、加密输入框。`dynamic-select` 的选项由插件在配置时动态获取;敏感信息请使用 `secret-input`。 - **`label`**(必填):参数标签,显示在前端。 - **`form`**(必填):表单类型,可选 `llm` 或 `form`。 - 在 Agent 应用中,`llm` 表示由 LLM 自行推断参数,`form` 表示可在使用工具前预先设置参数。 @@ -245,6 +245,26 @@ extra: - **`options`**(可选):参数选项。 - 在 `llm` 模式下,Dify 会将所有选项传递给 LLM,由其据此推断。 - 在 `form` 模式下,当 `type` 为 `select` 时,前端会显示这些选项。 + - **`multiple`**(可选):用于 `select` 和 `dynamic-select` 参数,设为 `true` 后用户可选择多个选项。参数值以选项值列表传递;此时若设置 `default`,必须为列表。 + + ```yaml + - name: formats + type: select + multiple: true + form: form + label: + en_US: Formats + options: + - label: + en_US: Markdown + value: markdown + - label: + en_US: Links + value: links + default: + - markdown + ``` + - **`default`**(可选):默认值。 - **`min`**(可选):最小值,参数类型为 `number` 时适用。 - **`max`**(可选):最大值,参数类型为 `number` 时适用。 diff --git a/zh/self-host/deploy/configuration/environments.mdx b/zh/self-host/deploy/configuration/environments.mdx index 121478253..abd850049 100644 --- a/zh/self-host/deploy/configuration/environments.mdx +++ b/zh/self-host/deploy/configuration/environments.mdx @@ -153,6 +153,7 @@ Docker 网络内部服务间通信使用的文件访问 URL(例如插件守护 | `FLASK_DEBUG` | `false` | 标准 Flask 调试模式标志。Dify 未主动使用;`DEBUG` 是主要控制变量。 | | `ENABLE_REQUEST_LOGGING` | `false` | 为每个 HTTP 请求记录一条紧凑的访问日志(`METHOD PATH STATUS DURATION TRACE_ID`)。当 `LOG_LEVEL` 同时设为 `DEBUG` 时,还会以 JSON 格式记录完整的请求和响应体。 | | `DEPLOY_ENV` | `PRODUCTION` | 在 Sentry 和 OpenTelemetry 中标记监控数据,以便按环境过滤错误和追踪。也作为 `X-Env` 响应头发送。不改变应用行为。 | +| `EDITION` | `SELF_HOSTED` | 部署身份标识,以 `deployment_edition` 暴露给控制台。保持默认值:`CLOUD` 是 Dify 托管服务的运行模式,会跳过初始管理员设置向导,并启用依赖 Dify 内部服务的计费与托管模型行为,因此设为 `CLOUD` 的部署无法完成初始化设置。 | | `MIGRATION_ENABLED` | `true` | 为 `true` 时,容器启动时自动运行数据库架构迁移(`flask upgrade-db`)。仅限 Docker。如果你单独运行迁移,请设为 `false`。对于源码启动,需手动运行 `flask db upgrade`。 | | `CHECK_UPDATE_URL` | `https://updates.dify.ai` | 控制台通过此 URL 检查 Dify 的新版本。设为空可禁用,适用于离线环境或防止外部 HTTP 调用。 | | `OPENAI_API_BASE` | `https://api.openai.com/v1` | 遗留变量。Dify 自身代码未主动使用。如果存在于环境中,可能会被 OpenAI Python SDK 读取。 | @@ -1151,6 +1152,19 @@ Dify 发送邮件用于账户邀请、密码重置、登录验证码和人工输 |---|---|---| | `ENABLE_LEARN_APP` | `true` | 显示 Learn Dify 版块:探索页的教程模板、工作室中还没有应用时的入门面板,以及帮助菜单中的显示开关。
设为 `false` 可同时隐藏三处。 | +#### 认证与账户 + +默认情况下,用户以邮箱和密码登录,新账户通过工作空间邀请或初始设置向导创建。以下开关可放宽或收紧这一策略。 + +| 变量 | 默认值 | 说明 | +|---|---|---| +| `ENABLE_EMAIL_PASSWORD_LOGIN` | `true` | 使用邮箱和密码登录控制台。关闭后,登录页不再显示密码表单,密码登录、密码重置和自助注册接口均返回 403。至少保留一种登录方式:若全部关闭,登录页会提示未配置认证方式,在改回设置前无人能登录。 | +| `ENABLE_EMAIL_CODE_LOGIN` | `false` | 使用邮件发送的 6 位一次性验证码登录,无需密码。需要先配置邮件发送(参见 [邮件配置](#邮件配置)),否则验证码无法送达。当 `ALLOW_REGISTER=true` 时,未注册邮箱输入验证码即可同时创建账户,相当于一条自助注册途径。 | +| `ENABLE_SOCIAL_OAUTH_LOGIN` | `false` | 在控制台登录页显示 GitHub 和 Google 登录按钮。按钮需在 API 服务上配置相应的 GitHub 或 Google OAuth 应用凭据后才可用;只开启开关而未配置凭据时,登录会失败。首次 OAuth 登录仅在 `ALLOW_REGISTER=true` 时创建账户。 | +| `ALLOW_REGISTER` | `false` | 允许自助创建账户:在登录页显示注册链接(需同时启用密码登录),并允许首次邮箱验证码或 OAuth 登录时创建账户。保持 `false` 即为仅限邀请的部署,工作空间邀请和初始设置向导始终不受影响。 | +| `ALLOW_CREATE_WORKSPACE` | `false` | 为不属于任何工作空间的账户自动创建工作空间,作用于自助注册及邮箱验证码或 OAuth 登录。设为 `false` 时,这类账户需等待工作空间邀请。设置向导创建的管理员工作空间不受影响。 | +| `ENABLE_CHANGE_EMAIL` | `true` | 允许用户在账户设置页修改账户邮箱。修改流程通过邮件验证码确认,因此需要配置邮件发送。设为 `false` 可锁定账户邮箱,例如需要与外部目录保持一致时。 | + #### LLMOps 追踪投递 应用运行的追踪数据由后台任务投递给所配置的 LLMOps 供应商(Langfuse、LangSmith、Arize/Phoenix 等)。以下变量控制遇到瞬时失败后的重试行为。 @@ -1343,6 +1357,14 @@ Agent 后端的根密钥,用于派生各类内部令牌的密钥,其中包 python3 -c "import secrets; print(secrets.token_urlsafe(32))" ``` +### DIFY_AGENT_API_TOKEN + +默认值:(`.env.example` 中预填了开发令牌,生产环境必须替换) + +Dify API 调用 Agent 后端运行接口时出示的 Bearer 令牌。Compose 会把同一个值传给两侧服务,设置一次即可保持一致。 + +默认值是一个公开的开发令牌,部署可开箱即用;但任何能访问 Agent 后端且知道该令牌的人都能发起运行,生产环境使用前务必替换为你自己的随机值。 + ### NEXT_PUBLIC_ENABLE_AGENT_V2 默认值:`true` diff --git a/zh/self-host/deploy/quick-start/docker-compose.mdx b/zh/self-host/deploy/quick-start/docker-compose.mdx index 2e3b382fa..9e0f04ab2 100644 --- a/zh/self-host/deploy/quick-start/docker-compose.mdx +++ b/zh/self-host/deploy/quick-start/docker-compose.mdx @@ -68,7 +68,7 @@ sidebarTitle: Docker Compose 启动以下容器: - 7 个核心服务:`api`、`api_websocket`、`worker`、`worker_beat`、`web`、`plugin_daemon`、`agent_backend` - - 7 个依赖组件:`weaviate`、`db_postgres`、`redis`、`nginx`、`ssrf_proxy`、`sandbox`、`local_sandbox` + - 8 个依赖组件:`weaviate`、`db_postgres`、`redis`、`nginx`、`ssrf_proxy`、`agent_ssrf_proxy`、`sandbox`、`local_sandbox` - 1 个一次性任务:`init_permissions`,用于设置存储文件权限,完成后自动退出。 4. 验证所有容器是否成功运行: diff --git a/zh/self-host/use-dify/build/new-agent/build.mdx b/zh/self-host/use-dify/build/new-agent/build.mdx index e9267fedc..5651836dd 100644 --- a/zh/self-host/use-dify/build/new-agent/build.mdx +++ b/zh/self-host/use-dify/build/new-agent/build.mdx @@ -17,7 +17,7 @@ description: 创建 Agent 并塑造它的能力,可逐项手动配置,也可 新 Agent 目前处于 Beta 阶段。它在 Docker Compose 部署中默认启用,运行时也已随部署打包。 -生产环境使用前,将 [`DIFY_AGENT_SERVER_SECRET_KEY`](/zh/self-host/deploy/configuration/environments#dify_agent_server_secret_key) 替换为你自己的随机值。 +生产环境使用前,将 [`DIFY_AGENT_SERVER_SECRET_KEY`](/zh/self-host/deploy/configuration/environments#dify_agent_server_secret_key) 和 [`DIFY_AGENT_API_TOKEN`](/zh/self-host/deploy/configuration/environments#dify_agent_api_token) 替换为你自己的随机值。 ## 创建 Agent diff --git a/zh/self-host/use-dify/build/new-agent/overview.mdx b/zh/self-host/use-dify/build/new-agent/overview.mdx index 5db64611c..073b03f73 100644 --- a/zh/self-host/use-dify/build/new-agent/overview.mdx +++ b/zh/self-host/use-dify/build/new-agent/overview.mdx @@ -17,7 +17,7 @@ description: 构建一次 Agent,既可作为独立应用使用,也可嵌入 新 Agent 目前处于 Beta 阶段。它在 Docker Compose 部署中默认启用,运行时也已随部署打包。 -生产环境使用前,将 [`DIFY_AGENT_SERVER_SECRET_KEY`](/zh/self-host/deploy/configuration/environments#dify_agent_server_secret_key) 替换为你自己的随机值。 +生产环境使用前,将 [`DIFY_AGENT_SERVER_SECRET_KEY`](/zh/self-host/deploy/configuration/environments#dify_agent_server_secret_key) 和 [`DIFY_AGENT_API_TOKEN`](/zh/self-host/deploy/configuration/environments#dify_agent_api_token) 替换为你自己的随机值。 Agent 是一名 AI 员工:设置一次,之后随时给它派活。它与 [经典 Agent 应用](/zh/self-host/use-dify/build/agent) 是不同类型的 Agent: diff --git a/zh/self-host/use-dify/nodes/agent.mdx b/zh/self-host/use-dify/nodes/agent.mdx index 2199ee797..a8b1bd65a 100644 --- a/zh/self-host/use-dify/nodes/agent.mdx +++ b/zh/self-host/use-dify/nodes/agent.mdx @@ -8,7 +8,7 @@ description: 将 Agent 作为工作流中的一步运行,通过推理和调用 新 Agent 节点目前处于 Beta 阶段。它在 Docker Compose 部署中默认启用,运行时也已随部署打包。 - 生产环境使用前,将 [`DIFY_AGENT_SERVER_SECRET_KEY`](/zh/self-host/deploy/configuration/environments#dify_agent_server_secret_key) 替换为你自己的随机值。 + 生产环境使用前,将 [`DIFY_AGENT_SERVER_SECRET_KEY`](/zh/self-host/deploy/configuration/environments#dify_agent_server_secret_key) 和 [`DIFY_AGENT_API_TOKEN`](/zh/self-host/deploy/configuration/environments#dify_agent_api_token) 替换为你自己的随机值。 @@ -139,9 +139,9 @@ description: 将 Agent 作为工作流中的一步运行,通过推理和调用 你选定 Agent 并告诉它要做什么;它自主完成任务,再把结果交还给流程的其余部分。 - - 在 Chatflow 中,Agent 不保留会话级记忆:每条消息都从零开始处理。 - + + 新 Agent 节点仅在 Workflow 应用中可用。 + ## 选择 Agent