微信扫码
添加专属顾问
为什么要着急升级?觉得能为社区贡献的可能也就这点儿了。整体来看,升级还是很平滑的,除了个别小的 bug 外。升级步骤完全参考文献[4]提供步骤即可,亦可配合参考文献[8]。(前后端源码部署:Dify v0.15.0升级v1.0.0-beta.1的尝试:https://z0yrmerhgi8.feishu.cn/wiki/OBFxw2GtDiULLXk9QSlcHIkunhb)。
Dify v1.0.0-beta.1 建议本地测试,不用于生产环境。该版本最大的变化就是 Dify 市场的推出,包括模型、工具、Agent 策略、扩展和插件集等,这样就与 Dify 主干进行解耦了。为什么要这样做呢?举个稍微极端点儿的例子,假如工具的数量有 1 一亿呢,可以想想 Dify 源码有多么庞大。总之,解耦后主干归主干(大脑),生态归生态(四肢)。在 AIGC 生产领域,把质量做精,把性能做高。在 Dify 市场中,还可以搞个提示功能模块。
看下 Dify 官方对这次版本的更新日志吧。Dify v1.0.0-beta 已经推出全新的插件系统和插件市场。作为插即用的模块化组件,现在可使用 Dify 插件为 AI 应用扩展新功能。Dify 市场包含以下插件 [2][3][5]:
(1)模型和工具:可以独立开发、部署和维护,并拥有灵活的版本控制和系统安全性能的提升。
(2)Agent 策略:创建自定义推理策略,实现更复杂、更精细的多步骤推理。
(3)扩展:构建自定义 API 并连接外部服务,以更高的灵活度处理复杂工作流和数据。
(4)插件集:将多个插件组合成一个单一包以简化部署流程。
此外还在工作流中推出了 Agent 节点 [7],通过结合 LLM、工具和推理策略,Agent 节点能够实现自主的多步骤工具调用,以完成工作流程中的任务。
docker compose -f docker-compose.middleware.yaml -p "dify" down
git clone https://github.com/langgenius/dify.git
git checkout [1.0.0-beta.1](https://github.com/langgenius/dify/releases/tag/1.0.0-beta.1)
根据参考文献[8]修改对应的前端和后端配置文件参数。由于启动中间件服务时会用到配置文件,比如 .env 或者 middleware.env。但是拉取最新代码的时候,拉取的是 .env.example 或者 middleware.env.example,所以需要同步更新 .env 或者 middleware.env 配置文件。需要修改 4 个位置,如下所示:
dify\api\.env
dify\docker\.env
dify\docker\middleware.env
dify\web\.env
pnpm install
cd api
poetry install
cd docker
docker compose -f docker-compose.middleware.yaml -p "dify" up -d
注意: 如果要从旧版本升级至
v1.0.0,需要执行一些基础迁移步骤。
首先,需要将当前环境所使用的工具和模型安装到新的插件环境中。请确保在进行数据库迁移前完成插件的安装。运行以下命令:
poetry run flask extract-plugins --workers=20
此命令会提取当前环境中的所有模型和工具。workers 参数决定提取时的并发进程数,请根据需求调整。最终结果将保存在 plugins.jsonl 文件中,其中包含当前 Dify 实例所有工作区的插件信息。
确保网络可正常访问 https://marketplace.dify.ai,然后运行以下命令:
poetry run flask install-plugins
该命令将从 Marketplace 下载并安装所需的插件到最新的环境中。
执行命令 poetry run flask extract-plugins --workers=20,可能报错 Failed to resolve 'plugin',如下所示:
INFO:numexpr.utils:NumExpr defaulting to 16 threads.
INFO:numexpr.utils:NumExpr defaulting to 16 threads.
INFO:services.plugin.plugin_migration:Extracting unique plugins from plugins.jsonl
INFO:services.plugin.plugin_migration:Installing 3 plugin instances for fake tenant 9d2379d5c93642049bcb9ae068346064
INFO:httpx:HTTP Request: GET https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/openai:0.0.3@3e53c5bef8e4b2bf7173a455dc06ba2601e3b383f376beb76f41df376c0a4f48 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/siliconflow:0.0.1@3ae44ef62760c41c6b52ce8d179ca5dee2ed9c681d6294ced89b1790f9236fd9 "HTTP/1.1 200 OK"
INFO:httpx:HTTP Request: GET https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/comfyui:0.0.1@944b3b503029df1de688fc08ab181eee7a65a23a6c3513f3c88f3970946fa383 "HTTP/1.1 200 OK"
<strong>ERROR</strong>:core.plugin.manager.base:Request to Plugin Daemon Service failed
Traceback (most recent call last):
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\urllib3\connection.py", line 198, in _new_conn
sock = connection.create_connection(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\urllib3\util\connection.py", line 60, in create_connection
for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\gevent\_socketcommon.py", line 221, in getaddrinfo
addrlist = get_hub().resolver.getaddrinfo(host, port, family, type, proto, flags)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\gevent\resolver\thread.py", line 63, in getaddrinfo
return self.pool.apply(_socket.getaddrinfo, args, kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\gevent\pool.py", line 161, in apply
return self.spawn(func, *args, **kwds).get()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "src\\gevent\\event.py", line 330, in gevent._gevent_cevent.AsyncResult.get
File "src\\gevent\\event.py", line 360, in gevent._gevent_cevent.AsyncResult.get
File "src\\gevent\\event.py", line 348, in gevent._gevent_cevent.AsyncResult.get
File "src\\gevent\\event.py", line 328, in gevent._gevent_cevent.AsyncResult._raise_exception
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\gevent\_compat.py", line 50, in reraise
raise value.with_traceback(tb)
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\gevent\threadpool.py", line 173, in __run_task
thread_result.set(func(*args, **kwargs))
^^^^^^^^^^^^^^^^^
socket.gaierror: [Errno 11001] getaddrinfo failed
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
response = self._make_request(
^^^^^^^^^^^^^^^^^^^
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\urllib3\connectionpool.py", line 493, in _make_request
conn.request(
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\urllib3\connection.py", line 445, in request
self.endheaders()
File "D:\Python311\Lib\http\client.py", line 1298, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "D:\Python311\Lib\http\client.py", line 1058, in _send_output
self.send(msg)
File "D:\Python311\Lib\http\client.py", line 996, in send
self.connect()
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\urllib3\connection.py", line 276, in connect
self.sock = self._new_conn()
^^^^^^^^^^^^^^^^
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\urllib3\connection.py", line 205, in _new_conn
raise NameResolutionError(self.host, self, e) from e
<strong>urllib3.exceptions.NameResolutionError: <urllib3.connection.HTTPConnection object at 0x000001B041F02310>: Failed to resolve 'plugin' ([Errno 11001] getaddrinfo failed)</strong>
解决方案为修改 plugin 为 127.0.0.1,原理是 dify-plugin_daemon-1 本地容器运行。如下所示:
命令执行完毕后,自动生成 dify\api\plugins.jsonl 文件,如下所示:
{"tenant_id": "56f205c6-6d2c-45b5-8584-483b9e41b6d6", "plugins": ["langgenius/openai", "langgenius/siliconflow", "langgenius/comfyui"]}
(dify-api-py3.11) PS F:\Dify资料\ai408_dify\api> poetry run flask install-plugins
2025-01-11 02:03:52,242,242 INFO [utils.py:162]NumExpr defaulting to 16 threads.
Input file [plugins.jsonl]:
Output file [installed_plugins.jsonl]:
Starting install plugins.
2025-01-11 03:31:36,119,119 INFO [plugin_migration.py:334]Extracting unique plugins from plugins.jsonl
100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 3/3 [00:02<00:00,1.27it/s]
2025-01-11 03:31:38,594,594 INFO [plugin_migration.py:368]Installing 3 plugin instances for fake tenant c0742b0f47db4378afe86cdd39580178
2025-01-11 03:31:41,253,253 INFO [_client.py:1038]HTTP Request: GET https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/siliconflow:0.0.1@3ae44ef62760c41c6b52ce8d179ca5dee2ed9c681d6294ced89b1790f9236fd9 "HTTP/1.1 200 OK"
2025-01-11 03:31:41,269,269 INFO [_client.py:1038]HTTP Request: GET https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/comfyui:0.0.1@944b3b503029df1de688fc08ab181eee7a65a23a6c3513f3c88f3970946fa383 "HTTP/1.1 200 OK"
2025-01-11 03:31:41,302,302 INFO [_client.py:1038]HTTP Request: GET https://marketplace.dify.ai/api/v1/plugins/download?unique_identifier=langgenius/openai:0.0.3@3e53c5bef8e4b2bf7173a455dc06ba2601e3b383f376beb76f41df376c0a4f48 "HTTP/1.1 200 OK"
************************************
<Response [401]>
************************************
<Response [401]>
************************************
<Response [401]>
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
File "F:\Dify资料\ai408_dify\api\.venv\Scripts\flask.exe\__main__.py", line 7, in <module>
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\flask\cli.py", line 1129, in main
cli.main()
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\click\core.py", line 1082, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\click\core.py", line 1697, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\click\core.py", line 1443, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\Dify资料\ai408_dify\api\.venv\Lib\site-packages\click\core.py", line 788, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\Dify资料\ai408_dify\api\commands.py", line 716, in install_plugins
PluginMigration.install_plugins(input_file, output_file)
File "F:\Dify资料\ai408_dify\api\services\plugin\plugin_migration.py", line 372, in install_plugins
response = cls.handle_plugin_instance_install(fake_tenant_id, plugins["plugins"])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\Dify资料\ai408_dify\api\services\plugin\plugin_migration.py", line 470, in handle_plugin_instance_install
future.result()# This will raise any exceptions that occurred
^^^^^^^^^^^^^^^
File "D:\Python311\Lib\concurrent\futures\_base.py", line 456, in result
return self.__get_result()
^^^^^^^^^^^^^^^^^^^
File "D:\Python311\Lib\concurrent\futures\_base.py", line 401, in __get_result
raise self._exception
File "D:\Python311\Lib\concurrent\futures\thread.py", line 58, in run
result = self.fn(*self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\Dify资料\ai408_dify\api\services\plugin\plugin_migration.py", line 464, in download_and_upload
manager.upload_pkg(tenant_id, plugin_package, verify_signature=True)
File "F:\Dify资料\ai408_dify\api\core\plugin\manager\plugin.py", line 53, in upload_pkg
return self._request_with_plugin_daemon_response(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "F:\Dify资料\ai408_dify\api\core\plugin\manager\base.py", line 152, in _request_with_plugin_daemon_response
self._handle_plugin_daemon_error(error.error_type, error.message)
File "F:\Dify资料\ai408_dify\api\core\plugin\manager\base.py", line 235, in _handle_plugin_daemon_error
raise PluginDaemonUnauthorizedError(description=message)
core.plugin.manager.exc.PluginDaemonUnauthorizedError: PluginDaemonUnauthorizedError: unauthorized
(特别感谢微信群大佬 非法操作和 Junjie.M 的答疑)经提醒 plugin_api_key 和 plugin_daemon_key 不一致导致的,根据日志定位如下接口不通:
最后发现应该是 dify_config.PLUGIN_DAEMON_KEY,而不是 dify_config.PLUGIN_API_KEY。当时为了着急测试,直接将 plugin_daemon_inner_api_key 写固定了。需要修改 2 个地方,如下所示:
在完成插件安装后,按照 Dify 的常规升级流程更新数据库结构至最新版本:
poetry run flask db upgrade
Dify v1.0 对旧数据提供了兼容。正常情况下,可以继续使用。但为了更好地兼容未来版本,在确认不会回退到旧版本后,可以运行以下数据迁移命令:
poetry run flask migrate-data-for-plugin
此命令会在数据库中为现有的模型和工具供应商名称加上 langgenius 前缀,例如将 openai 转变为 langgenius/openai/openai。请注意,这样的操作可能会影响旧版本 Dify 的正常运行,所以在执行此命令前,请务必备份数据库,以免出现无法挽回的问题。
如果全部容器部署,docker\docker-compose.yaml 有个小的 bug,修改 dify-plugin 为 dify_plugin,如下所示:
通过版本可以看到现在已经是 Dify v1.0.0-beta.1 版本,如下所示:
现在看到的插件就是迁移过来的插件,如下所示:
(2)查看市场报错
在浏览器 Console 中看到报错了,如下所示:
解决方案是修改 dify\web\.env 配置文件,如下所示:
# The APIFREX for MARKETPLACE
NEXT_PUBLIC_MARKETPLACE_API_PREFIX=https://marketplace.dify.ai/api/v1
# The URL for MARKETPLACE
NEXT_PUBLIC_MARKETPLACE_URL_PREFIX=https://marketplace.dify.ai
以安装插件(模型)deepseek 为例,如下所示:
稍等一会儿,即可看到已经安装成功,如下所示:
在查看详情中可看到该插件的详细介绍,如下所示:
然后在设置-> 模型供应商中配置 API Key 即可,如下所示:
虽然插件(模型)安装成功了,但是发现 dify-plugin_daemon 容器报错,如下所示:
发现新安装的插件(模型)deepseek 成功了,但是从 Dify v0.15.0 迁移 Dify v1.0.0-beta.1 过来的某些插件(比如 openai、siliconflow)的 dify_plugin 包安装失败。解决方案就是删除后重新安装了,但是会遇到超时后 kill signal 问题,如下所示:
(特别感谢微信群大佬 非法操作 的答疑和贡献)解决方案[10]为修改 60 为 180 即可,如下所示:
然后重新打个镜像,修改 dify\docker\docker-compose.middleware.yaml 中 plugin_daemon 的 image 为 langgenius/dify-plugin-daemon:0.0.2-local。其中,tag 自定义命名即可。
docker build -t langgenius/dify-plugin-daemon:0.0.2-local -f docker/local.dockerfile .
该版本除了 dify 数据库,还新增了 dify_plugin 数据库,该库相关的数据表,如下所示:
觉的还有部分也可以解耦出来,就是现在 Dify 被吐槽最多的 RAG,可以拆分为通用文档解析部分,知识库或知识图谱部分。还有类似 LangChain 的多智能体,以及 LangGraph 功能等。当然还有 Dify 的工作流等性能问题亟待解决。虽说现在仅仅是迈出了万里长征的第一步,但更是新的开端。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-07-02
Dify:一个初中辍学生,怎么把开源 AI 工具带到硅谷
2026-06-30
Dify记忆能力实战(下):Mem0插件接入,实现跨会话智能记忆
2026-06-30
告别拖拽做工作流:两个Skill让Dify应用全流程自动化
2026-06-27
我用 Dify 1.15.0 搭了个全自动图文生产机,效率直接翻3倍
2026-06-26
Dify 1.15.0解读:difyctl、HITL表单和慢模型轮询,企业AI工程化继续补底座
2026-06-26
时隔一个多月,Dify v1.15.0终于发布了!
2026-06-18
Dify记忆能力实战(上):上下文记忆与会话变量,让AI告别“金鱼脑”
2026-06-15
Dify也开始CLI了,来看看有啥用途?
2026-04-18
2026-04-12
2026-05-22
2026-06-11
2026-06-03
2026-06-02
2026-06-15
2026-06-18
2026-06-26
2026-06-26
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。