Echo's blog
Echo's blog
· 1 min read · Dify平台

Dify 工作区配置

Dify 工作区配置#

本文整理自 Dify 官方文档,涵盖 工作区配置 章节的全部内容。

本章内容#


API 扩展#

原文:API 扩展


Documentation IndexFetch the complete documentation index at:https://docs.dify.ai/llms.txt#

开发者可通过 API 扩展模块能力,当前支持以下模块扩展:

  • moderation敏感内容审计
  • external_data_tool外部数据工具在扩展模块能力之前,你需要准备一个 API 和用于鉴权的 API Key。

除了需要开发对应的模块能力,还需要遵照以下规范,以便 Dify 正确调用 API。

API 规范 Dify 将会以以下规范调用你的接口:#

PRTCL // PLAINTEXT
`POST {Your-API-Endpoint}
`

HeaderHeaderValueDescContent-Typeapplication/json 请求内容为 JSON 格式。AuthorizationBearer {api_key}API Key 以 Token 令牌的方式传输,你需要解析该api_key并确认是否和提供的 API Key 一致,保证接口安全。#

Request Body#

PRTCL // PLAINTEXT
`{
"point": string,// 扩展点,不同模块可能包含多个扩展点
"params": {
... // 各模块扩展点传入参数
}
}
`

API 返回#

PRTCL // PLAINTEXT
`{
... // API 返回的内容,不同扩展点返回见不同模块的规范设计
}
`

校验在 Dify 配置 API-based Extension 时,Dify 将会发送一个请求至 API Endpoint,以检验 API 的可用性。#

当 API Endpoint 接收到point=ping时,接口应返回result=pong,具体如下:

PRTCL // PLAINTEXT
`Content-Type: application/json
Authorization: Bearer {api_key}
`

Request Body#

PRTCL // PLAINTEXT
`{
"point": "ping"
}
`

API 期望返回#

PRTCL // PLAINTEXT
`{
"result": "pong"
}
`

范例此处以外部数据工具为例,场景为根据地区获取外部天气信息作为上下文。#

API 范例#

PRTCL // PLAINTEXT
`POST https://fake-domain.com/api/dify/receive
`

Header

PRTCL // PLAINTEXT
`Content-Type: application/json
Authorization: Bearer 123456
`

Request Body

PRTCL // PLAINTEXT
`{
"point": "app.external_data_tool.query",
"params": {
"app_id": "61248ab4-1125-45be-ae32-0ce91334d021",
"tool_variable": "weather_retrieve",
"inputs": {
"location": "London"
},
"query": "How's the weather today?"
}
}
`

API 返回

PRTCL // PLAINTEXT
`{
"result": "City: London\nTemperature: 10°C\nRealFeel®: 8°C\nAir Quality: Poor\nWind Direction: ENE\nWind Speed: 8 km/h\nWind Gusts: 14 km/h\nPrecipitation: Light rain"
}
`

代码范例代码基于 Python FastAPI 框架。#

  • 安装依赖
PRTCL // PLAINTEXT
`pip install fastapi[all] uvicorn
`
  • 按照接口规范编写代码
PRTCL // PLAINTEXT
`from fastapi import FastAPI, Body, HTTPException, Header
from pydantic import BaseModel
app = FastAPI()
class InputData(BaseModel):
point: str
params: dict = {}
@app.post("/api/dify/receive")
async def dify_receive(data: InputData = Body(...), authorization: str = Header(None)):
"""
Receive API query data from Dify.
"""
expected_api_key = "123456" # TODO Your API key of this API
auth_scheme, _, api_key = authorization.partition(' ')
if auth_scheme.lower() != "bearer" or api_key != expected_api_key:
raise HTTPException(status_code=401, detail="Unauthorized")
point = data.point
# for debug
print(f"point: {point}")
if point == "ping":
return {
"result": "pong"
}
if point == "app.external_data_tool.query":
return handle_app_external_data_tool_query(params=data.params)
# elif point == "{point name}":
# TODO other point implementation here
raise HTTPException(status_code=400, detail="Not implemented")
def handle_app_external_data_tool_query(params: dict):
app_id = params.get("app_id")
tool_variable = params.get("tool_variable")
inputs = params.get("inputs")
query = params.get("query")
# for debug
print(f"app_id: {app_id}")
print(f"tool_variable: {tool_variable}")
print(f"inputs: {inputs}")
print(f"query: {query}")
# TODO your external data tool query implementation here,
# return must be a dict with key "result", and the value is the query result
if inputs.get("location") == "London":
return {
"result": "City: London\nTemperature: 10°C\nRealFeel®: 8°C\nAir Quality: Poor\nWind Direction: ENE\nWind "
"Speed: 8 km/h\nWind Gusts: 14 km/h\nPrecipitation: Light rain"
}
else:
return {"result": "Unknown city"}
`
  • 启动 API 服务,默认端口为 8000,API 完整地址为:http://127.0.0.1:8000/api/dify/receive,配置的 API Key 为123456
PRTCL // PLAINTEXT
`uvicorn main:app --reload --host 0.0.0.0
`
  • 在 Dify 配置该 API。

  • 在 App 中选择该 API 扩展。

App 调试时,Dify 将请求配置的 API,并发送以下内容(范例):

PRTCL // PLAINTEXT
`{
"point": "app.external_data_tool.query",
"params": {
"app_id": "61248ab4-1125-45be-ae32-0ce91334d021",
"tool_variable": "weather_retrieve",
"inputs": {
"location": "London"
},
"query": "How's the weather today?"
}
}
`

API 返回为:

PRTCL // PLAINTEXT
`{
"result": "City: London\nTemperature: 10°C\nRealFeel®: 8°C\nAir Quality: Poor\nWind Direction: ENE\nWind Speed: 8 km/h\nWind Gusts: 14 km/h\nPrecipitation: Light rain"
}
`

本地调试由于 Dify 云端版无法访问内网 API 服务,为了方便本地调试 API 服务,可以使用Ngrok将 API 服务的端点暴露到公网,实现云端调试本地代码。操作步骤:#

  • 进入https://ngrok.com官网,注册并下载 Ngrok 文件。

  • 下载完成后,进入下载目录,根据下方说明解压压缩包,并执行说明中的初始化脚本。

