refactor: standardize provider test method implementation

- Updated the `test` method in all provider classes to remove return values and raise exceptions for failure cases, enhancing clarity and consistency.
- Adjusted related logic in the dashboard and command routes to align with the new `test` method behavior, simplifying error handling.
This commit is contained in:
Soulter
2025-12-01 18:37:08 +08:00
parent 2ba0460f19
commit 31d53edb9d
3 changed files with 33 additions and 75 deletions

View File

@@ -45,13 +45,13 @@ class AbstractProvider(abc.ABC):
) )
return meta return meta
async def test(self) -> bool: async def test(self):
"""test the provider is a """test the provider is a
Returns: raises:
bool: the provider is available Exception: if the provider is not available
""" """
return True ...
class Provider(AbstractProvider): class Provider(AbstractProvider):
@@ -175,15 +175,11 @@ class Provider(AbstractProvider):
return dicts return dicts
async def test(self, timeout: float = 45.0) -> bool: async def test(self, timeout: float = 45.0):
try: await asyncio.wait_for(
response = await asyncio.wait_for(
self.text_chat(prompt="REPLY `PONG` ONLY"), self.text_chat(prompt="REPLY `PONG` ONLY"),
timeout=timeout, timeout=timeout,
) )
return response is not None
except Exception:
return False
class STTProvider(AbstractProvider): class STTProvider(AbstractProvider):
@@ -197,19 +193,13 @@ class STTProvider(AbstractProvider):
"""获取音频的文本""" """获取音频的文本"""
raise NotImplementedError raise NotImplementedError
async def test(self) -> bool: async def test(self):
try:
sample_audio_path = os.path.join( sample_audio_path = os.path.join(
get_astrbot_path(), get_astrbot_path(),
"samples", "samples",
"stt_health_check.wav", "stt_health_check.wav",
) )
if not os.path.exists(sample_audio_path): await self.get_text(sample_audio_path)
return False
text_result = await self.get_text(sample_audio_path)
return isinstance(text_result, str) and bool(text_result)
except Exception:
return False
class TTSProvider(AbstractProvider): class TTSProvider(AbstractProvider):
@@ -223,12 +213,8 @@ class TTSProvider(AbstractProvider):
"""获取文本的音频,返回音频文件路径""" """获取文本的音频,返回音频文件路径"""
raise NotImplementedError raise NotImplementedError
async def test(self) -> bool: async def test(self):
try: await self.get_audio("hi")
audio_result = await self.get_audio("hi")
return isinstance(audio_result, str) and bool(audio_result)
except Exception:
return False
class EmbeddingProvider(AbstractProvider): class EmbeddingProvider(AbstractProvider):
@@ -252,14 +238,8 @@ class EmbeddingProvider(AbstractProvider):
"""获取向量的维度""" """获取向量的维度"""
... ...
async def test(self) -> bool: async def test(self):
try: await self.get_embedding("astrbot")
embedding_result = await self.get_embedding("health_check")
return isinstance(embedding_result, list) and (
not embedding_result or isinstance(embedding_result[0], float)
)
except Exception:
return False
async def get_embeddings_batch( async def get_embeddings_batch(
self, self,
@@ -345,9 +325,7 @@ class RerankProvider(AbstractProvider):
"""获取查询和文档的重排序分数""" """获取查询和文档的重排序分数"""
... ...
async def test(self) -> bool: async def test(self):
try: result = await self.rerank("Apple", documents=["apple", "banana"])
await self.rerank("Apple", documents=["apple", "banana"]) if not result:
return True raise Exception("Rerank provider test failed, no results returned")
except Exception:
return False

View File

@@ -354,17 +354,11 @@ class ConfigRoute(Route):
) )
try: try:
result = await provider.test() await provider.test()
if result:
status_info["status"] = "available" status_info["status"] = "available"
logger.info( logger.info(
f"Provider {status_info['name']} (ID: {status_info['id']}) is available.", f"Provider {status_info['name']} (ID: {status_info['id']}) is available.",
) )
else:
status_info["error"] = "Provider test returned False."
logger.warning(
f"Provider {status_info['name']} (ID: {status_info['id']}) test returned False.",
)
except Exception as e: except Exception as e:
error_message = str(e) error_message = str(e)
status_info["error"] = error_message status_info["error"] = error_message

View File

@@ -34,25 +34,11 @@ class ProviderCommands:
provider_capability_type = meta.provider_type provider_capability_type = meta.provider_type
try: try:
result = await provider.test() await provider.test()
if result:
return True, None, None return True, None, None
except Exception as e:
err_code = "TEST_FAILED" err_code = "TEST_FAILED"
err_reason = "Provider test returned False" err_reason = str(e)
self._log_reachability_failure(
provider, provider_capability_type, err_code, err_reason
)
return False, err_code, err_reason
except Exception as exc:
err_code = (
getattr(exc, "status_code", None)
or getattr(exc, "code", None)
or getattr(exc, "error_code", None)
)
err_reason = str(exc)
if not err_code:
err_code = exc.__class__.__name__
self._log_reachability_failure( self._log_reachability_failure(
provider, provider_capability_type, err_code, err_reason provider, provider_capability_type, err_code, err_reason
) )