diff --git a/src/api/admin.py b/src/api/admin.py index f15c08a..a49b864 100644 --- a/src/api/admin.py +++ b/src/api/admin.py @@ -1119,19 +1119,24 @@ async def get_logs( result = [] for log in logs: + raw_status_code = log.get("status_code") + try: + status_code = int(raw_status_code) if raw_status_code is not None else None + except (TypeError, ValueError): + status_code = None result.append({ "id": log.get("id"), "token_id": log.get("token_id"), "token_email": log.get("token_email"), "token_username": log.get("token_username"), "operation": log.get("operation"), - "status_code": log.get("status_code"), + "status_code": status_code if status_code is not None else raw_status_code, "duration": log.get("duration"), "status_text": log.get("status_text") or "", "progress": log.get("progress") or 0, "created_at": log.get("created_at"), "updated_at": log.get("updated_at"), - "error_summary": _extract_error_summary(log.get("response_body_excerpt")), + "error_summary": _extract_error_summary(log.get("response_body_excerpt")) if status_code is not None and status_code >= 400 else "", }) return result diff --git a/src/services/file_cache.py b/src/services/file_cache.py index 878fd31..d94500a 100644 --- a/src/services/file_cache.py +++ b/src/services/file_cache.py @@ -128,6 +128,21 @@ class FileCache: return f"{url_hash}{ext}" + def _normalize_cache_error(self, error: Exception) -> str: + """整理缓存错误,避免将底层命令异常直接暴露给用户。""" + if isinstance(error, FileNotFoundError): + missing_name = Path(getattr(error, "filename", "") or "curl").name or "curl" + return f"本机未安装 {missing_name}" + + message = str(error or "").strip() + if not message: + return "未知错误" + + if message.startswith("Failed to cache file:"): + message = message.split(":", 1)[1].strip() or "未知错误" + + return message + async def download_and_cache(self, url: str, media_type: str) -> str: """ Download file from URL and cache it locally @@ -281,13 +296,22 @@ class FileCache: error_msg = result.stderr.decode('utf-8', errors='ignore') if result.stderr else "Unknown error" raise Exception(f"curl command failed: {error_msg}") - except Exception as e: + except FileNotFoundError as e: + normalized_error = self._normalize_cache_error(e) debug_logger.log_error( error_message=f"Failed to download file: {str(e)}", status_code=0, response_text=str(e) ) - raise Exception(f"Failed to cache file: {str(e)}") + raise Exception(normalized_error) from e + except Exception as e: + normalized_error = self._normalize_cache_error(e) + debug_logger.log_error( + error_message=f"Failed to download file: {str(e)}", + status_code=0, + response_text=str(e) + ) + raise Exception(normalized_error) from e async def cache_base64_image(self, base64_data: str, resolution: str = "") -> str: """ diff --git a/src/services/generation_handler.py b/src/services/generation_handler.py index 7f27cef..d81ce47 100644 --- a/src/services/generation_handler.py +++ b/src/services/generation_handler.py @@ -1252,7 +1252,8 @@ class GenerationHandler: except Exception as e: debug_logger.log_error(f"Failed to cache {resolution_name} image: {str(e)}") if stream: - yield self._create_stream_chunk(f"⚠️ 缓存失败: {str(e)},返回 base64...\n") + cache_error = self._normalize_error_message(e, max_length=120) + yield self._create_stream_chunk(f"⚠️ 缓存失败: {cache_error},返回 base64...\n") # 缓存未启用或缓存失败,返回 base64 格式 base64_url = f"data:image/jpeg;base64,{encoded_image}" @@ -1297,29 +1298,12 @@ class GenerationHandler: if image_trace is not None: image_trace["upsample_ms"] = int((time.time() - upsample_started_at) * 1000) - # 缓存图片 (如果启用) + # 1K 原图统一直接返回官方直链,避免额外下载缓存依赖 curl/wget。 local_url = image_url - cache_started_at = time.time() - if config.cache_enabled: - await self._update_request_log_progress(request_log_state, token_id=token.id, status_text="caching_image", progress=92) - try: - if stream: - yield self._create_stream_chunk("缓存图片中...\n") - cached_filename = await self.file_cache.download_and_cache(image_url, "image") - local_url = f"{self._get_base_url()}/tmp/{cached_filename}" - if stream: - yield self._create_stream_chunk("✅ 图片缓存成功,准备返回缓存地址...\n") - except Exception as e: - debug_logger.log_error(f"Failed to cache image: {str(e)}") - # 缓存失败不影响结果返回,使用原始URL - local_url = image_url - if stream: - yield self._create_stream_chunk(f"⚠️ 缓存失败: {str(e)}\n正在返回源链接...\n") - else: - if stream: - yield self._create_stream_chunk("缓存已关闭,正在返回源链接...\n") + if stream: + yield self._create_stream_chunk("正在返回官方图片链接...\n") if image_trace is not None: - image_trace["cache_image_ms"] = int((time.time() - cache_started_at) * 1000) + image_trace["cache_image_ms"] = 0 # 返回结果 # 存储URL用于日志记录 @@ -1728,7 +1712,8 @@ class GenerationHandler: # 缓存失败不影响结果返回,使用原始URL local_url = video_url if stream: - yield self._create_stream_chunk(f"⚠️ 缓存失败: {str(e)}\n正在返回源链接...\n") + cache_error = self._normalize_error_message(e, max_length=120) + yield self._create_stream_chunk(f"⚠️ 缓存失败: {cache_error}\n正在返回源链接...\n") else: if stream: yield self._create_stream_chunk("缓存已关闭,正在返回源链接...\n") diff --git a/static/manage.html b/static/manage.html index 16a3ba0..5df9bd7 100644 --- a/static/manage.html +++ b/static/manage.html @@ -9,6 +9,7 @@ @keyframes slide-up{from{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}} .animate-slide-up{animation:slide-up .3s ease-out} .tab-btn{transition:all .2s ease} + .line-clamp-2{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}