请复制这个prompt,并将其粘贴到你的 Agent 中。它将协助你开发 Dify 插件,提供最佳实践和代码示例。
Exception: Multiple subclasses of Tool in /path/to/file.py
tools/encrypt.py
只能包含EncryptTool
类,不能同时包含DecryptTool
FeatureTool
的命名模式utils/
目录tools/
目录provider/
目录ImportError: cannot import name 'x' from 'module'. Did you mean: 'y'?
provider/your_plugin.yaml
中添加新工具:
Multiple subclasses of Tool
错误时:
class AnotherTool(Tool):
的额外类定义Tool
的类encrypt.py
包含EncryptTool
和DecryptTool
,保留EncryptTool
并将DecryptTool
移至decrypt.py
Exception: Multiple subclasses of Tool in /path/to/file.py
ImportError: cannot import name 'x' from 'module'. Did you mean: 'y'?
tools/new_feature.yaml
tools/new_feature.py
,确保一个文件只有一个Tool子类Multiple subclasses of Tool
错误时:
class AnotherTool(Tool):
的额外类定义Tool
的类encrypt.py
包含EncryptTool
和DecryptTool
,则保留EncryptTool
并将DecryptTool
移至decrypt.py
class XxxTool(Tool):
定义working/
目录创建progress.md
requirements.txt
中明确声明open()
, read()
, write()
等)dify plugin init
命令创建基本项目结构:
utils/
目录中创建辅助函数,实现核心功能逻辑:
helpers.py
中实现与外部服务交互或处理复杂逻辑的函数
tools/
目录中创建工具实现类,对每个功能:
Tool
基类并重写_invoke
方法provider/
目录中实现验证逻辑:
provider/your_plugin.yaml
添加凭证定义provider/your_plugin.py
中实现_validate_credentials
方法.env
文件进行本地测试:
Multiple subclasses of Tool
:检查工具文件是否包含多个Tool子类ImportError: cannot import name
:检查导入的函数名是否拼写正确ToolProviderCredentialValidationError
:检查凭证验证逻辑utils/
目录下tools/
目录下provider/
目录下cp tools/existing_tool.py tools/new_tool.py
resource
、meta
、plugins
等部分type
和version
等基础字段tools
列表中添加对新工具YAML文件的引用tools/feature_name.yaml
llm
(由AI提取)或form
(UI配置)FeatureTool
模式,与文件名相对应.get()
方法并提供默认值:param = tool_parameters.get("param_name", "")
yield
返回各种类型的消息~=
指定依赖版本范围dify_plugin
.get()
方法并提供默认值:param = tool_parameters.get("param_name", "")
if not param: yield self.create_text_message("Error: Required parameter missing.")
.get()
方法,允许返回None:optional = tool_parameters.get("optional_param")
if not required_param: return error_message
if optional_param: do_something()
open()
, read()
, write()
等直接文件操作cat tools/problematic_file.py
cat utils/the_module.py
_validate_credentials
方法实现get()
代替直接索引:param = tool_parameters.get("param_name", "")
timeout=10
try/except
捕获异常