From 9c8050e77c7a775f6f503bb8527d643dbd62c80d Mon Sep 17 00:00:00 2001 From: craftingmod Date: Wed, 2 Sep 2026 22:48:08 +0900 Subject: [PATCH 1/2] Chore: ensure cleanup when `future.result` raise error in MTMDChatHandler --- llama_cpp/llama_multimodal.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/llama_cpp/llama_multimodal.py b/llama_cpp/llama_multimodal.py index 1c7d47bdd..8a0931754 100644 --- a/llama_cpp/llama_multimodal.py +++ b/llama_cpp/llama_multimodal.py @@ -926,9 +926,16 @@ def _create_bitmap_func(idx: int, item: dict): max_workers = min(llama.n_threads, len(media_items)) with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: futures = [executor.submit(_create_bitmap_func, i, item) for i, item in enumerate(media_items)] + + decode_error = None for future in concurrent.futures.as_completed(futures): - idx, bitmap, video_ctx = future.result() + try: + idx, bitmap, video_ctx = future.result() + except Exception as exc: + if decode_error is None: + decode_error = exc + continue bitmaps[idx] = bitmap bitmap_cleanup.append(bitmap) @@ -936,6 +943,9 @@ def _create_bitmap_func(idx: int, item: dict): if video_ctx: video_cleanup.append(video_ctx) + if decode_error is not None: + raise decode_error + # Strict validation: Abort if any thread failed to decode its assigned media if any(b is None for b in bitmaps): raise RuntimeError(f"{self.log_prefix}(_create_bitmap_func): Failed to decode one or more media files.") From 6052315b4236585a7d00baa1a17f631b5212a0da Mon Sep 17 00:00:00 2001 From: craftingmod Date: Thu, 3 Sep 2026 03:10:06 +0900 Subject: [PATCH 2/2] chore(mtmd): add comment to `_process_mtmd_prompt` --- llama_cpp/llama_multimodal.py | 1 + 1 file changed, 1 insertion(+) diff --git a/llama_cpp/llama_multimodal.py b/llama_cpp/llama_multimodal.py index 8a0931754..afce173db 100644 --- a/llama_cpp/llama_multimodal.py +++ b/llama_cpp/llama_multimodal.py @@ -930,6 +930,7 @@ def _create_bitmap_func(idx: int, item: dict): decode_error = None for future in concurrent.futures.as_completed(futures): + # Ensure inserting all bitmap/video_ctx into cleanup array except decoding error try: idx, bitmap, video_ctx = future.result() except Exception as exc: