This is an automated email from the ASF dual-hosted git repository.

gopidesupavan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new a4b6b77e683 add .md file support in LLMFileAnalysisOperator (#71611)
a4b6b77e683 is described below

commit a4b6b77e6832a0047d6857544a927b3108e7ed94
Author: Jeff(Wei-Hao) Lu <[email protected]>
AuthorDate: Sun Aug 23 18:54:59 2026 +0800

    add .md file support in LLMFileAnalysisOperator (#71611)
---
 .../common/ai/docs/operators/llm_file_analysis.rst |  4 ++--
 .../providers/common/ai/utils/file_analysis.py     |  5 +++--
 .../unit/common/ai/utils/test_file_analysis.py     | 24 ++++++++++++++++++++++
 3 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/providers/common/ai/docs/operators/llm_file_analysis.rst 
b/providers/common/ai/docs/operators/llm_file_analysis.rst
index 8b2733ab05a..c60435aa906 100644
--- a/providers/common/ai/docs/operators/llm_file_analysis.rst
+++ b/providers/common/ai/docs/operators/llm_file_analysis.rst
@@ -153,10 +153,10 @@ This operator also inherits ``LLMOperator``'s HITL review 
parameters --
 Supported Formats
 -----------------
 
-- Text-like: ``.log``, ``.json``, ``.csv``, ``.parquet``, ``.avro``
+- Text-like: ``.log``, ``.txt``, ``.md``, ``.json``, ``.csv``, ``.parquet``, 
``.avro``
 - Multimodal: ``.png``, ``.jpg``, ``.jpeg``, ``.pdf`` when ``multi_modal=True``
 - Gzip-compressed text inputs are supported for ``.log.gz``, ``.json.gz``, and
-  ``.csv.gz``.
+  ``.csv.gz``, ``.txt.gz``, and ``.md.gz``.
 - Gzip is not supported for ``.parquet``, ``.avro``, image, or PDF inputs.
 
 Parquet and Avro readers require their corresponding optional extras:
diff --git 
a/providers/common/ai/src/airflow/providers/common/ai/utils/file_analysis.py 
b/providers/common/ai/src/airflow/providers/common/ai/utils/file_analysis.py
index 38c3d6f1492..6f6366b515e 100644
--- a/providers/common/ai/src/airflow/providers/common/ai/utils/file_analysis.py
+++ b/providers/common/ai/src/airflow/providers/common/ai/utils/file_analysis.py
@@ -49,13 +49,14 @@ SUPPORTED_FILE_FORMATS: tuple[str, ...] = (
     "jpg",
     "json",
     "log",
+    "md",
     "parquet",
     "pdf",
     "png",
     "txt",
 )
 
-_TEXT_LIKE_FORMATS = frozenset({"csv", "json", "log", "avro", "parquet", 
"txt"})
+_TEXT_LIKE_FORMATS = frozenset({"csv", "json", "log", "avro", "parquet", 
"txt", "md"})
 _MULTI_MODAL_FORMATS = frozenset({"jpeg", "jpg", "pdf", "png"})
 _COMPRESSION_SUFFIXES = {
     "bz2": "bzip2",
@@ -64,7 +65,7 @@ _COMPRESSION_SUFFIXES = {
     "xz": "xz",
     "zst": "zstd",
 }
-_GZIP_SUPPORTED_FORMATS = frozenset({"csv", "json", "log", "txt"})
+_GZIP_SUPPORTED_FORMATS = frozenset({"csv", "json", "log", "txt", "md"})
 _TEXT_SAMPLE_HEAD_CHARS = 8_000
 _TEXT_SAMPLE_TAIL_CHARS = 2_000
 _MEDIA_TYPES = {
diff --git 
a/providers/common/ai/tests/unit/common/ai/utils/test_file_analysis.py 
b/providers/common/ai/tests/unit/common/ai/utils/test_file_analysis.py
index 2b524998b60..bba7f56111a 100644
--- a/providers/common/ai/tests/unit/common/ai/utils/test_file_analysis.py
+++ b/providers/common/ai/tests/unit/common/ai/utils/test_file_analysis.py
@@ -90,6 +90,28 @@ class TestBuildFileAnalysisRequest:
         assert "first line" in request.user_content
         assert "format=txt" in request.user_content
 
+    def test_markdown_file_analysis(self, tmp_path):
+        path = tmp_path / "notes.md"
+        path.write_text("# Notes\n\nFirst finding.\n", encoding="utf-8")
+
+        request = build_file_analysis_request(
+            file_path=str(path),
+            file_conn_id=None,
+            prompt="Summarize the notes",
+            multi_modal=False,
+            max_files=20,
+            max_file_size_bytes=1024,
+            max_total_size_bytes=2048,
+            max_text_chars=500,
+            sample_rows=10,
+        )
+
+        assert isinstance(request, FileAnalysisRequest)
+        assert request.resolved_paths == [str(path)]
+        assert "Summarize the notes" in request.user_content
+        assert "First finding" in request.user_content
+        assert "format=md" in request.user_content
+
     def test_file_conn_id_overrides_embedded_connection(self, tmp_path):
         path = tmp_path / "data.json"
         path.write_text('{"status": "ok"}', encoding="utf-8")
@@ -360,6 +382,8 @@ class TestFileAnalysisHelpers:
             ("app", "log", None),
             ("notes.txt", "txt", None),
             ("notes.txt.gz", "txt", "gzip"),
+            ("notes.md", "md", None),
+            ("notes.md.gz", "md", "gzip"),
         ],
     )
     def test_detect_file_format(self, tmp_path, filename, expected_format, 
expected_compression):

Reply via email to