PRTCL // PLAINTEXT
`unzip/path/to/ngrok.zip
./ngrokconfigadd-authtoken 你的 Token
`
  • 查看本地 API 服务的端口:

并运行以下命令启动:

PRTCL // PLAINTEXT
`./ngrokhttp 端口号
`

启动成功的样例如下:

  • 我们找到 Forwarding 中,如上图:https://177e-159-223-41-52.ngrok-free.app(此为示例域名,请替换为自己的)即为公网域名。

按照上述的范例,我们把本地已经启动的服务端点暴露出去,将代码范例接口:http://127.0.0.1:8000/api/dify/receive替换为https://177e-159-223-41-52.ngrok-free.app/api/dify/receive

此 API 端点即可公网访问。至此,我们即可在 Dify 配置该 API 端点进行本地调试代码,配置步骤请参考外部数据工具

使用 Cloudflare Workers 部署 API 扩展我们推荐你使用 Cloudflare Workers 来部署你的 API 扩展,因为 Cloudflare Workers 可以方便的提供一个公网地址,而且可以免费使用。#

详细说明请参考使用 Cloudflare Workers 部署 API 扩展


使用 Cloudflare Workers 部署 API 扩展#

原文:使用 Cloudflare Workers 部署 API 扩展


Documentation IndexFetch the complete documentation index at:https://docs.dify.ai/llms.txt#

步骤因为 Dify API 扩展需要使用可以访问的公网地址作为 API Endpoint,所以需要将 API 扩展部署到一个公网地址上。#

这里使用 Cloudflare Workers 来部署 API 扩展。

CloneExample GitHub Repository,这个仓库包含了一个简单的 API 扩展,可以在这个基础上进行修改。

PRTCL // PLAINTEXT
`gitclonehttps://github.com/crazywoola/dify-extension-workers.git
cpwrangler.toml.examplewrangler.toml
`

打开wrangler.toml文件,修改namecompatibility_date为你的应用名称和兼容日期。

这里我们需要注意的配置就是vars里面的TOKEN,在 Dify 添加 API 扩展的时候,我们需要填写这个 Token。出于安全考虑,我们建议你使用一个随机的字符串作为 Token,你不应该在源代码中直接写入 Token,而是使用环境变量的方式来传递 Token。所以请不要把 wrangler.toml 提交到你的代码仓库中。

PRTCL // PLAINTEXT
`name="dify-extension-example"
compatibility_date="2023-01-01"
[vars]
TOKEN="bananaiscool"
`

这个 API 扩展会返回一个随机的 Breaking Bad 名言。你可以在src/index.ts中修改这个 API 扩展的逻辑。这个例子展示了与第三方 API 进行交互的方式。

PRTCL // PLAINTEXT
`// ⬇️ implement your logic here ⬇️
// point === "app.external_data_tool.query"
// https://api.breakingbadquotes.xyz/v1/quotes
constcount=params?.inputs?.count??1;
consturl=`https://api.breakingbadquotes.xyz/v1/quotes/${count}`;
constresult=awaitfetch(url).then(res=>res.text())
// ⬆️ implement your logic here ⬆️
`

这个仓库简化了除了业务逻辑之外所有的配置,你可以直接使用npm命令来部署你的 API 扩展。

PRTCL // PLAINTEXT
`npminstall
npmrundeploy
`

部署成功之后,你会得到一个公网地址,你可以在 Dify 中添加这个地址作为 API Endpoint。请注意不要遗漏endpoint这个路径,此路径的具体定义在src/index.ts中可以查看。

另外,也可以直接使用npm run dev命令来部署到本地进行测试。

PRTCL // PLAINTEXT
`npminstall
npmrundev
`

相关输出:

PRTCL // PLAINTEXT
`$npmrundev
>dev
>wrangler dev src/index.ts
⛅️wrangler3.99.0
-------------------
Yourworkerhasaccesstothefollowingbindings:
-Vars:
-TOKEN:"ban****ool"
⎔Startinglocalserver...
[wrangler:inf] Ready on http://localhost:58445
`

之后就可以使用 Postman 等工具进行本地接口调试。

关于 Bearer Auth#

PRTCL // PLAINTEXT
`import{bearerAuth}from"hono/bearer-auth";
(c,next)=>{
constauth=bearerAuth({token:c.env.TOKEN});
returnauth(c,next);
},
`

我们的 Bearer 校验逻辑在如上代码中,我们使用了hono/bearer-auth这个包来实现 Bearer 校验。你可以在src/index.ts中使用c.env.TOKEN来获取 Token。

关于参数验证#

PRTCL // PLAINTEXT
`import{z}from"zod";
import{zValidator}from"@hono/zod-validator";
constschema=z.object({
point:z.union([
z.literal("ping"),
z.literal("app.external_data_tool.query"),
]),// Restricts 'point' to two specific values
params:z
.object({
app_id:z.string().optional(),
tool_variable:z.string().optional(),
inputs:z.record(z.any()).optional(),
query:z.any().optional(),// string or null
})
.optional(),
});
`

我们这里使用了zod来定义参数的类型,你可以在src/index.ts中使用zValidator来校验参数。通过const { point, params } = c.req.valid("json");来获取校验后的参数。

我们这里的 point 只有两个值,所以我们使用了z.union来定义。 params 是一个可选的参数,所以我们使用了z.optional来定义。 其中会有一个inputs的参数,这个参数是一个Record类型,这个类型表示一个 key 为 string,value 为 any 的对象。这个类型可以表示任意的对象,你可以在src/index.ts中使用params?.inputs?.count来获取count参数。

获取 Cloudflare Workers 的日志#

PRTCL // PLAINTEXT
`wranglertail
`

参考内容


外部数据工具#

原文:外部数据工具


Documentation IndexFetch the complete documentation index at:https://docs.dify.ai/llms.txt#

在创建 AI 应用时,开发者可以通过API 扩展的方式实现使用外部工具获取额外数据组装至 Prompt 中作为 LLM 额外信息。

扩展点app.external_data_tool.query:应用外部数据工具查询扩展点。#

该扩展点将终端用户传入的应用变量内容和对话输入内容(对话型应用固定参数)作为参数,传给 API。

开发者需要实现对应工具的查询逻辑,并返回字符串类型的查询结果。

Request Body#

PRTCL // PLAINTEXT
`{
"point": "app.external_data_tool.query",// 扩展点类型,此处固定为 app.external_data_tool.query
"params": {
"app_id": string,// 应用 ID
"tool_variable": string,// 外部数据工具变量名称,表示对应变量工具调用来源
"inputs": {// 终端用户传入变量值,key 为变量名,value 为变量值
"var_1": "value_1",
"var_2": "value_2",
...
},
"query": string | null// 终端用户当前对话输入内容,对话型应用固定参数。
}
}
`

Example:

PRTCL // PLAINTEXT
`{
"point": "app.external_data_tool.query",
"params": {
"app_id": "61248ab4-1125-45be-ae32-0ce91334d021",
"tool_variable": "weather_retrieve",
"inputs": {
"location": "London"
},
"query": "How's the weather today?"
}
}
`

API 返回#

PRTCL // PLAINTEXT
`{
"result": string
}
`

Example:

PRTCL // PLAINTEXT
`{
"result": "City: London\nTemperature: 10°C\nRealFeel®: 8°C\nAir Quality: Poor\nWind Direction: ENE\nWind Speed: 8 km/h\nWind Gusts: 14 km/h\nPrecipitation: Light rain"
}
`

敏感内容审查#

原文:敏感内容审查


Documentation IndexFetch the complete documentation index at:https://docs.dify.ai/llms.txt#

该模块用于审查应用中终端用户输入的内容和 LLM 输出的内容,分为两个扩展点类型。

扩展点#

  • app.moderation.input:终端用户输入的内容审查扩展点
  • 用于审查终端用户传入的变量内容以及对话型应用中对话的输入内容。
  • app.moderation.output:LLM 输出的内容审查扩展点
  • 用于审查 LLM 输出的内容,
  • 当 LLM 输出为流式时,输出的内容将分 100 字为一个分段进行请求 API,尽可能避免输出内容较长时,审查不及时的问题。

app.moderation.input 扩展点当在 Chatflow、Agent、聊天助手等应用下开启内容审查 > 审查输入内容时,Dify 会给相应的 API 扩展发送下列 HTTP POST 请求:#

Request Body#

PRTCL // PLAINTEXT
`{
"point": "app.moderation.input",// 扩展点类型,此处固定为 app.moderation.input
"params": {
"app_id": string,// 应用 ID
"inputs": {// 终端用户传入变量值,key 为变量名,value 为变量值
"var_1": "value_1",
"var_2": "value_2",
...
},
"query": string | null// 终端用户当前对话输入内容,对话型应用固定参数。
}
}
`

Example:

PRTCL // PLAINTEXT
`{
"point": "app.moderation.input",
"params": {
"app_id": "61248ab4-1125-45be-ae32-0ce91334d021",
"inputs": {
"var_1": "我的身份证号是 123456789012345678。",
"var_2": "我的手机号是 123-4567-8901。"
},
"query": "请帮我更新账户信息。"
}
}
`

API 返回规范#

PRTCL // PLAINTEXT
`{
"flagged": bool,// 是否违反校验规则
"action": string,// 动作,direct_output 直接输出预设回答; overridden 覆写传入变量值
"preset_response": string,// 预设回答(仅当 action=direct_output 返回)
"inputs": {// 终端用户传入变量值,key 为变量名,value 为变量值(仅当 action=overridden 返回)
"var_1": "value_1",
"var_2": "value_2",
...
},
"query": string | null// 覆写的终端用户当前对话输入内容,对话型应用固定参数。(仅当 action=overridden 返回)
}
`

Example:

  • action=direct_output
PRTCL // PLAINTEXT
`{
"flagged": true,
"action": "direct_output",
"preset_response": "Your content violates our usage policy."
}
`
  • action=overridden
PRTCL // PLAINTEXT
`{
"flagged": true,
"action": "overridden",
"inputs": {
"var_1": "我的身份证号是 ******************。",
"var_2": "我的手机号是 ***-****-****。"
},
"query": "请帮我更新账户信息。"
}
`

app.moderation.output 扩展点当在 Chatflow、Agent、聊天助手等应用下开启内容审查 > 审查输出内容时,Dify 会给相应的 API 扩展发送下列 HTTP POST 请求:#

Request Body#

PRTCL // PLAINTEXT
`{
"point": "app.moderation.output",// 扩展点类型,此处固定为 app.moderation.output
"params": {
"app_id": string,// 应用 ID
"text": string// LLM 回答内容。当 LLM 输出为流式时,此处为 100 字为一个分段的内容。
}
}
`

Example:

PRTCL // PLAINTEXT
`{
"point": "app.moderation.output",
"params": {
"app_id": "61248ab4-1125-45be-ae32-0ce91334d021",
"text": "我的身份证号是 123456789012345678。"
}
}
`

API 返回#

PRTCL // PLAINTEXT
`{
"flagged": bool,// 是否违反校验规则
"action": string,// 动作,direct_output 直接输出预设回答; overridden 覆写传入变量值
"preset_response": string,// 预设回答(仅当 action=direct_output 返回)
"text": string// 覆写的 LLM 回答内容。(仅当 action=overridden 返回)
}
`

Example:

  • action=direct_output
PRTCL // PLAINTEXT
`{
"flagged": true,
"action": "direct_output",
"preset_response": "Your content violates our usage policy."
}
`
  • action=overridden
PRTCL // PLAINTEXT
`{
"flagged": true,
"action": "overridden",
"text": "我的身份证号是 ******************。"
}
`

代码示例下面展示一段可部署在 Cloudflare 的src/index.ts代码。(Cloudflare 完整的使用方法参见此文档#

代码工作原理是进行关键词匹配,实现对 Input (用户输入的内容)以及输出(大模型返回的内容)进行过滤。用户可以按照需求自行修改匹配逻辑。

PRTCL // PLAINTEXT
`import { Hono } from "hono";
import { bearerAuth } from "hono/bearer-auth";
import { z } from "zod";
import { zValidator } from "@hono/zod-validator";
import { generateSchema } from '@anatine/zod-openapi';
type Bindings = {
TOKEN: string;
};
const app = new Hono<{ Bindings: Bindings }>();
// API 格式校验 ⬇️
const schema = z.object({
point: z.union([
z.literal("ping"),
z.literal("app.external_data_tool.query"),
z.literal("app.moderation.input"),
z.literal("app.moderation.output"),
]), // Restricts 'point' to two specific values
params: z
.object({
app_id: z.string().optional(),
tool_variable: z.string().optional(),
inputs: z.record(z.any()).optional(),
query: z.any(),
text: z.any()
})
.optional(),
});
// Generate OpenAPI schema
app.get("/", (c) => {
return c.json(generateSchema(schema));
});
app.post(
"/",
(c, next) => {
const auth = bearerAuth({ token: c.env.TOKEN });
return auth(c, next);
},
zValidator("json", schema),
async (c) => {
const { point, params } = c.req.valid("json");
if (point === "ping") {
return c.json({
result: "pong",
});
}
// ⬇️ impliment your logic here ⬇️
// point === "app.external_data_tool.query"
else if (point === "app.moderation.input"){
// 输入检查 ⬇️
const inputkeywords = ["输入过滤测试 1", "输入过滤测试 2", "输入过滤测试 3"];
if (inputkeywords.some(keyword => params.query.includes(keyword)))
{
return c.json({
"flagged": true,
"action": "direct_output",
"preset_response": "输入存在违法内容,请换个问题再试!"
});
} else {
return c.json({
"flagged": false,
"action": "direct_output",
"preset_response": "输入无异常"
});
}
// 输入检查完毕
}
else {
// 输出检查 ⬇️
const outputkeywords = ["输出过滤测试 1", "输出过滤测试 2", "输出过滤测试 3"];
if (outputkeywords.some(keyword => params.text.includes(keyword)))
{
return c.json({
"flagged": true,
"action": "direct_output",
"preset_response": "输出存在敏感内容,已被系统过滤,请换个问题再问!"
});
}
else {
return c.json({
"flagged": false,
"action": "direct_output",
"preset_response": "输出无异常"
});
};
}
// 输出检查完毕
}
);
export default app;
`

管理应用#

原文:管理应用


Documentation IndexFetch the complete documentation index at:https://docs.dify.ai/llms.txt#

⚠️ ⚠️ 本文档由 AI 自动翻译。如有任何不准确之处,请参考英文原版

良好的应用管理对高效的 AI 开发至关重要。Dify 提供了全面的工具来组织、共享和维护你在整个生命周期中的应用程序。

应用组织#

编辑与自定义更新名称、描述、图标和品牌,以便更好地组织#

复制与模板创建变体或将现有应用作为新项目的模板使用#

导入与导出使用 Dify 的领域特定语言格式在工作区之间共享应用#

生命周期管理在不再需要时安全删除应用#

编辑应用信息通过清晰、描述性的信息保持你的应用井然有序:#

1 访问应用设置

点击应用程序左上角的”编辑信息”。

2 更新详细信息

修改图标、名称或描述以更好地反映应用的用途。

3 考虑你的团队

使用能帮助团队成员理解应用功能的名称和描述。

💡 在你的工作区内使用一致的命名约定。考虑使用前缀如”草稿-”、“测试-”或”生产-”来表示应用状态。

创建应用变体复制非常适合创建变体或基于现有工作开始新项目:#

何时复制

  • 创建具有不同提示词或模型的 A/B 测试版本

  • 为不同受众或用例调整应用

  • 基于成功模式开始新项目

  • 在重大更改之前创建备份复制的工作原理

  • 所有配置、提示词和工作流都会被复制

  • 新应用获得一个可以自定义的默认名称

  • 原始应用保持不变

  • 两个应用独立运行

应用导出和导入 Dify 的领域特定语言格式让你可以在工作区和团队之间共享应用:#

导出应用程序两种导出方式#

  • 从 Studio 页面- 在应用菜单中点击”导出 DSL”

  • 从编排页面- 点击左上角的”导出 DSL”导出内容包括

  • 应用配置和元数据

  • 工作流编排和节点设置

  • 模型参数和提示词模板

  • 知识库连接(不包括数据本身)不导出的内容

  • 第三方工具的 API 密钥(安全措施)

  • 实际知识库内容

  • 使用日志和分析数据

💡 如果你的应用使用 Secret 类型的环境变量,系统会询问你是否要将它们包含在导出中。请小心处理敏感信息。

导入应用程序#

导入流程

  • 上传你的 DSL 文件(YAML 格式)

  • 系统检查版本兼容性

  • 如果 DSL 版本低于当前平台,会出现警告

  • 使用文件中的所有配置创建应用版本兼容性

  • SaaS 用户:DSL 文件始终是最新版本

  • 社区用户:可能需要升级以避免兼容性问题

💡 Dify DSL 是 AI 应用 YAML 格式捕获完整的应用配置。

安全的应用删除在删除应用之前,了解其影响:#

被删除的内容

  • 所有应用配置和提示词

  • 工作流编排和设置

  • 使用日志和分析

  • 已发布的网页应用和 API 访问

  • 所有用户对话和数据对用户的影响

  • 已发布的网页应用立即停止工作

  • API 调用开始返回错误

  • 所有现有用户会话被终止 1 考虑替代方案

你可以复制应用进行备份,或者只是取消发布而不是删除吗?

2 通知利益相关者

让团队成员和用户知道计划的删除。

3 如需要则导出

在删除前为有价值的配置创建 DSL 备份。

4 确认删除

点击”删除”并确认——此操作无法撤销。

💡 应用删除是永久性的且无法撤销。所有相关数据、日志和用户访问权限将立即丢失。

最佳实践命名约定#

  • 使用能解释应用用途的描述性名称

  • 在相关时包含版本号或状态指示器

  • 考虑团队范围的命名标准以保持一致性组织技巧

  • 定期清理测试和未使用的应用

  • 对类似应用类型使用一致的图标和描述

  • 记录重大配置更改

  • 将生产应用与实验应用分开协作

  • 与团队成员共享 DSL 文件以进行知识传递

  • 使用复制创建团队模板

  • 在重大更改前导出重要配置

  • 在共享应用时考虑访问权限


模型供应商#

原文:模型供应商


Documentation IndexFetch the complete documentation index at:https://docs.dify.ai/llms.txt#

⚠️ ⚠️ 本文档由 AI 自动翻译。如有任何不准确之处,请参考英文原版

模型供应商为你的工作区提供 AI 模型访问。你构建的每个应用程序都需要模型才能运行,在工作区级别配置供应商意味着所有团队成员都可以在所有项目中使用它们。

系统供应商 vs 自定义供应商系统供应商由 Dify 管理。你无需设置即可立即访问模型,通过 Dify 订阅计费,并在新模型可用时自动更新。最适合快速入门。#

自定义供应商使用你自己的 API 密钥直接访问模型供应商,如 OpenAI、Anthropic 或 Google。你获得完全控制权、直接计费,通常还有更高的速率限制。最适合生产应用程序。

你可以同时使用两种方式——系统供应商用于原型设计,自定义供应商用于生产。

配置自定义供应商只有工作区管理员和所有者才能配置模型供应商。整个过程在各供应商之间是一致的:#

1 导航至设置 → 模型供应商

在工作区设置中访问模型供应商配置。

2 选择你的供应商

从 OpenAI、Anthropic、Google、Cohere 或其他支持的供应商中选择。

3 添加凭据

输入你的 API 密钥和供应商要求的任何其他配置。

4 测试并保存

Dify 在使供应商对你的工作区可用之前会验证你的凭据。

支持的供应商大型语言模型#

  • OpenAI (GPT-4, GPT-3.5-turbo)

  • Anthropic (Claude)

  • Google (Gemini)

  • Cohere

  • 通过 Ollama 的本地模型文本嵌入模型

  • OpenAI Embeddings

  • Cohere Embeddings

  • Azure OpenAI

  • 本地文本嵌入模型专用模型

  • 图像生成 (DALL-E, Stable Diffusion)

  • 语音 (Whisper, ElevenLabs)

  • 内容审核 API

供应商配置示例#

  • OpenAI
  • Anthropic
  • 本地 (Ollama):first-child(p)][&>:first-child(p)_img][&>data-table-wrapper]:!pt-0” data-component-part=“tab-content”>必需:来自 OpenAI 平台的 API 密钥

可选:用于 Azure OpenAI 或代理的自定义基础 URL,用于组织范围使用的组织 ID

可用模型:GPT-4、GPT-3.5-turbo、DALL-E、Whisper、文本嵌入

:first-child(p)][&>:first-child(p)_img][&>data-table-wrapper]:!pt-0 hidden” data-component-part=“tab-content”>必需:来自 Anthropic 控制台的 API 密钥

可用模型:Claude 3 (Opus, Sonnet, Haiku)、Claude 2.1、Claude Instant

:first-child(p)][&>:first-child(p)_img][&>data-table-wrapper]:!pt-0 hidden” data-component-part=“tab-content”>必需:Ollama 服务器 URL(通常为http://localhost:11434)

设置:安装 Ollama,拉取模型(ollama pull llama2),配置 Dify 连接

优势:完全数据隐私,无外部 API 成本,自定义模型微调

管理模型凭据为模型供应商的预定义模型和自定义模型添加多个凭据,并轻松进行切换、删除、修改等操作。#

在以下场景中,推荐添加多个模型凭据:

  • 环境隔离:为开发、测试、生产等不同环境配置独立的模型凭据。例如,在开发环境中选择有速率限制的凭据用于功能调试,在生产环境中选择性能稳定、配额充足的付费凭据以保障服务质量。

  • 成本优化:通过添加和切换来自不同账户或模型供应商的多个凭据,最大限度地利用免费或低成本额度,降低应用开发与运营成本。

  • 模型实验:在模型微调或迭代过程中,可能会产出多个模型版本。通过添加不同模型版本的凭据,快速切换并测试其应用效果。

💡 可使用多个凭据为模型配置负载均衡。

  • 预定义模型

  • 自定义模型:first-child(p)][&>:first-child(p)_img][&>data-table-wrapper]:!pt-0” data-component-part=“tab-content”> 安装模型供应商并配置首个凭据后,点击供应商面板右上角的配置,可进行以下操作:

  • 添加新凭据

  • 选择任一凭据作为所有预定义模型的默认凭据

  • 修改凭据

  • 删除凭据

⚠️ 若默认凭据被删除,需手动指定新的默认凭据。

:first-child(p)][&>:first-child(p)_img][&>data-table-wrapper]:!pt-0 hidden” data-component-part=“tab-content”>

管理单个自定义模型的凭据安装模型供应商并添加自定义模型后,按照以下步骤操作:#

  • 在模型列表中,点击模型对应的配置

  • 指定模型凭据面板中,点击默认凭据以打开凭据列表,可进行以下操作:

  • 添加新凭据

  • 选择任一凭据作为该自定义模型的默认凭据

  • 修改凭据

  • 删除凭据

💡 若删除某个自定义模型的唯一凭据,该模型将被一同删除。

💡 添加自定义模型时,若填写的模型名称与模型类型与一个已存在的自定义模型完全相同,系统将不会创建重复的模型,而是会为已存在的模型添加一个新的凭据。

管理所有自定义模型的凭据点击管理凭据,查看、修改或删除所有自定义模型的凭据。#

对于被移除的自定义模型,其所有凭据仍将保留在管理凭据列表中。当你点击添加模型时,系统将展示所有已移除但凭据尚存的自定义模型,供你快速重新添加。

若从管理凭据列表中删除某个已移除的自定义模型的所有凭据,该模型将不会在点击添加模型时出现。

配置模型负载均衡#

💡 负载均衡为付费特性,可通过订阅 SaaS 付费服务或者购买企业版以启用。

通常,模型供应商会限制用户在指定时间内访问 API 服务的次数(模型速率限制),以确保服务的稳定性与合理使用。对于企业级应用,来自单一凭据的高并发请求容易触发模型速率限制,从而影响用户访问。

而负载均衡可将请求流量分配至多个模型凭据,有效避免模型速率限制和单点故障,并为所有用户提供更快的响应速度,保障业务稳定运行。

Dify 采用轮询策略的负载均衡机制,即:将模型请求按顺序依次分配给负载均衡池中的各个凭据。若某个凭据触发模型速率限制,系统将在接下来一分钟内的轮询中暂时跳过该凭据,以避免无效重试。

为模型配置负载均衡,按照以下步骤操作:

  • 在模型列表中找到目标模型,点击对应的配置,选择负载均衡模式。

  • 在负载均衡池中,点击添加凭据,从已有凭据中选择或添加新凭据。

💡 默认配置为当前指定的默认凭据。

💡 若某个凭据的配额充足或性能更优,可重复添加该凭据以增加其在负载均衡中的权重,使其承担更大比例的请求负载。

  • 在负载均衡池中启用至少 2 个凭据,点击保存。已启用负载均衡的模型将带有特殊标识。

💡 从负载均衡模式切换回默认的单凭据模式时,系统将保留负载均衡配置以备后用。

访问和计费系统供应商通过你的 Dify 订阅计费,使用限制基于你的计划。自定义供应商直接通过供应商(OpenAI、Anthropic 等)向你收费,通常提供更高的速率限制。#

团队访问遵循工作区权限:

  • 所有者 / 管理员可以配置、修改和删除供应商
  • 编辑者 / 成员可以查看可用供应商并在应用程序中使用它们

💡 API 密钥安全存储但授予工作区范围的模型访问权限。只将管理权限授予应承担计费责任的可信团队成员。

故障排除身份验证失败:验证 API 密钥准确性,检查过期时间,确保有足够积分,确认密钥权限。#

模型不可用:检查供应商配置是否包含该模型,验证 API 密钥等级访问权限,刷新供应商设置。

速率限制:升级供应商账户,实施请求队列,考虑使用自定义供应商获得更高限制。


个人设置#

原文:个人设置


Documentation IndexFetch the complete documentation index at:https://docs.dify.ai/llms.txt#

⚠️ ⚠️ 本文档由 AI 自动翻译。如有任何不准确之处,请参考英文原版

你的个人账户跨越你所属的所有工作空间。个人资料设置、语言偏好和登录凭据会跟随你到任何地方,而每个工作空间都保持其自己的团队动态和权限。

账户设置Dify Cloud在首次登录时自动创建你的账户。你可以使用 GitHub、Google 或邮箱验证。具有匹配邮箱地址的账户会自动关联。#

Community Edition在安装期间需要设置邮箱和密码。管理员账户在系统首次部署时配置。

多工作空间访问你的个人账户可以属于多个工作空间。每个工作空间都有自己的团队、应用程序和计费,但你的个人资料在所有工作空间中保持一致。#

切换工作空间: 使用左上角的工作空间选择器在你有权访问的工作空间之间切换。

工作空间独立性: 你的角色和权限是按工作空间设置的。你可能在一个工作空间中是所有者,在另一个工作空间中是成员。

个人资料管理在设置 → 账户 → 个人资料中更新你的个人资料信息。更改适用于你所属的所有工作空间。#

头像: 上传自定义头像。这将替换默认的基于姓名首字母的头像,并在所有工作空间中显示。

显示名称: 你在所有工作空间中向团队成员显示的名称。选择能够帮助队友识别你的名称。

邮箱地址: 你的主要登录凭据和唯一标识符。更改你的邮箱会影响使用旧地址的所有工作空间。

语言和界面显示语言: 可用语言包括英语、简体中文和繁体中文。此设置影响界面元素,但不影响你的应用程序内容。#

更改语言: 点击你的头像 → 语言,然后选择你偏好的语言。

按版本区分的登录方式版本登录方式 Community 仅支持邮箱和密码 CloudGitHub、Google、带验证码的邮箱账户关联: Dify Cloud 自动关联具有相同邮箱地址的账户。如果你使用 GitHub 注册时使用email@company.com,然后使用相同地址的邮箱验证,系统会识别它们为同一账户。#

安全Cloud 用户: 利用社交登录(GitHub/Google)增强安全性。检查你选择的提供商的安全设置,并通过他们的平台监控登录活动。#

Community Edition 用户: 使用强、唯一的密码并定期更改。不要与他人共享登录凭据。

跨工作空间: 你的个人设置会跟随你到任何地方,但请记住,每个工作空间都有自己的安全模型和权限。

💡 更改你的邮箱地址会影响所有工作空间。如果你只想为某个工作空间更改邮箱,请考虑让该工作空间邀请新邮箱作为单独的用户账户。


插件#

原文:插件


Documentation IndexFetch the complete documentation index at:https://docs.dify.ai/llms.txt#

插件是 Dify 连接一切的方式——模型提供商、外部 API、自定义工具。它们是扩展工作空间能力的模块化组件,只需安装一次即可在所有地方使用。

通过工作空间中的插件选项卡访问插件管理。

插件工作原理插件的作用域是工作空间级别的。当你安装一个插件时,工作空间中的每个应用都可以使用它。团队成员根据其角色访问插件:#

  • 所有者和管理员
  • 编辑者和成员:first-child(p)][&>:first-child(p)_img][&>data-table-wrapper]:!pt-0” data-component-part=“tab-content”> 为整个工作空间安装、配置和移除插件

:first-child(p)][&>:first-child(p)_img][&>data-table-wrapper]:!pt-0 hidden” data-component-part=“tab-content”> 在他们创建或编辑的应用中使用已安装的插件

安装插件#

应用市场官方和合作伙伴插件,经过测试和维护#

GitHub 使用 URL + 版本从任何公共仓库安装#

本地上传用于私有或内部插件的自定义 .zip 包#

插件的真正含义将插件视为 Dify 与外部世界之间的桥梁:#

模型提供商 Dify 中的每个 LLM(OpenAI、Anthropic 等)实际上都是一个插件#

工具和函数 API 调用、数据处理、计算——全部基于插件#

自定义端点将你的 Dify 应用公开为外部系统可以调用的 API#

反向调用插件可以回调 Dify 来使用模型、工具或工作流#

工作空间插件设置在工作空间设置中控制插件权限:#

安装权限

所有人- 任何成员都可以安装插件仅管理员- 只有工作空间管理员可以安装(推荐)

调试访问

所有人- 所有成员都可以调试插件问题仅管理员- 将调试限制为管理员

自动更新

选择更新策略(仅安全更新与所有更新)并指定要包含或排除的插件

安装后,大多数插件需要配置——API 密钥、端点或服务设置。这些设置适用于整个工作空间。

插件安装限制#

💡 仅限企业版

在企业工作空间中,浏览插件市场时你可能会看到安装限制:

你会遇到的情况

  • 插件 → 探索市场中的”安装插件”下拉菜单可能显示有限选项
  • 安装确认对话框将指示插件是否被策略阻止
  • 导入带有插件的应用(DSL 文件)时,你会看到关于受限插件的通知市场中的插件徽章

查找这些徽章以识别插件类型——你的工作空间可能只允许基于管理员设置的某些类型。

💡 如果你无法安装所需的插件,请联系你的工作空间管理员。他们控制允许哪些插件来源(市场、GitHub、本地文件)和类型(官方、合作伙伴、第三方)。

构建自定义插件当你需要自定义功能时,使用 Dify 的 SDK 开发插件:#

  • 从设置 → 插件 → 调试获取调试密钥
  • 在本地构建和测试你的插件
  • 打包为包含清单和依赖项的 .zip 文件
  • 私下分发或发布到市场

工作区#

原文:工作区


Documentation IndexFetch the complete documentation index at:https://docs.dify.ai/llms.txt#

⚠️ ⚠️ 本文档由 AI 自动翻译。如有任何不准确之处,请参考英文原版

工作空间是你团队在 Dify 中的完整 AI 环境。它包含并隔离你的组织所需的一切:应用程序、知识库、团队成员、模型配置、插件和账单。

工作空间概念模型 Dify 中的每个资源都属于一个工作空间。当你创建应用时,它会继承工作空间的模型配置。当你添加团队成员时,他们会根据其角色获得对工作空间资源的访问权限。当你配置模型或安装插件时,它们对整个工作空间都可用。#

PRTCL // PLAINTEXT
`🏢 你的组织
└── 📁 工作空间
├── 🤖 应用程序(聊天机器人、工作流、智能代理)
├── 📊 知识库(文档、嵌入向量)
├── 👥 团队成员(角色和权限)
├── 🧠 模型供应商(API 密钥、配置)
├── 🔧 工具和插件(集成、自定义代码)
└── 💳 账单(订阅、限制、使用情况)
`

这种以工作空间为核心的设计意味着你的资源与其他组织完全隔离,团队成员只能访问他们被允许查看的内容,你只需为整个工作空间配置一次模型和账单。

工作空间创建Dify Cloud在首次登录时自动创建工作空间。你将成为拥有完全权限的所有者。#

社区版在安装过程中创建一个工作空间。管理员邮箱和密码在设置期间配置。

当你需要在不同的法律实体、监管环境或客户项目之间进行完全隔离时,支持多个工作空间。大多数组织使用单个工作空间。

💡 你的个人账户可以属于多个工作空间。使用左上角的工作空间选择器在它们之间切换。

资源如何连接你构建的应用程序可以使用工作空间中配置的任何模型供应商,访问所有工作空间知识库,并利用已安装的插件。团队成员根据其工作空间权限查看应用程序。#

工作空间角色决定对所有资源的访问权限:

  • 所有者控制账单、模型供应商和工作空间设置
  • 管理员管理团队成员并配置模型 / 插件
  • 编辑者构建应用程序并管理知识库
  • 成员使用已发布的应用程序

工作空间导航 Dify 围绕工作空间概念组织一切。主导航显示你工作空间中可用的应用程序、知识和工具。设置包含工作空间范围的配置:成员、模型供应商、插件、账单(仅限云版)和个人账户设置。#


计费#

原文:计费


Documentation IndexFetch the complete documentation index at:https://docs.dify.ai/llms.txt#

⚠️ ⚠️ 本文档由 AI 自动翻译。如有任何不准确之处,请参考英文原版

Dify 中的计费基于工作区范围。你的订阅决定了整个工作区的团队成员限制、功能可用性和使用配额。

订阅计划#

Sandbox1 名团队成员、基础功能、社区支持#

Professional 最多 3 名团队成员、高级功能、优先支持#

Team 最多 50 名团队成员、完整功能集、专属支持#

计划对比资源 SandboxProfessionalTeam 团队成员 1350 应用程序 550200API 调用 5000 次 / 天无限无限支持社区优先邮件优先邮件和 Slack#

管理订阅只有工作区所有者和管理员才能访问计费设置并更改订阅。#

升级:导航至设置>账单,然后点击升级。选择所需计划并完成付款。更改立即生效。

计划更改

  • 升级按当前计费周期按比例计算。
  • 降级立即生效,计费调整在下次账单中体现。
  • 取消持续到当前周期结束,之后恢复到 Sandbox 计划。

💡 降级时,超出新计划限制的团队成员将立即失去工作区访问权限。

Dify 教育版学生、教师和教育工作者可以通过验证教育身份,免费使用年付 Professional 计划。每年需要重新验证以维持折扣。#

前提条件#

  • 年满 18 岁
  • 在读学生、教师或教育工作者
  • 学校颁发的教育邮箱(例如以.edu结尾的邮箱)

步骤 1 创建账户#

使用教育邮箱在cloud.dify.ai注册。

2 申请验证

前往设置>账单>获取教育版认证,填写学校全称并选择角色。结果会立即显示。

3 为工作区应用折扣

  • 审核通过后,选择要使用教育优惠的工作区,然后点击使用教育优惠

随后将跳转至结算页面,自动选择年付 Professional 计划和应用教育优惠。

⚠️ 教育优惠仅适用于年付 Professional 计划。

  • 完成付款即可激活订阅。

常见问题为什么我被扣了 $59?#

你可能选择了月付 Professional 计划。教育折扣仅适用于年付计划,所以月付计划会按全额收取 $59。

解决方法:取消当前订阅,等到计费周期结束后,订阅年付Professional 计划(含教育折扣)。

我已经有付费订阅,该怎么办?

教育折扣无法应用于现有的付费订阅。

解决方法:取消当前订阅,等到计费周期结束后,订阅年付Professional 计划(含教育折扣)。

为什么我的认证被拒?

常见原因:非教育邮箱、信息不准确或滥用权益。如需申诉,请联系support@dify.ai

可以使用个人邮箱吗?

不可以。认证需要使用学校颁发的教育邮箱。


管理成员#

原文:管理成员


Documentation IndexFetch the complete documentation index at:https://docs.dify.ai/llms.txt#

⚠️ ⚠️ 本文档由 AI 自动翻译。如有任何不准确之处,请参考英文原版

Dify 中的团队管理以工作空间为中心。当你将成员添加到工作空间时,他们会根据分配的角色获得对工作空间资源的访问权限。了解这些角色有助于你构建安全、高效的 AI 团队。

团队规模限制根据你的 Dify 版本,工作空间可以包含不同数量的团队成员:#

  • 免费版: 1 个成员(单人开发)
  • 专业版: 3 个成员(小团队)
  • 团队版: 50 个成员(成长型企业)
  • 社区版 / 企业版: 无限制成员(私有部署)

工作空间角色所有者#

** 完整的工作空间控制权。** 每个工作空间只有一个所有者。控制所有团队成员、账单、模型供应商,并可以删除工作空间。无法将所有权转让给其他成员。

管理员

** 团队和资源管理。** 可以添加 / 移除团队成员、配置模型供应商、管理所有应用程序并安装插件。无法更改成员角色或管理账单。

编辑者

** 应用程序开发。** 可以创建、编辑和删除应用程序,管理知识库,并使用所有工作空间工具。无法管理团队成员或配置供应商。

普通成员

** 仅使用应用程序。** 可以使用已发布的应用程序和有权访问的工具。无法创建或修改应用程序。

添加团队成员只有工作空间所有者可以邀请新团队成员:#

1 访问成员管理

在工作空间中导航至设置 → 成员。

2 发送邀请

输入电子邮件地址并为每个新成员选择合适的角色。

3 处理邀请

新用户会收到注册邮件。现有 Dify 用户会立即添加,并可通过工作空间切换器访问工作空间。

💡 社区版在邀请正常工作之前需要配置邮件服务。

成员管理移除成员: 只有工作空间所有者可以移除团队成员。被移除后,成员立即失去工作空间访问权限,但他们创建的应用程序仍保留在工作空间中。#

角色变更: 只有工作空间所有者可以修改成员角色。角色变更立即生效,并改变成员在整个工作空间中的访问权限。

多个工作空间: 团队成员可以属于多个工作空间。他们使用左上角的选择器在工作空间之间切换。

访问模式资源继承: 所有工作空间资源(模型供应商、插件、知识库)根据角色权限向团队成员开放。#

应用程序访问: 成员根据共享设置和角色查看应用程序。所有者和管理员可以查看所有应用程序。编辑者可以查看他们能修改的应用程序。普通成员只能查看他们被授权使用的已发布应用程序。

配置访问: 在工作空间级别配置的模型供应商和插件对具有相应权限的团队成员创建的所有应用程序可用。

安全考虑最小权限原则: 从最小权限开始,根据实际需要和信任度提升角色。#

定期访问审查: 定期审查团队成员角色,移除不再需要工作空间访问权限的成员。

敏感配置: 只有受信任的团队成员才应拥有管理员或所有者角色,因为他们控制模型供应商 API 密钥和账单。


Dify 工具#

原文:Dify 工具


Documentation IndexFetch the complete documentation index at:https://docs.dify.ai/llms.txt#

⚠️ ⚠️ 本文档由 AI 自动翻译。如有任何不准确之处,请参考英文原版

Dify 工具使 LLM 能够与外部服务和 API 交互,从而访问实时数据并执行操作(例如网页搜索、数据库查询或内容处理)。

每个工具都有清晰的接口:接受什么输入、执行什么操作、返回什么输出。这有助于 LLM 根据用户请求决定何时以及如何调用工具。

工具的使用场景:

你可以在工具页面管理所有工具。

工具类型#

  • 插件工具
  • 自定义工具
  • 工作流工具
  • MCP 工具:first-child(p)][&>:first-child(p)_img][&>data-table-wrapper]:!pt-0” data-component-part=“tab-content”>插件工具是由 Dify 和社区提供的即用型集成,涵盖常用工具和热门第三方服务。

除了开箱即用的内置插件工具(如 CurrentTime)外,你还可以从Dify Marketplace探索并安装更多工具。

管理授权

部分插件工具(例如 Google 和 GitHub)在使用前需要进行身份验证,如 API 密钥或 OAuth。

你可以在工具插件页面管理这些工具的工作区级凭据,也可以直接在应用或节点的工具设置中进行管理。

:first-child(p)][&>:first-child(p)_img][&>data-table-wrapper]:!pt-0 hidden” data-component-part=“tab-content”> 使用标准的 OpenAPI(Swagger)规范将外部服务集成为自定义工具。适用于将 Dify 连接到内部系统或尚未提供插件的第三方服务。

粘贴 OpenAPI schema、从 URL 导入,或从提供的示例开始。Dify 会自动解析规范并生成工具接口。

:first-child(p)][&>:first-child(p)_img][&>data-table-wrapper]:!pt-0 hidden” data-component-part=“tab-content”> 将任何以用户输入节点开始的工作流转换为可复用的工具。不支持对话流

这使你能够将复杂的多步骤逻辑封装为一个函数,轻松在不同的 Dify 应用中复用。

:first-child(p)][&>:first-child(p)_img][&>data-table-wrapper]:!pt-0 hidden” data-component-part=“tab-content”>Model Context Protocol (MCP)让 AI 应用通过标准接口连接外部数据和工具。MCP 服务器封装外部资源(如数据库、文件系统或 API),并通过该协议使 AI 应用能够访问这些资源。

通过连接 MCP 服务器,你可以将这些外部资源作为工具导入 Dify,并随时刷新列表以获取最新更新。

Related Posts

Comments

Copied
Copied to clipboard