mirror of
https://github.com/linyqh/NarratoAI.git
synced 2025-12-11 18:42:49 +00:00
更新generate_narration_script.py、base.py和generate_short_summary.py文件,重构解说文案生成和视觉分析器的实现,优先使用新的LLM服务架构。添加回退机制以确保兼容性,增强系统的稳定性和用户体验。
119 lines
3.5 KiB
Python
119 lines
3.5 KiB
Python
"""
|
|
大模型服务异常类定义
|
|
|
|
定义了大模型服务中可能出现的各种异常类型,
|
|
提供统一的错误处理机制
|
|
"""
|
|
|
|
from typing import Optional, Dict, Any
|
|
|
|
|
|
class LLMServiceError(Exception):
|
|
"""大模型服务基础异常类"""
|
|
|
|
def __init__(self, message: str, error_code: Optional[str] = None, details: Optional[Dict[str, Any]] = None):
|
|
super().__init__(message)
|
|
self.message = message
|
|
self.error_code = error_code
|
|
self.details = details or {}
|
|
|
|
def __str__(self):
|
|
if self.error_code:
|
|
return f"[{self.error_code}] {self.message}"
|
|
return self.message
|
|
|
|
|
|
class ProviderNotFoundError(LLMServiceError):
|
|
"""供应商未找到异常"""
|
|
|
|
def __init__(self, provider_name: str):
|
|
super().__init__(
|
|
message=f"未找到大模型供应商: {provider_name}",
|
|
error_code="PROVIDER_NOT_FOUND",
|
|
details={"provider_name": provider_name}
|
|
)
|
|
|
|
|
|
class ConfigurationError(LLMServiceError):
|
|
"""配置错误异常"""
|
|
|
|
def __init__(self, message: str, config_key: Optional[str] = None):
|
|
super().__init__(
|
|
message=f"配置错误: {message}",
|
|
error_code="CONFIGURATION_ERROR",
|
|
details={"config_key": config_key} if config_key else {}
|
|
)
|
|
|
|
|
|
class APICallError(LLMServiceError):
|
|
"""API调用错误异常"""
|
|
|
|
def __init__(self, message: str, status_code: Optional[int] = None, response_text: Optional[str] = None):
|
|
super().__init__(
|
|
message=f"API调用失败: {message}",
|
|
error_code="API_CALL_ERROR",
|
|
details={
|
|
"status_code": status_code,
|
|
"response_text": response_text
|
|
}
|
|
)
|
|
|
|
|
|
class ValidationError(LLMServiceError):
|
|
"""输出验证错误异常"""
|
|
|
|
def __init__(self, message: str, validation_type: Optional[str] = None, invalid_data: Optional[Any] = None):
|
|
super().__init__(
|
|
message=f"输出验证失败: {message}",
|
|
error_code="VALIDATION_ERROR",
|
|
details={
|
|
"validation_type": validation_type,
|
|
"invalid_data": str(invalid_data) if invalid_data else None
|
|
}
|
|
)
|
|
|
|
|
|
class ModelNotSupportedError(LLMServiceError):
|
|
"""模型不支持异常"""
|
|
|
|
def __init__(self, model_name: str, provider_name: str):
|
|
super().__init__(
|
|
message=f"供应商 {provider_name} 不支持模型 {model_name}",
|
|
error_code="MODEL_NOT_SUPPORTED",
|
|
details={
|
|
"model_name": model_name,
|
|
"provider_name": provider_name
|
|
}
|
|
)
|
|
|
|
|
|
class RateLimitError(LLMServiceError):
|
|
"""API速率限制异常"""
|
|
|
|
def __init__(self, message: str = "API调用频率超限", retry_after: Optional[int] = None):
|
|
super().__init__(
|
|
message=message,
|
|
error_code="RATE_LIMIT_ERROR",
|
|
details={"retry_after": retry_after}
|
|
)
|
|
|
|
|
|
class AuthenticationError(LLMServiceError):
|
|
"""认证错误异常"""
|
|
|
|
def __init__(self, message: str = "API密钥无效或权限不足"):
|
|
super().__init__(
|
|
message=message,
|
|
error_code="AUTHENTICATION_ERROR"
|
|
)
|
|
|
|
|
|
class ContentFilterError(LLMServiceError):
|
|
"""内容过滤异常"""
|
|
|
|
def __init__(self, message: str = "内容被安全过滤器阻止"):
|
|
super().__init__(
|
|
message=message,
|
|
error_code="CONTENT_FILTER_ERROR"
|
|
)
|