Xinference
为例,逐步完成一个完整的供应商接入。
需要注意的是,对于自定义模型,每一个模型的接入都需要填写一个完整的供应商凭据。
而不同于预定义模型,自定义供应商接入时永远会拥有如下两个参数,不需要在供应商 yaml 中定义。
validate_provider_credential
,Runtime会自行根据用户在此选择的模型类型和模型名称调用对应的模型层的validate_credentials
来进行验证。
llm
文本生成模型text_embedding
文本 Embedding 模型rerank
Rerank 模型speech2text
语音转文字tts
文字转语音moderation
审查Xinference
支持LLM
、Text Embedding
和Rerank
,那么我们开始编写xinference.yaml
。
model_type
来指定这个模型的类型,它有三种类型,所以我们这么编写model_name
,因此需要在这里定义llm
类型为例,编写xinference.llm.llm.py
在 llm.py
中创建一个 Xinference LLM 类,我们取名为 XinferenceAILargeLanguageModel
(随意),继承 __base.large_language_model.LargeLanguageModel
基类,实现以下几个方法:
yield
关键字的函数识别为生成器函数,返回的数据类型固定为 Generator
,因此同步和流式返回需要分别实现,就像下面这样(注意下面例子使用了简化参数,实际实现时需要按照上面的参数列表进行实现):
self._get_num_tokens_by_gpt2(text: str)
来获取预计算的tokens,这个方法位于AIModel
基类中,它会使用GPT2的Tokenizer进行计算,但是只能作为替代方法,并不完全准确。
max_tokens
temperature
top_p
这三个模型参数。
但是有的供应商根据不同的模型支持不同的参数,如供应商OpenLLM
支持top_k
,但是并不是这个供应商提供的所有模型都支持top_k
,我们这里举例 A 模型支持top_k
,B模型不支持top_k
,那么我们需要在这里动态生成模型参数的 Schema,如下所示:
InvokeError
类型,方便 Dify 针对不同错误做不同后续处理。
Runtime Errors:
InvokeConnectionError
调用连接错误InvokeServerUnavailableError
调用服务方不可用InvokeRateLimitError
调用达到限额InvokeAuthorizationError
调用鉴权失败InvokeBadRequestError
调用传参有误