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):