自我检查
- 这仅用于提交错误报告,如果您想提问,请访问 Discussions 。
- 我已在 search for existing issues 中搜索了现有问题,包括已关闭的问题。
- 我确认我使用英语提交此报告(我已阅读并同意 Language Policy )。
- 请不要修改此模板 :) 并填写所有必需的字段。
Dify版本
0.6.5
云或自托管
自托管(Docker)
重现步骤
当我根据官方文档编写自定义版块扩展时,在服务重启过程中出现了加载错误。错误信息如下:
Traceback (most recent call last):
File "/usr/local/bin/flask", line 8, in <module>
sys.exit(main())
File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 1105, in main
cli.main()
File "/usr/local/lib/python3.10/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python3.10/site-packages/click/core.py", line 1682, in invoke
cmd_name, cmd, args = self.resolve_command(ctx, args)
File "/usr/local/lib/python3.10/site-packages/click/core.py", line 1729, in resolve_command
cmd = self.get_command(ctx, cmd_name)
File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 611, in get_command
app = info.load_app()
File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 335, in load_app
app = locate_app(import_name, name)
File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 245, in locate_app
__import__(module_name)
File "/app/api/app.py", line 210, in <module>
app = create_app()
File "/app/api/app.py", line 105, in create_app
initialize_extensions(app)
File "/app/api/app.py", line 116, in initialize_extensions
ext_code_based_extension.init()
File "/app/api/extensions/ext_code_based_extension.py", line 5, in init
code_based_extension.init()
File "/app/api/core/extension/extension.py", line 16, in init
self.__module_extensions[module.value] = module_class.scan_extensions()
File "/app/api/core/extension/extensible.py", line 111, in scan_extensions
sorted_extensions = sort_to_dict_by_position_map(position_map, extensions, lambda x: x.name)
File "/app/api/core/utils/position_helper.py", line 69, in sort_to_dict_by_position_map
sorted_items = sort_by_position_map(position_map, data, name_func)
File "/app/api/core/utils/position_helper.py", line 53, in sort_by_position_map
return sorted(data, key=lambda x: position_map.get(name_func(x), float('inf')))
TypeError: '<' not supported between instances of 'NoneType' and 'int'
当我检查源代码时,发现一个非内置扩展会在 None
中设置一个 position_map
,从而导致这个TypeError,请帮忙修复这个问题。
我尝试修改 api/core/extension/extensible.py 文件的第68行,如下所示:
if '__builtin__' in file_names:
builtin = True
builtin_file_path = os.path.join(subdir_path, '__builtin__')
if os.path.exists(builtin_file_path):
with open(builtin_file_path, encoding='utf-8') as f:
position = int(f.read().strip())
position_map[extension_name] = position # modified work
#position_map[extension_name] = position # original NOT work
✔️预期行为
加载扩展成功
❌实际行为
抛出TypeError异常。
7条答案
按热度按时间gijlo24d1#
要解决您在使用自定义Moderation扩展时遇到的"TypeError: '<' not supported between instances of 'NoneType' and 'int'"错误,您应该使用
_position.yaml
配置来管理扩展位置。这种方法消除了在代码中手动设置位置的需求,这是由于position_map
中的None
值导致的错误。以下是您需要执行的操作:
_position.yaml
存在:在包含您的扩展的目录中创建或更新_position.yaml
文件。该文件应列出所有扩展(包括您的自定义扩展)的名称,按所需加载顺序排列。_position.yaml
中的名称必须与您的扩展名称完全匹配。这些名称通常是扩展的目录名称或扩展内的指定标识符。_position.yaml
是否正确格式化和放置。错误的格式化或放置可能导致错误。按照这些步骤,您应该能够成功加载自定义Moderation扩展,而不会遇到TypeError。此方法简化了扩展位置管理,避免了在Python代码中进行手动位置分配,解决了您遇到的问题的根本原因。
详细信息
来源
关于Dosu
此响应旨在帮助您节省时间并提高效率。它不是精确的解决方案,而是您自己研究的一个起点。
请帮助我变得更有用!如果您觉得有帮助,请留下一个👍,如果不相关,请留下一个👎。
xtupzzrd2#
看起来_position.yaml仅在模型提供者中使用,而不是与代码库扩展一起使用。
4bbkushb3#
为了解决加载自定义审核扩展和Dify版本0.6.5中的
TypeError: '<' not supported between instances of 'NoneType' and 'int'
错误,您可以直接在自定义扩展类中添加一个position
属性。此属性将指定扩展应按顺序加载的顺序,避免与None
进行比较。以下是在自定义扩展类中实现此方法的示例:
sirbozc54#
在
position_map
中,如果扩展不是内置的,position
变量不会更新。因此,无论你在CustomExtension中添加什么内容,都不会起作用。要解决这个问题,唯一的方法是修改代码,而不是CustomExtension。cx6n0qe35#
为了在Dify中有效地解决
position
变量未更新到position_map
中的问题,导致非__builtin__
扩展的排序问题,你需要修改代码以确保所有扩展,无论是否为__builtin__
,都能正确识别和排序它们的位置。这包括创建或更新一个用于管理扩展加载顺序的_position.yaml
文件,并调整代码以读取此配置。以下是解决该问题的简洁方法:
_position.yaml
:对于每个扩展,包括非__builtin__
的扩展,确保它们的目录中有指定加载顺序的_position.yaml
文件。此文件应将扩展名Map到它们期望的位置。_position.yaml
:修改扩展加载机制以读取_position.yaml
文件并创建一个包含所有具有指定位置的扩展的position_map
。如果扩展没有指定位置,则应默认放置在加载顺序的末尾。sort_by_position_map
函数,确保它处理扩展位置可能未定义的情况,通过分配将它们放置在列表末尾的默认值来避免比较NoneType
和int
。这样可以防止出现TypeError
错误,因为它避免了在NoneType
和int
之间进行比较。通过遵循这些步骤,你可以确保每个扩展,无论是
__builtin__
还是自定义的,都在具有有效位置的position_map
中得到考虑,从而解决排序问题并防止出现TypeError
错误。这种方法提供了一种可扩展且易于维护的方式来管理Dify中的扩展加载顺序。详情
来源
关于Dosu
此响应旨在帮助你节省时间并提高效率。它不是精确的解决方案,而是你自己研究的一个起点。
请帮助我变得更有用!如果你觉得这个回答有帮助,请给我一个👍;如果不相关,请给我一个👎。
pjngdqdw6#
我可以看一下你是如何配置审核的吗?
eulz3vhy7#
你好,lo5twind,你终于解决了吗?