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

kaxil 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 9e001828094 Support `.txt` files in `LLMFileAnalysisOperator` (#70431)
9e001828094 is described below

commit 9e001828094a9103112d93e3762b65ef91cd93a7
Author: Jyun-An Chen <[email protected]>
AuthorDate: Tue Jul 28 06:30:19 2026 +0800

    Support `.txt` files in `LLMFileAnalysisOperator` (#70431)
---
 .../providers/common/ai/utils/file_analysis.py     |  5 +++--
 .../unit/common/ai/utils/test_file_analysis.py     | 24 ++++++++++++++++++++++
 2 files changed, 27 insertions(+), 2 deletions(-)

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 f962119616e..38c3d6f1492 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
@@ -52,9 +52,10 @@ SUPPORTED_FILE_FORMATS: tuple[str, ...] = (
     "parquet",
     "pdf",
     "png",
+    "txt",
 )
 
-_TEXT_LIKE_FORMATS = frozenset({"csv", "json", "log", "avro", "parquet"})
+_TEXT_LIKE_FORMATS = frozenset({"csv", "json", "log", "avro", "parquet", 
"txt"})
 _MULTI_MODAL_FORMATS = frozenset({"jpeg", "jpg", "pdf", "png"})
 _COMPRESSION_SUFFIXES = {
     "bz2": "bzip2",
@@ -63,7 +64,7 @@ _COMPRESSION_SUFFIXES = {
     "xz": "xz",
     "zst": "zstd",
 }
-_GZIP_SUPPORTED_FORMATS = frozenset({"csv", "json", "log"})
+_GZIP_SUPPORTED_FORMATS = frozenset({"csv", "json", "log", "txt"})
 _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 32091ffa59b..2b524998b60 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
@@ -68,6 +68,28 @@ class TestBuildFileAnalysisRequest:
         assert "first line" in request.user_content
         assert "format=log" in request.user_content
 
+    def test_txt_file_analysis(self, tmp_path):
+        path = tmp_path / "notes.txt"
+        path.write_text("first line\nsecond line\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 line" in request.user_content
+        assert "format=txt" 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")
@@ -336,6 +358,8 @@ class TestFileAnalysisHelpers:
             ("dashboard.jpg", "jpg", None),
             ("report.pdf", "pdf", None),
             ("app", "log", None),
+            ("notes.txt", "txt", None),
+            ("notes.txt.gz", "txt", "gzip"),
         ],
     )
     def test_detect_file_format(self, tmp_path, filename, expected_format, 
expected_compression):

Reply via email to