dify 无法加载自定义审查扩展,

w6lpcovy  于 5个月前  发布在  其他
关注(0)|答案(7)|浏览(75)

自我检查

  • 这仅用于提交错误报告,如果您想提问,请访问 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异常。

gijlo24d

gijlo24d1#

要解决您在使用自定义Moderation扩展时遇到的"TypeError: '<' not supported between instances of 'NoneType' and 'int'"错误,您应该使用_position.yaml配置来管理扩展位置。这种方法消除了在代码中手动设置位置的需求,这是由于position_map中的None值导致的错误。
以下是您需要执行的操作:

  1. 确保_position.yaml存在:在包含您的扩展的目录中创建或更新_position.yaml文件。该文件应列出所有扩展(包括您的自定义扩展)的名称,按所需加载顺序排列。
  2. 匹配扩展名称:_position.yaml中的名称必须与您的扩展名称完全匹配。这些名称通常是扩展的目录名称或扩展内的指定标识符。
  3. 格式和位置:验证_position.yaml是否正确格式化和放置。错误的格式化或放置可能导致错误。
    按照这些步骤,您应该能够成功加载自定义Moderation扩展,而不会遇到TypeError。此方法简化了扩展位置管理,避免了在Python代码中进行手动位置分配,解决了您遇到的问题的根本原因。
详细信息

来源

此响应旨在帮助您节省时间并提高效率。它不是精确的解决方案,而是您自己研究的一个起点。
请帮助我变得更有用!如果您觉得有帮助,请留下一个👍,如果不相关,请留下一个👎。

  • 要继续对话,请提及@dosu。*
xtupzzrd

xtupzzrd2#

看起来_position.yaml仅在模型提供者中使用,而不是与代码库扩展一起使用。

4bbkushb

4bbkushb3#

为了解决加载自定义审核扩展和Dify版本0.6.5中的TypeError: '<' not supported between instances of 'NoneType' and 'int'错误,您可以直接在自定义扩展类中添加一个position属性。此属性将指定扩展应按顺序加载的顺序,避免与None进行比较。
以下是在自定义扩展类中实现此方法的示例:

By setting a specific `position` value, you ensure that your extension can be sorted and loaded correctly among other extensions. This method circumvents the issue caused by a `None` value in `position_map` for non-builtin extensions.
然而,对于这种方法要小心谨慎,因为它可能导致排序冲突、与内置扩展的不一致以及维护挑战,尤其是如果需要将来调整加载顺序或Dify对扩展排序的处理方式发生变化时。始终确保`position`值是唯一的,并仔细管理以避免与其他扩展发生冲突。

##### 详细信息

**来源**
* [zh_CN/guides/application-design/extension/code_based_extension/moderation.md](https://github.com/langgenius/dify-docs/blob/main/zh_CN/guides/application-design/extension/code_based_extension/moderation.md)
* [api/core/extension/extensible.py](https://github.com/langgenius/dify/blob/main/api/core/extension/extensible.py)
* [api/core/utils/position_helper.py](https://github.com/langgenius/dify/blob/main/api/core/utils/position_helper.py)
* [api/core/tools/provider/builtin/_positions.py](https://github.com/langgenius/dify/blob/main/api/core/tools/provider/builtin/_positions.py)
**关于Dosu**

此响应旨在帮助您节省时间并提高效率。它不是精确的解决方案,而是您自己研究的一个起点。
请帮助我变得更有用!如果您觉得有帮助,请留下一个👍,如果不相关,请留下一个👎。

* 要继续对话,请提及@dosu。*
sirbozc5

sirbozc54#

position_map中,如果扩展不是内置的,position变量不会更新。因此,无论你在CustomExtension中添加什么内容,都不会起作用。要解决这个问题,唯一的方法是修改代码,而不是CustomExtension。

cx6n0qe3

cx6n0qe35#

为了在Dify中有效地解决position变量未更新到position_map中的问题,导致非__builtin__扩展的排序问题,你需要修改代码以确保所有扩展,无论是否为__builtin__,都能正确识别和排序它们的位置。这包括创建或更新一个用于管理扩展加载顺序的_position.yaml文件,并调整代码以读取此配置。
以下是解决该问题的简洁方法:

  1. 创建或更新 _position.yaml:对于每个扩展,包括非__builtin__的扩展,确保它们的目录中有指定加载顺序的_position.yaml文件。此文件应将扩展名Map到它们期望的位置。
  2. 调整代码以使用 _position.yaml:修改扩展加载机制以读取_position.yaml文件并创建一个包含所有具有指定位置的扩展的position_map。如果扩展没有指定位置,则应默认放置在加载顺序的末尾。
  3. 实现排序逻辑:使用sort_by_position_map函数,确保它处理扩展位置可能未定义的情况,通过分配将它们放置在列表末尾的默认值来避免比较NoneTypeint。这样可以防止出现TypeError错误,因为它避免了在NoneTypeint之间进行比较。
    通过遵循这些步骤,你可以确保每个扩展,无论是__builtin__还是自定义的,都在具有有效位置的position_map中得到考虑,从而解决排序问题并防止出现TypeError错误。这种方法提供了一种可扩展且易于维护的方式来管理Dify中的扩展加载顺序。
详情

来源

此响应旨在帮助你节省时间并提高效率。它不是精确的解决方案,而是你自己研究的一个起点。
请帮助我变得更有用!如果你觉得这个回答有帮助,请给我一个👍;如果不相关,请给我一个👎。

  • 要继续对话,请提及@dosu。*
pjngdqdw

pjngdqdw6#

我可以看一下你是如何配置审核的吗?

eulz3vhy

eulz3vhy7#

你好,lo5twind,你终于解决了吗?

相关问题