供应商配置方式
供应商支持三种模型配置方式: 预定义模型(predefined-model) 表示用户只需要配置统一的供应商凭据即可使用供应商下的预定义模型。 自定义模型(customizable-model) 用户需要新增每个模型的凭据配置,如 Xinference,它同时支持 LLM 和 Text Embedding,但是每个模型都有唯一的 model_uid,如果想要将两者同时接入,就需要为每个模型配置一个 model_uid。 从远程获取(fetch-from-remote) 与predefined-model配置方式一致,只需要配置统一的供应商凭据即可,模型通过凭据信息从供应商获取。
如OpenAI,我们可以基于 gpt-turbo-3.5 来 Fine Tune 多个模型,而他们都位于同一个 api_key 下,当配置为fetch-from-remote时,开发者只需要配置统一的 api_key 即可让 Dify Runtime 获取到开发者所有的微调模型并接入 Dify。
这三种配置方式支持共存,即存在供应商支持predefined-model + customizable-model 或 predefined-model + fetch-from-remote等,也就是配置了供应商统一凭据可以使用预定义模型和从远程获取的模型,若新增了模型,则可以在此基础上额外使用自定义的模型。
配置说明
名词解释module: 一个module即为一个 Python Package,或者通俗一点,称为一个文件夹,里面包含了一个__init__.py文件,以及其他的.py文件。
- 创建供应商 yaml 文件,根据 Provider Schema 编写。
- 创建供应商代码,实现一个
class。 - 根据模型类型,在供应商
module下创建对应的模型类型module,如llm或text_embedding。 - 根据模型类型,在对应的模型
module下创建同名的代码文件,如llm.py,并实现一个class。 - 如果有预定义模型,根据模型名称创建同名的yaml文件在模型
module下,如claude-2.1.yaml,根据 AI Model Entity 编写。 - 编写测试代码,确保功能可用。
开始吧
增加一个新的供应商需要先确定供应商的英文标识,如anthropic,使用该标识在 model_providers 创建以此为名称的 module。
在此 module 下,我们需要先准备供应商的 YAML 配置。
准备供应商 YAML
此处以 Anthropic 为例,预设了供应商基础信息、支持的模型类型、配置方式、凭据规则。
OpenAI提供微调模型,那么我们就需要添加model_credential_schema,以OpenAI为例:
model_providers目录下其他供应商目录下的 YAML 配置信息。
实现供应商代码
我们需要在model_providers下创建一个同名的python文件,如anthropic.py,并实现一个class,继承__base.provider.Provider基类,如AnthropicProvider。
自定义模型供应商
当供应商为 Xinference 等自定义模型供应商时,可跳过该步骤,仅创建一个空的XinferenceProvider类即可,并实现一个空的validate_provider_credentials方法,该方法并不会被实际使用,仅用作避免抽象类无法实例化。
__base.model_provider.ModelProvider 基类,实现 validate_provider_credentials 供应商统一凭据校验方法即可,可参考 AnthropicProvider。
validate_provider_credentials 实现,在模型凭据校验方法实现后直接复用。
增加模型
增加预定义模型
对于预定义模型,我们可以通过简单定义一个 yaml,并通过实现调用代码来接入。
增加自定义模型
对于自定义模型,我们只需要实现调用代码即可接入,但是它需要处理的参数可能会更加复杂。
测试
为了保证接入供应商/模型的可用性,编写后的每个方法均需要在tests 目录中编写对应的集成测试代码。
依旧以 Anthropic 为例。
在编写测试代码前,需要先在 .env.example 新增测试供应商所需要的凭据环境变量,如:ANTHROPIC_API_KEY。
在执行前需要将 .env.example 复制为 .env 再执行。
编写测试代码
在 tests 目录下创建供应商同名的 module: anthropic,继续在此模块中创建 test_provider.py 以及对应模型类型的 test py 文件,如下所示: