本文档由 AI 自动翻译。如有任何不准确之处,请参考 英文原版。
简介#
本文档是通过模型插件将 AI 模型集成到 Dify 时所需实现的接口和数据结构的技术参考。
快速决策:我需要实现哪个方法?#
| 如果你的模型是…… | 实现 |
|---|---|
| 对话/续写 LLM | LargeLanguageModel._invoke、_get_num_tokens |
| 嵌入模型 | TextEmbeddingModel._invoke、_get_num_tokens |
| 重排序模型 | RerankModel._invoke |
| 语音转文字 | Speech2TextModel._invoke |
| 文字转语音 | Text2SpeechModel._invoke |
| 内容审核 | ModerationModel._invoke |
此外,每个供应商都要实现 validate_provider_credentials(供应商级鉴权);如果模型支持用户自行配置,还需为每种模型类型实现 validate_credentials。
模型供应商#
每个模型供应商都必须继承 __base.model_provider.ModelProvider 基类,并实现凭据验证接口。
供应商凭据验证#
在供应商 YAML 配置中 provider_credential_schema 下定义的凭据信息,通常为 api_key、organization_id 等字段。
验证失败时,你的实现必须抛出 CredentialsValidateFailedError 异常,以确保在 Dify UI 中正确处理错误。
对于预定义模型供应商,应实现完整的验证方法,对照你的 API 校验凭据。对于自定义模型供应商(每个模型各有自己的凭据),简化的实现即可。
模型#
Dify 支持五种不同的模型类型,每种都有各自的接口。所有模型类型都共享以下通用要求。
通用接口#
无论类型如何,每个模型实现都必须实现以下两个基础方法:
1. 模型凭据验证#
要验证的具体模型标识符(例如 “gpt-4”、“claude-3-opus”)
在供应商配置中定义的凭据信息
2. 错误映射#
你也可以在代码中直接抛出这些标准化错误类型,而不依赖错误映射。这种方式让你对错误消息有更多控制。
LLM 实现#
要实现大语言模型供应商,请继承 __base.large_language_model.LargeLanguageModel 基类,并实现以下方法:
1. 模型调用#
这个核心方法同时处理对语言模型的流式和非流式 API 调用。
参数
模型标识符(例如 “gpt-4”、“claude-3”)
API 的认证凭据
Dify 标准格式的消息列表:
- 对于
completion模型:包含单个UserPromptMessage。 - 对于
chat模型:按需包含SystemPromptMessage、UserPromptMessage、AssistantPromptMessage和ToolPromptMessage。
在模型 YAML 配置中定义的模型专属参数(temperature、top_p 等)
用于函数调用能力的工具定义
遇到时会终止模型生成的停止序列
用于 API 监控的用户标识符
建议为流式和非流式调用分别实现辅助方法,让代码保持清晰、易于维护。
2. Token 计数#
如果模型不提供分词器,可使用基类的 _get_num_tokens_by_gpt2(text) 方法得到合理的近似值。
3. 自定义模型 Schema(可选)#
此方法仅对支持自定义模型的供应商是必需的。它让自定义模型可以从基础模型继承参数规则。
TextEmbedding 实现#
文本嵌入模型将文本转换为可捕获语义的高维向量,适用于检索、相似度搜索和分类等场景。
要实现文本嵌入供应商,请继承 __base.text_embedding_model.TextEmbeddingModel 基类:
1. 核心嵌入方法#
返回值
包含以下内容的结构化响应:
model:用于嵌入的模型。embeddings:嵌入向量,顺序与输入文本一致。usage:关于 token 用量和成本的元数据。
2. Token 计数方法#
对于嵌入模型,准确的 token 计数对成本估算很重要,但对功能而言并不关键。_get_num_tokens_by_gpt2 方法可为大多数模型提供合理的近似值。
Rerank 实现#
重排序模型在初次检索之后,根据候选文档与查询的相关性对其重新排序,从而提升搜索质量。
要实现重排序供应商,请继承 __base.rerank_model.RerankModel 基类:
返回值
包含以下内容的结构化响应:
model:用于重排序的模型。docs:包含索引、文本和分数的RerankDocument对象列表。
重排序的计算开销可能很大,尤其是文档集较大时。对大型文档集合实现批处理,以免超时或消耗过多资源。
Speech2Text 实现#
语音转文字模型将音频文件中的语音转换为书面文本,可用于转录服务、语音命令和无障碍功能等场景。
要实现语音转文字供应商,请继承 __base.speech2text_model.Speech2TextModel 基类:
返回值
从音频文件转录得到的文本
音频格式检测对于正确处理不同文件类型很重要。可如示例所示,实现一个从文件头检测格式的辅助方法。
有些语音转文字 API 对文件大小有限制。必要时可对大型音频文件实现分块处理。
Text2Speech 实现#
文本转语音模型将书面文本转换为自然流畅的语音,可用于语音助手、屏幕阅读器和音频内容生成等场景。
要实现文本转语音供应商,请继承 __base.text2speech_model.Text2SpeechModel 基类:
大多数文本转语音 API 要求在指定模型的同时指定语音。可在 Dify 的模型标识符与供应商的语音选项之间实现映射。
较长的文本输入可能需要分块,以获得更好的语音合成质量。可实现文本预处理,妥善处理标点、数字和特殊字符。
Moderation 实现#
内容审核模型分析内容中可能存在的有害、不当或不安全材料,帮助维护平台安全和内容政策。
要实现内容审核供应商,请继承 __base.moderation_model.ModerationModel 基类:
返回值
表示内容安全性的布尔值:
False:内容安全。True:内容包含有害材料。
内容审核常被用作安全机制。实现方案时,请权衡漏报(放过有害内容)与误报(拦截安全内容)的影响。
许多内容审核 API 提供详细的分类分数,而不仅是二元结果。如果你的应用有需要,可扩展此实现,返回有关具体有害内容类别的更详细信息。
实体#
PromptMessageRole#
会话中消息的角色。
PromptMessageContentType#
消息内容的类型:纯文本或图片。
PromptMessageContent#
消息内容的基类,仅用于类型声明,请勿直接实例化。
内容目前支持文本和图片两种类型,单条消息可将文本与多张图片组合在一起。请实例化 TextPromptMessageContent 和 ImagePromptMessageContent。
TextPromptMessageContent#
当消息同时包含文本和图片时,将文本包装为此实体并加入 content 列表。
ImagePromptMessageContent#
当消息同时包含文本和图片时,将每张图片包装为此实体并加入 content 列表。data 接受图片 URL 或 base64 编码的图片字符串。
PromptMessage#
所有角色专属消息的基类,仅用于类型声明,请勿直接实例化。
UserPromptMessage#
表示一条用户消息。
AssistantPromptMessage#
表示一条模型回复,通常用于 few-shot 示例或聊天历史输入。
当请求包含 tools 时,tool_calls 保存模型返回的工具调用。
SystemPromptMessage#
表示一条系统消息,通常用于为模型设置系统指令。
ToolPromptMessage#
表示一条工具消息,将工具的执行结果回传给模型,用于下一步规划。
通过继承而来的 content 字段传入工具的执行结果。
PromptMessageTool#
LLMResult#
LLMResultChunkDelta#
流式响应中每个分块内的增量 delta。
LLMResultChunk#
流式响应中的单个分块。