Dify Rerank 模型配置全流程解析:从报错定位到代码实现
一、问题背景:神秘的 'results'
错误
在 Dify 1.0.0+ 版本中配置 Rerank 模型时,可能会遇到以下错误:
CredentialsValidateFailedError: 'results'
此错误提示模型凭证验证失败,但具体原因并不明确。
通过日志追踪,发现错误发生在 凭证校验阶段,核心问题在于插件代码与服务端返回数据格式不兼容。
二、错误定位:代码调用链路分析
1. 核心调用链路
Dify 通过插件机制调用 Rerank 模型,关键代码分布在多个仓库:
代码路径 | 作用说明 |
---|---|
dify/api/services/model_provider_service.py |
触发凭证校验逻辑,调用插件管理器 |
dify-plugin-daemon 的 rerank.py 模板 |
初始插件代码,但 _invoke 为空实现 |
dify-official-plugins/models/openai_api_compatible/models/rerank/rerank.py |
实际模型实现,继承自 OAICompatRerankModel |
dify-plugin-sdks/python/dify_plugin/interfaces/model/openai_compatible |
定义 OAICompatRerankModel 类,实现 HTTP 请求与结果解析 |
2. 错误根源
最终报错位置位于 OAICompatRerankModel._invoke
方法,代码强制要求服务端返回的 JSON 中必须包含 results
字段。若服务端响应格式不符合,则触发 KeyError
,最终抛出 CredentialsValidateFailedError
。
三、核心代码解析:_invoke
方法实现
完整代码位于 dify-plugin-sdks 的 rerank.py
,以下是关键逻辑:
class OAICompatRerankModel(RerankModel):
def _invoke(
self,
model: str,
credentials: dict,
query: str,
docs: list[str],
score_threshold: Optional[float] = None,
top_n: Optional[int] = None,
user: Optional[str] = None,
) -> RerankResult:
# 1. 参数校验与请求构建
server_url = credentials["endpoint_url"]
model_name = model
if not server_url or not model_name:
raise CredentialsValidateFailedError("Missing required parameters")
# 2. 发送 HTTP 请求(兼容 Jina API 格式)
url = str(URL(server_url) / "rerank"
headers = {
"Authorization": f"Bearer {
credentials.get('api_key')}"}
data = {
"model"