From 6c61ab25d7dc143c3ff8a9d7780bdf32ed0e6cd6 Mon Sep 17 00:00:00 2001 From: InphinitiZ Date: Tue, 26 May 2026 23:31:47 +0800 Subject: [PATCH] fix(gateway): match uppercase media extensions in MEDIA: pattern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The MEDIA: regex in extract_media hardcoded lowercase extensions (png, jpe?g, mp4, ...) with no re.IGNORECASE flag, so paths emitted by the agent with uppercase suffixes (e.g. MEDIA:/.../IMG_0001.JPG from a folder of camera-style filenames) silently leaked through as plain text instead of being delivered as media attachments. Add re.IGNORECASE to media_pattern only — the regex body itself is unchanged. extract_local_files already uses re.IGNORECASE on its bare-path matcher, so no change needed there. --- gateway/platforms/base.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gateway/platforms/base.py b/gateway/platforms/base.py index d396015468862..ce87c1c77c09f 100644 --- a/gateway/platforms/base.py +++ b/gateway/platforms/base.py @@ -2412,8 +2412,10 @@ def extract_media(content: str) -> Tuple[List[Tuple[str, bool]], str]: # Extract MEDIA: tags, allowing optional whitespace after the colon # and quoted/backticked paths for LLM-formatted outputs. + # IGNORECASE so uppercase extensions (.JPG, .MP4, ...) are matched too. media_pattern = re.compile( - r'''[`"']?MEDIA:\s*(?P`[^`\n]+`|"[^"\n]+"|'[^'\n]+'|(?:~/|/)\S+(?:[^\S\n]+\S+)*?\.(?:png|jpe?g|gif|webp|mp4|mov|avi|mkv|webm|ogg|opus|mp3|wav|m4a|flac|epub|pdf|zip|rar|7z|docx?|xlsx?|pptx?|txt|csv|apk|ipa)(?=[\s`"',;:)\]}]|$))[`"']?''' + r'''[`"']?MEDIA:\s*(?P`[^`\n]+`|"[^"\n]+"|'[^'\n]+'|(?:~/|/)\S+(?:[^\S\n]+\S+)*?\.(?:png|jpe?g|gif|webp|mp4|mov|avi|mkv|webm|ogg|opus|mp3|wav|m4a|flac|epub|pdf|zip|rar|7z|docx?|xlsx?|pptx?|txt|csv|apk|ipa)(?=[\s`"',;:)\]}]|$))[`"']?''', + re.IGNORECASE, ) for match in media_pattern.finditer(content): path = match.group("path").strip()