Skip to main content

本文档由 AI 自动翻译。如有任何不准确之处,请参考 英文原版。

简介#

本文档是通过模型插件将 AI 模型集成到 Dify 时所需实现的接口和数据结构的技术参考。

Note

在深入阅读本 API 参考之前,建议先阅读 模型设计规则 了解概念模型,并参考 创建新模型供应商 获取分步演示。

快速决策:我需要实现哪个方法?#

如果你的模型是……实现
对话/续写 LLMLargeLanguageModel._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 基类,并实现凭据验证接口。

供应商凭据验证#

credentialsdict#

在供应商 YAML 配置中 provider_credential_schema 下定义的凭据信息,通常为 api_key、organization_id 等字段。

Warning

验证失败时,你的实现必须抛出 CredentialsValidateFailedError 异常,以确保在 Dify UI 中正确处理错误。

Tip

对于预定义模型供应商,应实现完整的验证方法,对照你的 API 校验凭据。对于自定义模型供应商(每个模型各有自己的凭据),简化的实现即可。

模型#

Dify 支持五种不同的模型类型,每种都有各自的接口。所有模型类型都共享以下通用要求。

通用接口#

无论类型如何,每个模型实现都必须实现以下两个基础方法:

1. 模型凭据验证#

modelstringrequired#

要验证的具体模型标识符(例如 “gpt-4”、“claude-3-opus”)

credentialsdictrequired#

在供应商配置中定义的凭据信息

2. 错误映射#

可用的错误类型
InvokeConnectionErrorclass#

网络连接失败、超时

InvokeServerUnavailableErrorclass#

服务供应商宕机或不可用

InvokeRateLimitErrorclass#

达到速率限制或配额限制

InvokeAuthorizationErrorclass#

认证或权限问题

InvokeBadRequestErrorclass#

无效的参数或请求

Tip

你也可以在代码中直接抛出这些标准化错误类型,而不依赖错误映射。这种方式让你对错误消息有更多控制。

LLM 实现#

要实现大语言模型供应商,请继承 __base.large_language_model.LargeLanguageModel 基类,并实现以下方法:

1. 模型调用#

这个核心方法同时处理对语言模型的流式和非流式 API 调用。

参数
modelstringrequired#

模型标识符(例如 “gpt-4”、“claude-3”)

credentialsdictrequired#

API 的认证凭据

prompt_messageslist[PromptMessage]required#

Dify 标准格式的消息列表:

  • 对于 completion 模型:包含单个 UserPromptMessage。
  • 对于 chat 模型:按需包含 SystemPromptMessage、UserPromptMessage、AssistantPromptMessage 和 ToolPromptMessage。
model_parametersdictrequired#

在模型 YAML 配置中定义的模型专属参数(temperature、top_p 等)

toolslist[PromptMessageTool]#

用于函数调用能力的工具定义

stoplist[string]#

遇到时会终止模型生成的停止序列

streamboolean#

是否返回流式响应

Default: true

userstring#

用于 API 监控的用户标识符

返回值
stream=TrueGenerator[LLMResultChunk, None, None]#

一个生成器,在响应分块可用时逐个产出

stream=FalseLLMResult#

包含完整生成文本的完整响应对象

Tip

建议为流式和非流式调用分别实现辅助方法,让代码保持清晰、易于维护。

2. Token 计数#

Info

如果模型不提供分词器,可使用基类的 _get_num_tokens_by_gpt2(text) 方法得到合理的近似值。

3. 自定义模型 Schema(可选)#

Info

此方法仅对支持自定义模型的供应商是必需的。它让自定义模型可以从基础模型继承参数规则。

TextEmbedding 实现#

Info

文本嵌入模型将文本转换为可捕获语义的高维向量,适用于检索、相似度搜索和分类等场景。

要实现文本嵌入供应商,请继承 __base.text_embedding_model.TextEmbeddingModel 基类:

1. 核心嵌入方法#

参数
modelstringrequired#

嵌入模型标识符

credentialsdictrequired#

嵌入服务的认证凭据

textslist[string]required#

要嵌入的文本输入列表

userstring#

用于 API 监控的用户标识符

返回值
TextEmbeddingResultobjectrequired#

包含以下内容的结构化响应:

  • model:用于嵌入的模型。
  • embeddings:嵌入向量,顺序与输入文本一致。
  • usage:关于 token 用量和成本的元数据。

2. Token 计数方法#

Tip

对于嵌入模型,准确的 token 计数对成本估算很重要,但对功能而言并不关键。_get_num_tokens_by_gpt2 方法可为大多数模型提供合理的近似值。

Rerank 实现#

Info

重排序模型在初次检索之后,根据候选文档与查询的相关性对其重新排序,从而提升搜索质量。

要实现重排序供应商,请继承 __base.rerank_model.RerankModel 基类:

参数
modelstringrequired#

重排序模型标识符

credentialsdictrequired#

API 的认证凭据

querystringrequired#

搜索查询文本

docslist[string]required#

要重排序的文档文本列表

score_thresholdfloat#

文档进入结果所需达到的最低分数

top_nint#

返回结果的最大数量

userstring#

用于 API 监控的用户标识符

返回值
RerankResultobjectrequired#

包含以下内容的结构化响应:

  • model:用于重排序的模型。
  • docs:包含索引、文本和分数的 RerankDocument 对象列表。
Warning

重排序的计算开销可能很大,尤其是文档集较大时。对大型文档集合实现批处理,以免超时或消耗过多资源。

Speech2Text 实现#

Info

语音转文字模型将音频文件中的语音转换为书面文本,可用于转录服务、语音命令和无障碍功能等场景。

要实现语音转文字供应商,请继承 __base.speech2text_model.Speech2TextModel 基类:

参数
modelstringrequired#

语音转文字模型标识符

credentialsdictrequired#

API 的认证凭据

fileIO[bytes]required#

包含待转录音频的二进制文件对象

userstring#

用于 API 监控的用户标识符

返回值
textstringrequired#

从音频文件转录得到的文本

Tip

音频格式检测对于正确处理不同文件类型很重要。可如示例所示,实现一个从文件头检测格式的辅助方法。

Warning

有些语音转文字 API 对文件大小有限制。必要时可对大型音频文件实现分块处理。

Text2Speech 实现#

Info

文本转语音模型将书面文本转换为自然流畅的语音,可用于语音助手、屏幕阅读器和音频内容生成等场景。

要实现文本转语音供应商,请继承 __base.text2speech_model.Text2SpeechModel 基类:

参数
modelstringrequired#

文本转语音模型标识符

credentialsdictrequired#

API 的认证凭据

content_textstringrequired#

要转换为语音的文本内容

streamingbooleanrequired#

返回流式音频还是完整文件

userstring#

用于 API 监控的用户标识符

返回值
streaming=TrueGenerator[bytes, None, None]#

一个生成器,在音频分块可用时逐个产出

streaming=Falsebytes#

以字节形式返回的完整音频数据

Tip

大多数文本转语音 API 要求在指定模型的同时指定语音。可在 Dify 的模型标识符与供应商的语音选项之间实现映射。

Warning

较长的文本输入可能需要分块,以获得更好的语音合成质量。可实现文本预处理,妥善处理标点、数字和特殊字符。

Moderation 实现#

Info

内容审核模型分析内容中可能存在的有害、不当或不安全材料,帮助维护平台安全和内容政策。

要实现内容审核供应商,请继承 __base.moderation_model.ModerationModel 基类:

参数
modelstringrequired#

内容审核模型标识符

credentialsdictrequired#

API 的认证凭据

textstringrequired#

要分析的文本内容

userstring#

用于 API 监控的用户标识符

返回值
resultbooleanrequired#

表示内容安全性的布尔值:

  • False:内容安全。
  • True:内容包含有害材料。
Warning

内容审核常被用作安全机制。实现方案时,请权衡漏报(放过有害内容)与误报(拦截安全内容)的影响。

Tip

许多内容审核 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#

流式响应中的单个分块。

LLMUsage#

TextEmbeddingResult#

EmbeddingUsage#

RerankResult#

RerankDocument#

相关资源#