Bug fix: Enhance embeding model to give better error message (#15346)

To resolve https://github.com/infiniflow/ragflow/issues/15343 enhance
the model embedding message to give extact failure message to customer.


# QWen

## Retrieval
<img width="3321" height="1033" alt="image"
src="https://github.com/user-attachments/assets/6b82921a-a3a7-4a33-a383-1cf316398ee2"
/>

## Chat
<img width="2241" height="311" alt="image"
src="https://github.com/user-attachments/assets/ec311365-62d5-407a-8915-5c8d72be9716"
/>


# SiliconFlow
## Retrieval
<img width="3321" height="1033" alt="image"
src="https://github.com/user-attachments/assets/ee2cd191-a27d-4729-b53d-2fbdb4e352cd"
/>

## Chat
<img width="1562" height="210" alt="image"
src="https://github.com/user-attachments/assets/10376a8e-a3f4-422f-bc2e-96f2a8a96448"
/>

# Baichuan
## Retrieval
<img width="3321" height="1107" alt="image"
src="https://github.com/user-attachments/assets/dcb5409d-f7fc-4804-b186-5e1ee11e09c4"
/>

## Chat
<img width="2241" height="311" alt="image"
src="https://github.com/user-attachments/assets/ec311365-62d5-407a-8915-5c8d72be9716"
/>


# Zhipu
zhipu is good.
This commit is contained in:
Wang Qi
2026-06-01 19:18:16 +08:00
committed by GitHub
parent 252cc19f93
commit 1a6df01b53
8 changed files with 191 additions and 57 deletions

View File

@@ -27,6 +27,7 @@ from ollama import Client
from openai import OpenAI
from zhipuai import ZhipuAI
from common.exceptions import ModelException
from common.log_utils import log_exception
from common.token_utils import num_tokens_from_string, truncate, total_token_count_from_response
from common import settings
@@ -36,6 +37,14 @@ import base64
logger = logging.getLogger(__name__)
def _raise_model_exception_if_failed(resp):
status_code = resp.status_code
if status_code >= 400:
if status_code < 500 and status_code not in [408, 429]:
raise ModelException(f"status: {resp.status_code}, response: {resp.text}", retryable=False)
raise ModelException(f"status: {resp.status_code}, response: {resp.text}", retryable=True)
def _dashscope_base_url_for_log(base_url: str) -> str:
"""Log host/path only (no query string) so secrets in URLs are not printed."""
return base_url.split("?", 1)[0].strip()[:256]
@@ -172,7 +181,10 @@ class OpenAIEmbed(Base):
ress = []
total_tokens = 0
for i in range(0, len(texts), batch_size):
res = self.client.embeddings.create(input=texts[i : i + batch_size], model=self.model_name, encoding_format="float", extra_body={"drop_params": True})
try:
res = self.client.embeddings.create(input=texts[i : i + batch_size], model=self.model_name, encoding_format="float", extra_body={"drop_params": True})
except Exception as _e:
raise ModelException(f"Error: {_e}")
try:
ress.extend([d.embedding for d in res.data])
total_tokens += total_token_count_from_response(res)
@@ -182,7 +194,10 @@ class OpenAIEmbed(Base):
return np.array(ress), total_tokens
def encode_queries(self, text):
res = self.client.embeddings.create(input=[truncate(text, 8191)], model=self.model_name, encoding_format="float", extra_body={"drop_params": True})
try:
res = self.client.embeddings.create(input=[truncate(text, 8191)], model=self.model_name, encoding_format="float", extra_body={"drop_params": True})
except Exception as _e:
raise ModelException(f"Error: {_e}")
try:
return np.array(res.data[0].embedding), total_token_count_from_response(res)
except Exception as _e:
@@ -294,20 +309,23 @@ class QWenEmbed(Base):
token_count = 0
texts = [truncate(t, 2048) for t in texts]
for i in range(0, len(texts), batch_size):
retry_max = 5
with _dashscope_native_api_url_scope(self._dashscope_http_api_url):
resp = dashscope.TextEmbedding.call(model=self.model_name, input=texts[i : i + batch_size], api_key=self.key, text_type="document")
while (resp["output"] is None or resp["output"].get("embeddings") is None) and retry_max > 0:
time.sleep(10)
retry_max, retry_wait_secs = 5, 10
for retry in range(retry_max):
with _dashscope_native_api_url_scope(self._dashscope_http_api_url):
resp = dashscope.TextEmbedding.call(model=self.model_name, input=texts[i : i + batch_size], api_key=self.key, text_type="document")
retry_max -= 1
if retry_max == 0 and (resp["output"] is None or resp["output"].get("embeddings") is None):
if resp.get("message"):
log_exception(ValueError(f"Retry_max reached, calling embedding model failed: {resp['message']}"))
status_code = resp.status_code
if status_code >= 400 and status_code < 500 and status_code not in [408, 429]:
raise ModelException(f"Error, status: {status_code}, response: {resp}")
# No need to retry for 4XX error
if status_code == 200:
break
if retry < retry_max - 1:
logging.warning(f"Got error response from DashScope API (status: {status_code}, response: {resp}). Wait {retry_wait_secs} seconds. Retrying...")
time.sleep(retry_wait_secs)
else:
log_exception(ValueError("Retry_max reached, calling embedding model failed"))
raise
raise ModelException(f"Error after {retry_max} retries., status: {status_code}, response: {resp}")
try:
embds = [[] for _ in range(len(resp["output"]["embeddings"]))]
for e in resp["output"]["embeddings"]:
@@ -316,17 +334,21 @@ class QWenEmbed(Base):
token_count += total_token_count_from_response(resp)
except Exception as _e:
log_exception(_e, resp)
raise
raise ModelException(f"Error: {status_code}: {resp}")
return np.array(res), token_count
def encode_queries(self, text):
with _dashscope_native_api_url_scope(self._dashscope_http_api_url):
resp = dashscope.TextEmbedding.call(model=self.model_name, input=text[:2048], api_key=self.key, text_type="query")
status_code = resp.status_code
if status_code != 200:
raise ModelException(f"Error: status: {status_code}: code: {resp.get('code')}, message: {resp.get('message')}")
# No need to retry for 4XX error
try:
return np.array(resp["output"]["embeddings"][0]["embedding"]), total_token_count_from_response(resp)
except Exception as _e:
log_exception(_e, resp)
raise Exception(f"Error: {resp}")
raise ModelException(f"Error: {status_code}: {resp}")
class ZhipuEmbed(Base):
@@ -494,6 +516,7 @@ class JinaMultiVecEmbed(Base):
data["truncate"] = True
response = requests.post(self.base_url, headers=self.headers, json=data, timeout=30)
_raise_model_exception_if_failed(response)
try:
res = response.json()
for d in res["data"]:
@@ -772,6 +795,7 @@ class NvidiaEmbed(Base):
"truncate": "END",
}
response = requests.post(self.base_url, headers=self.headers, json=payload, timeout=30)
_raise_model_exception_if_failed(response)
try:
res = response.json()
ress.extend([d["embedding"] for d in res["data"]])
@@ -912,6 +936,7 @@ class SILICONFLOWEmbed(Base):
"encoding_format": "float",
}
response = requests.post(self.base_url, json=payload, headers=self.headers, timeout=30)
_raise_model_exception_if_failed(response)
try:
res = response.json()
ress.extend([d["embedding"] for d in res["data"]])
@@ -929,6 +954,7 @@ class SILICONFLOWEmbed(Base):
"encoding_format": "float",
}
response = requests.post(self.base_url, json=payload, headers=self.headers, timeout=30)
_raise_model_exception_if_failed(response)
try:
res = response.json()
return np.array(res["data"][0]["embedding"]), total_token_count_from_response(res)
@@ -1039,19 +1065,15 @@ class HuggingFaceEmbed(Base):
def encode(self, texts: list):
response = requests.post(f"{self.base_url}/embed", json={"inputs": texts}, headers={"Content-Type": "application/json"}, timeout=30)
if response.status_code == 200:
embeddings = response.json()
else:
raise Exception(f"Error: {response.status_code} - {response.text}")
_raise_model_exception_if_failed(response)
embeddings = response.json()
return np.array(embeddings), sum([num_tokens_from_string(text) for text in texts])
def encode_queries(self, text: str):
response = requests.post(f"{self.base_url}/embed", json={"inputs": text}, headers={"Content-Type": "application/json"}, timeout=30)
if response.status_code == 200:
embedding = response.json()[0]
return np.array(embedding), num_tokens_from_string(text)
else:
raise Exception(f"Error: {response.status_code} - {response.text}")
_raise_model_exception_if_failed(response)
embedding = response.json()[0]
return np.array(embedding), num_tokens_from_string(text)
class VolcEngineEmbed(Base):
@@ -1248,6 +1270,7 @@ class PerplexityEmbed(Base):
"encoding_format": "base64_int8",
}
response = requests.post(url, headers=self.headers, json=payload, timeout=30)
_raise_model_exception_if_failed(response)
try:
res = response.json()
for doc in res["data"]:
@@ -1267,6 +1290,7 @@ class PerplexityEmbed(Base):
"encoding_format": "base64_int8",
}
response = requests.post(url, headers=self.headers, json=payload, timeout=30)
_raise_model_exception_if_failed(response)
try:
res = response.json()
for d in res["data"]: