Skip to content

fix(api): preserve stored text cells when extracting legacy .xls files - #44666

Open
yuyongyan29-dev wants to merge 7 commits into
langgenius:mainfrom
yuyongyan29-dev:fix/xls-preserve-stored-text-cells
Open

yuyongyan29-dev wants to merge 7 commits into
langgenius:mainfrom
yuyongyan29-dev:fix/xls-preserve-stored-text-cells

Conversation

@yuyongyan29-dev

@yuyongyan29-dev yuyongyan29-dev commented Oct 23, 2026 •

Copy link
Copy Markdown

Summary

Fixes #44658

Legacy .xls imports ran text cells through pandas' number inference, so 00123 became 123 and 1e3 became 1000.0. The .xls branch of ExcelExtractor now checks the xlrd cell type and keeps the stored text for text cells. Numeric cells are unchanged, and if the workbook isn't available it falls back to the old behavior. .xlsx goes through openpyxl and doesn't have this problem.

Tests: added a regression test and tests against a real .xls fixture (thanks @PointerL). test_excel_extractor.py: 14 passed. With the fix reverted, 3 of them fail.

Screenshots

N/A, backend only.

Checklist

  • This change requires a documentation update, included: Dify Document
  • I understand that this PR may be closed in case there was no previous discussion or issues. (This doesn't apply to typos!)
  • I've verified the change and added or updated tests where meaningful regression risk justifies coverage.
  • I've updated the documentation accordingly.
  • I ran make lint && make type-check (backend) and vp staged (frontend) to appease the lint gods

I ran the make lint steps one by one because make wasn't available, and they all pass. pyrefly reports no errors on the changed file. The repo-wide type-check fails locally only on optional vector-DB imports that I don't have installed.

I used AI assistance for this change and checked the results myself.

From Grok Bot

Added regression tests to ensure ExcelExtractor correctly handles .xls files with stored text cells and maintains legacy behavior when xlrd is not used.
@github-actions github-actions Bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Oct 23, 2026

PointerL commented Oct 23, 2026 •

Copy link
Copy Markdown

Thanks for working on the issue I reported in #44658. I had also prepared a local fix before noticing this PR during the final duplicate check, and would like to coordinate the work.

My implementation passes dtype=object to the existing ExcelFile.parse call, preventing numeric inference before serialization. I added a 5,632-byte real BIFF .xls fixture and regression tests: the extractor suite has 2 failures and 9 passes before the change, and 11 passes afterward. The fixture covers the reported text values, native numbers/booleans/dates, blank cells and rows, quotes, two worksheets, and source metadata.

One compatibility difference is worth deciding explicitly: dtype=object also keeps native booleans as True/False and integers in columns containing blanks as 7, where the previous output could be 1.0/0.0 and 7.0. Default NA-marker handling remains unchanged in that approach.

Would you and the maintainers prefer incorporating the real-workbook regression coverage here, and considering the smaller parsing change, rather than having two competing fixes? I can provide the fixture and tests for a coordinated contribution.

AI tools assisted with this contribution. The reported local checks were executed; I have not run this PR's test suite.

Update: I compared the actual extractor implementations on real BIFF workbooks at upstream 2b35144b2098f8f6ad6af31bf72356a42f813d58 and this PR's f2245ff6667bc443536a09daa2458ebf4f104d90. Both fixes preserve the reported numeric-looking text. The comparison also confirms the native integer/boolean output difference described above.

There is an additional NA-policy difference to consider: for rows A1 | N/A, blank-code | N/A, and A2 | ok, the current PR restores N/A in the first row but still drops the second row through dropna(how="all"). The baseline and the dtype=object change both omit N/A under the existing NA policy. This was a focused real-file comparison, not a run of this PR's test suite.

The complete local patch below includes the real workbook fixture. It is based on upstream 2b35144b2098f8f6ad6af31bf72356a42f813d58, not on this PR; the parsing change and native-value expectations need to be reconciled before reusing it here. I am sharing it for coordinated review, without opening a competing PR.

Complete local patch, including the binary BIFF fixture (git apply compatible)
diff --git a/api/core/rag/extractor/excel_extractor.py b/api/core/rag/extractor/excel_extractor.py
index 5d5316dc..f978167c 100644
--- a/api/core/rag/extractor/excel_extractor.py
+++ b/api/core/rag/extractor/excel_extractor.py
@@ -136,7 +136,8 @@ class ExcelExtractor(BaseExtractor):
         elif file_extension == ".xls":
             excel_file = pd.ExcelFile(self._file_path, engine="xlrd")
             for excel_sheet_name in excel_file.sheet_names:
-                df = excel_file.parse(sheet_name=excel_sheet_name)
+                # Preserve stored text such as identifiers with leading zeros instead of inferring numeric columns.
+                df = excel_file.parse(sheet_name=excel_sheet_name, dtype=object)
                 df.dropna(how="all", inplace=True)
 
                 for _, series_row in df.iterrows():
diff --git a/api/tests/fixtures/rag/text_identifiers.xls b/api/tests/fixtures/rag/text_identifiers.xls
new file mode 100644
index 0000000000000000000000000000000000000000..be1fa45e32569256d85c62174c9badc6c534cc57
GIT binary patch
literal 5632
zcmeHLO=w(I6#m|unRH_F_tI3fLKp^&THBJJDpF`Ct*NDpgjNgwAn41?lMI=>DKnE`
zU1+psDG06<H-##=iMsF)Me5Fl60r+G5E2D9T?q;<TF37@w-Y8&!-x=Une%w(-gEA`
z=iGbFx##_Svl6Uccz@3tHo*}j@JGE99Zh_X{mus62aeb4A{%X*eX`nc19_k`%|Ldf
z@M-r~I}}UBdksF`OMXEN{K)%BoW)c*jxyT_$7~Iur!^e*lJH2s$-4))+q(J<=MC>N
z{I1D<W_a8<uNXdzeyn;=U?n%T_W^1Hbv@>1ZLEjb!$&sfd*h5?H@>7y{e@SR?i@|w
zXr&mIZm@yDWEU=iAw3brQ6(%5CU3)A*abXJ*grYBe_|ptGjnKe?ohS5iUG#`B7Uo9
zfM2z1!KF-_zrB9&kO6*|O@Z_O4#ws0_-RISGygR|2`r-iH1pZR5~F>I3}7ct7NWRT
ze5M#xs!L38-;R1WrovirA<8U-rTM6O70b*6@U#G&_F%aX^#G6Li*9QEO!RDRComD^
zi*sQ~6zl!z`H+fh=Qv@iT#Hh`@bJj!SOOS{#zc)A7#;2cW}-|rEEY1^nPS$24&HY^
zg+`sw*nxw?EIidHUycjx9GxrA$2BhUcpOfbq5`!~gr@yiDU4^S;A|-@#<y^#u734x
zs9)W7s=J5_=(T=eXS)w+Tz%)4Zzrcu<(@LmA~^yb^*iM~)bXNba56Vf;35gMh`l!B
zUc)a*26tG0kKqBzuvQJ7+I_wA(0P-2*+z$GXUyPo?yjc(-Rv)2IsNhA(oea2*k3-e
z_T0eocexA5@=05u4PEE4&)es{@w(uXT%+|EDOJZG47;k>To2PeD?1^@JsEhtxCZ$Q
z2n;*QBc=U2$|ohQj!KY{2OO0oB_Bz%W^C3hUO=vs*UAHXo@ln}cc6NN=Y3JqJh(0?
z&5DFH%lc-`;sy5ZAzku)U^{V?G&3_zvu~P*NVzd-X8z%b-;WQa2IE54VLLKN9=jPc
zsGGZzk9B$iK9?JmqS3ofDbC76C%IJyxx7%El@}>LO}#ER-H6Y8&#o}`eh2x|E1e!Q
z@}G0(bJ}*f6HrQ5(sE2W-JD~xAYOngY-BrOwt4<p2NKlLkCPuPeEs&~&*QS6;N|Qm
z%)ZW(Wf<GPW|%SCsO^Ea2ihKJd!X%s|B(mu&ZZ}%o_=~$(c7E;0q9Ll|8=hMR@;V~
z(*qBq%&UeBjw5DU!8u00b+{ENui+WxQY+B-Unto}X}yA3OxrqUTbaH=hTlNz_O*@;
bgIf{q<7g|1R>%Ie{pS6*YGez!|78D90I*1#

literal 0
HcmV?d00001

diff --git a/api/tests/unit_tests/core/rag/extractor/test_excel_extractor.py b/api/tests/unit_tests/core/rag/extractor/test_excel_extractor.py
index 5b87121f..5309d22b 100644
--- a/api/tests/unit_tests/core/rag/extractor/test_excel_extractor.py
+++ b/api/tests/unit_tests/core/rag/extractor/test_excel_extractor.py
@@ -1,3 +1,4 @@
+from pathlib import Path
 from types import SimpleNamespace
 
 import pandas as pd
@@ -247,7 +248,7 @@ class TestExcelExtractor:
         class FakeExcelFile:
             sheet_names = ["Sheet1"]
 
-            def parse(self, sheet_name):
+            def parse(self, sheet_name, dtype=None):
                 assert sheet_name == "Sheet1"
                 return pd.DataFrame([{"A": "x", "B": 1}, {"A": None, "B": None}])
 
@@ -264,7 +265,7 @@ class TestExcelExtractor:
         class FakeExcelFile:
             sheet_names = ["Sheet1"]
 
-            def parse(self, sheet_name):
+            def parse(self, sheet_name, dtype=None):
                 return pd.DataFrame([{"note": 'he said "hi"', "plain": "text"}])
 
         monkeypatch.setattr(pd, "ExcelFile", lambda path, engine=None: FakeExcelFile())
@@ -275,6 +276,29 @@ class TestExcelExtractor:
         assert len(docs) == 1
         assert docs[0].page_content == '"note":"he said \\"hi\\"";"plain":"text"'
 
+    def test_extract_xls_preserves_numeric_looking_text(self):
+        # Real BIFF cells are needed here: a mocked DataFrame cannot expose pandas' type inference.
+        file_path = Path(__file__).resolve().parents[4] / "fixtures" / "rag" / "text_identifiers.xls"
+
+        docs = ExcelExtractor(str(file_path)).extract()
+
+        assert [doc.page_content for doc in docs[:2]] == [
+            '"Code":"00123";"ScientificText":"1e3";"DecimalText":"01.20";"Quantity":"7";"Note":"he said \\"hi\\""',
+            '"Code":"00456";"ScientificText":"2e3";"DecimalText":"03.40";"Quantity":"9";"Note":"second"',
+        ]
+        assert all(doc.metadata == {"source": str(file_path)} for doc in docs)
+
+    def test_extract_xls_preserves_native_values_and_skips_empty_rows(self):
+        file_path = Path(__file__).resolve().parents[4] / "fixtures" / "rag" / "text_identifiers.xls"
+
+        docs = ExcelExtractor(str(file_path)).extract()
+
+        assert len(docs) == 4
+        assert [doc.page_content for doc in docs[2:]] == [
+            '"Amount":"7";"Enabled":"True";"Date":"2026-01-02 00:00:00";"Note":"he said \\"hi\\""',
+            '"Amount":"2.5";"Enabled":"False";"Date":"2026-03-04 05:06:07";"Note":"plain"',
+        ]
+
     def test_extract_unsupported_extension_raises(self):
         extractor = ExcelExtractor("/tmp/sample.txt")
 

@yuyongyan29-dev

Copy link
Copy Markdown
Author

@PointerL Thank you — and agreed, let's coordinate rather than run two competing fixes.

I'd suggest we keep this PR's approach as the base: restoring cell values from xlrd's stored types only touches cells that were actually stored as text, so native numbers, booleans and dates keep their previous serialized output exactly (1.0/0.0, 7.0, ...). The dtype=object route is smaller, but as you noted it changes that output for booleans and for integer columns containing blanks, which could surprise downstream consumers.

Your real-BIFF fixture and regression tests sound strictly better than synthetic coverage. Please share them (attach here, or link a gist or branch) and I'll fold them into this PR, adapting cases where needed, with a Co-authored-by credit for you on the commit. If any of your cases behave differently under the stored-type approach, I'll flag it here explicitly so we and the maintainers can decide with full information.

AI assistance disclosure: this PR and this reply were prepared with AI assistance; the test results cited in the PR were actually executed.

Copy link
Copy Markdown

@yuyongyan29-dev Agreed. Please keep your stored-text restoration approach so the existing numeric and boolean output remains unchanged.

The real BIFF .xls fixture and regression tests are already included in the expandable complete patch in my earlier comment. Please incorporate the fixture and tests with your implementation, adapting the native-value expectations to retain 7.0 and 1.0/0.0. The patch also contains my alternative production change; for this collaboration, please use only the fixture and test changes.

Please add the following credit to the commit incorporating my contribution:

Co-authored-by: PointerL <124577547+PointerL@users.noreply.github.com>

If any other cases behave differently, please flag them here so we can resolve them together. Thanks!

Merge only the fixture and test changes from PointerL's coordinated contribution (PR comment 6368844330); his alternative dtype=object production change is intentionally not included. Native-value expectations follow this PR's stored-type behavior.

Co-authored-by: PointerL <124577547+PointerL@users.noreply.github.com>
Merge only the fixture and test changes from PointerL's coordinated contribution (PR comment 6368844330); his alternative dtype=object production change is intentionally not included. Native-value expectations follow this PR's stored-type behavior.

Co-authored-by: PointerL <124577547+PointerL@users.noreply.github.com>
@yuyongyan29-dev

Copy link
Copy Markdown
Author

@PointerL 已按约定并入你的 fixture 和测试:新增 api/tests/fixtures/rag/text_identifiers.xls,并更新 api/tests/unit_tests/core/rag/extractor/test_excel_extractor.py,仅包含 fixture + 测试,未动你的 dtype=object 生产改动;两笔提交均已按你给的署名行署名(Co-authored-by: PointerL 124577547+PointerL@users.noreply.github.com),原生值预期已按本 PR 的 stored-type 行为适配。感谢你的协作!

@crazywoola
crazywoola enabled auto-merge October 30, 2026 04:26
@crazywoola
crazywoola disabled auto-merge October 30, 2026 04:27
@crazywoola
crazywoola enabled auto-merge October 30, 2026 04:27
@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Pyrefly Diff

base → PR
--- /tmp/pyrefly_base.txt	2026-10-30 13:12:05.905621105 +0000
+++ /tmp/pyrefly_pr.txt	2026-10-30 13:11:47.705433297 +0000
@@ -162,28 +162,8 @@
   --> providers/vdb/vdb-tencent/tests/e2e_tests/conftest.py:95:33
 ERROR Object of class `ModuleType` has no attribute `VectorType` [missing-attribute]
   --> providers/vdb/vdb-tidb-vector/tests/unit_tests/src/dify_vdb_tidb_vector/test_tidb_vector.py:77:5
-ERROR Unpacked keyword argument `str` is not assignable to parameter `port` with type `int | None` in function `qdrant_client.qdrant_client.QdrantClient.__init__` [bad-argument-type]
-  --> providers/vdb/vdb-tidb-on-qdrant/src/dify_vdb_tidb_on_qdrant/tidb_on_qdrant_vector.py:93:51
-ERROR Unpacked keyword argument `str` is not assignable to parameter `grpc_port` with type `int` in function `qdrant_client.qdrant_client.QdrantClient.__init__` [bad-argument-type]
-  --> providers/vdb/vdb-tidb-on-qdrant/src/dify_vdb_tidb_on_qdrant/tidb_on_qdrant_vector.py:93:51
-ERROR Unpacked keyword argument `str` is not assignable to parameter `prefer_grpc` with type `bool` in function `qdrant_client.qdrant_client.QdrantClient.__init__` [bad-argument-type]
-  --> providers/vdb/vdb-tidb-on-qdrant/src/dify_vdb_tidb_on_qdrant/tidb_on_qdrant_vector.py:93:51
-ERROR Unpacked keyword argument `str` is not assignable to parameter `https` with type `bool | None` in function `qdrant_client.qdrant_client.QdrantClient.__init__` [bad-argument-type]
-  --> providers/vdb/vdb-tidb-on-qdrant/src/dify_vdb_tidb_on_qdrant/tidb_on_qdrant_vector.py:93:51
-ERROR Unpacked keyword argument `str` is not assignable to parameter `timeout` with type `int | None` in function `qdrant_client.qdrant_client.QdrantClient.__init__` [bad-argument-type]
-  --> providers/vdb/vdb-tidb-on-qdrant/src/dify_vdb_tidb_on_qdrant/tidb_on_qdrant_vector.py:93:51
-ERROR Unpacked keyword argument `str` is not assignable to parameter `force_disable_check_same_thread` with type `bool` in function `qdrant_client.qdrant_client.QdrantClient.__init__` [bad-argument-type]
-  --> providers/vdb/vdb-tidb-on-qdrant/src/dify_vdb_tidb_on_qdrant/tidb_on_qdrant_vector.py:93:51
-ERROR Unpacked keyword argument `str` is not assignable to parameter `grpc_options` with type `dict[str, Any] | None` in function `qdrant_client.qdrant_client.QdrantClient.__init__` [bad-argument-type]
-  --> providers/vdb/vdb-tidb-on-qdrant/src/dify_vdb_tidb_on_qdrant/tidb_on_qdrant_vector.py:93:51
-ERROR Unpacked keyword argument `str` is not assignable to parameter `auth_token_provider` with type `(() -> Awaitable[str]) | (() -> str) | None` in function `qdrant_client.qdrant_client.QdrantClient.__init__` [bad-argument-type]
-  --> providers/vdb/vdb-tidb-on-qdrant/src/dify_vdb_tidb_on_qdrant/tidb_on_qdrant_vector.py:93:51
-ERROR `None` is not subscriptable [unsupported-operation]
-   --> providers/vdb/vdb-tidb-on-qdrant/src/dify_vdb_tidb_on_qdrant/tidb_service.py:152:20
-ERROR `None` is not subscriptable [unsupported-operation]
-   --> providers/vdb/vdb-tidb-on-qdrant/src/dify_vdb_tidb_on_qdrant/tidb_service.py:153:35
-ERROR Argument `Any | None` is not assignable to parameter `cluster_response` with type `Mapping[str, Any]` in function `TidbService.extract_qdrant_endpoint` [bad-argument-type]
-   --> providers/vdb/vdb-tidb-on-qdrant/src/dify_vdb_tidb_on_qdrant/tidb_service.py:154:75
+WARN Cannot find type stubs for module `xlrd` [untyped-import]
+   --> core/rag/extractor/excel_extractor.py:184:20
 ERROR Argument `Literal['normal']` is not assignable to parameter `status` with type `ConversationStatus | SQLCoreOperations[ConversationStatus]` in function `models.model.Conversation.__init__` [bad-argument-type]
   --> tests/e2e_tests/containers/controllers/console/app/test_chat_conversation_status_count_api.py:75:16
 ERROR Argument `Literal['app-run']` is not assignable to parameter `triggered_from` with type `SQLCoreOperations[WorkflowRunTriggeredFrom] | WorkflowRunTriggeredFrom` in function `models.workflow.WorkflowRun.__init__` [bad-argument-type]
@@ -537,23 +517,23 @@
 ERROR Argument `list[SimpleNamespace]` is not assignable to parameter `dsl_dependencies` with type `list[PluginDependency]` in function `services.app_dsl_service.AppDslService.get_leaked_dependencies` [bad-argument-type]
     --> tests/e2e_tests/containers/services/test_app_dsl_service.py:1618:73
 ERROR Object of class `NoneType` has no attribute `id` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_app_generate_service.py:196:38
+   --> tests/e2e_tests/containers/services/test_app_generate_service.py:199:38
 ERROR Argument `str | None` is not assignable to parameter `created_by` with type `SQLCoreOperations[str] | str` in function `models.workflow.Workflow.__init__` [bad-argument-type]
-   --> tests/e2e_tests/containers/services/test_app_generate_service.py:223:24
+   --> tests/e2e_tests/containers/services/test_app_generate_service.py:226:24
 ERROR Object of class `NoneType` has no attribute `id` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_app_generate_service.py:497:23
+   --> tests/e2e_tests/containers/services/test_app_generate_service.py:500:23
 ERROR Argument `Literal['invalid_mode']` is not assignable to parameter `value` with type `AppMode | SQLCoreOperations[AppMode]` in function `sqlalchemy.orm.base.Mapped.__set__` [bad-argument-type]
-   --> tests/e2e_tests/containers/services/test_app_generate_service.py:576:20
+   --> tests/e2e_tests/containers/services/test_app_generate_service.py:579:20
 WARN Module `sqlalchemy.exc` exists, but was not imported explicitly. You are relying on other modules to load it. [implicit-import]
-   --> tests/e2e_tests/containers/services/test_app_generate_service.py:583:41
+   --> tests/e2e_tests/containers/services/test_app_generate_service.py:586:41
 ERROR Argument `dict[str, dict[str, str]]` is not assignable to parameter `args` with type `LoopNodeRunPayload` in function `services.app_generate_service.AppGenerateService.generate_single_loop` [bad-argument-type]
-   --> tests/e2e_tests/containers/services/test_app_generate_service.py:837:18
+   --> tests/e2e_tests/containers/services/test_app_generate_service.py:840:18
 ERROR Argument `dict[str, dict[str, str]]` is not assignable to parameter `args` with type `LoopNodeRunPayload` in function `services.app_generate_service.AppGenerateService.generate_single_loop` [bad-argument-type]
-   --> tests/e2e_tests/containers/services/test_app_generate_service.py:869:18
+   --> tests/e2e_tests/containers/services/test_app_generate_service.py:872:18
 ERROR Argument `dict[str, dict[str, str]]` is not assignable to parameter `args` with type `LoopNodeRunPayload` in function `services.app_generate_service.AppGenerateService.generate_single_loop` [bad-argument-type]
-   --> tests/e2e_tests/containers/services/test_app_generate_service.py:900:22
+   --> tests/e2e_tests/containers/services/test_app_generate_service.py:903:22
 ERROR Argument `Literal['agent-chat']` is not assignable to parameter `value` with type `AppMode | SQLCoreOperations[AppMode]` in function `sqlalchemy.orm.base.Mapped.__set__` [bad-argument-type]
-    --> tests/e2e_tests/containers/services/test_app_generate_service.py:1017:20
+    --> tests/e2e_tests/containers/services/test_app_generate_service.py:1020:20
 ERROR Object of class `NoneType` has no attribute `id` [missing-attribute]
   --> tests/e2e_tests/containers/services/test_app_service.py:86:38
 ERROR Object of class `NoneType` has no attribute `id` [missing-attribute]
@@ -749,53 +729,57 @@
 ERROR Argument `Literal['emoji']` is not assignable to parameter `icon_type` with type `IconType | SQLCoreOperations[IconType | None] | None` in function `models.model.App.__init__` [bad-argument-type]
    --> tests/e2e_tests/containers/services/test_end_user_service.py:430:27
 ERROR Object of class `NoneType` has no attribute `size` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_feature_service.py:131:20
+   --> tests/e2e_tests/containers/services/test_feature_service.py:130:20
 ERROR Object of class `NoneType` has no attribute `limit` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_feature_service.py:132:20
+   --> tests/e2e_tests/containers/services/test_feature_service.py:131:20
 ERROR Object of class `NoneType` has no attribute `size` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_feature_service.py:202:16
+   --> tests/e2e_tests/containers/services/test_feature_service.py:201:16
 ERROR Object of class `NoneType` has no attribute `limit` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_feature_service.py:203:16
+   --> tests/e2e_tests/containers/services/test_feature_service.py:202:16
 ERROR Object of class `NoneType` has no attribute `size` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_feature_service.py:511:20
+   --> tests/e2e_tests/containers/services/test_feature_service.py:510:20
 ERROR Object of class `NoneType` has no attribute `limit` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_feature_service.py:512:20
+   --> tests/e2e_tests/containers/services/test_feature_service.py:511:20
 ERROR Object of class `NoneType` has no attribute `size` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_feature_service.py:600:20
+   --> tests/e2e_tests/containers/services/test_feature_service.py:599:20
 ERROR Object of class `NoneType` has no attribute `limit` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_feature_service.py:601:20
+   --> tests/e2e_tests/containers/services/test_feature_service.py:600:20
 ERROR Object of class `NoneType` has no attribute `size` [missing-attribute]
+   --> tests/e2e_tests/containers/services/test_feature_service.py:698:20
+ERROR Object of class `NoneType` has no attribute `limit` [missing-attribute]
    --> tests/e2e_tests/containers/services/test_feature_service.py:699:20
+ERROR Object of class `NoneType` has no attribute `size` [missing-attribute]
+   --> tests/e2e_tests/containers/services/test_feature_service.py:746:16
 ERROR Object of class `NoneType` has no attribute `limit` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_feature_service.py:700:20
+   --> tests/e2e_tests/containers/services/test_feature_service.py:747:16
 ERROR Object of class `NoneType` has no attribute `size` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_feature_service.py:740:16
+   --> tests/e2e_tests/containers/services/test_feature_service.py:795:16
 ERROR Object of class `NoneType` has no attribute `limit` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_feature_service.py:741:16
+   --> tests/e2e_tests/containers/services/test_feature_service.py:796:16
 ERROR Object of class `NoneType` has no attribute `size` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_feature_service.py:857:16
+   --> tests/e2e_tests/containers/services/test_feature_service.py:912:16
 ERROR Object of class `NoneType` has no attribute `limit` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_feature_service.py:858:16
+   --> tests/e2e_tests/containers/services/test_feature_service.py:913:16
 ERROR Object of class `NoneType` has no attribute `size` [missing-attribute]
-    --> tests/e2e_tests/containers/services/test_feature_service.py:1176:16
+    --> tests/e2e_tests/containers/services/test_feature_service.py:1231:16
 ERROR Object of class `NoneType` has no attribute `limit` [missing-attribute]
-    --> tests/e2e_tests/containers/services/test_feature_service.py:1177:16
+    --> tests/e2e_tests/containers/services/test_feature_service.py:1232:16
 ERROR Object of class `NoneType` has no attribute `size` [missing-attribute]
-    --> tests/e2e_tests/containers/services/test_feature_service.py:1287:20
+    --> tests/e2e_tests/containers/services/test_feature_service.py:1342:20
 ERROR Object of class `NoneType` has no attribute `limit` [missing-attribute]
-    --> tests/e2e_tests/containers/services/test_feature_service.py:1288:20
+    --> tests/e2e_tests/containers/services/test_feature_service.py:1343:20
 ERROR Object of class `NoneType` has no attribute `size` [missing-attribute]
-    --> tests/e2e_tests/containers/services/test_feature_service.py:1496:16
+    --> tests/e2e_tests/containers/services/test_feature_service.py:1551:16
 ERROR Object of class `NoneType` has no attribute `limit` [missing-attribute]
-    --> tests/e2e_tests/containers/services/test_feature_service.py:1497:16
+    --> tests/e2e_tests/containers/services/test_feature_service.py:1552:16
 ERROR Object of class `NoneType` has no attribute `size` [missing-attribute]
-    --> tests/e2e_tests/containers/services/test_feature_service.py:1550:16
+    --> tests/e2e_tests/containers/services/test_feature_service.py:1608:16
 ERROR Object of class `NoneType` has no attribute `limit` [missing-attribute]
-    --> tests/e2e_tests/containers/services/test_feature_service.py:1551:16
+    --> tests/e2e_tests/containers/services/test_feature_service.py:1609:16
 ERROR Object of class `NoneType` has no attribute `size` [missing-attribute]
-    --> tests/e2e_tests/containers/services/test_feature_service.py:1653:16
+    --> tests/e2e_tests/containers/services/test_feature_service.py:1715:16
 ERROR Object of class `NoneType` has no attribute `limit` [missing-attribute]
-    --> tests/e2e_tests/containers/services/test_feature_service.py:1654:16
+    --> tests/e2e_tests/containers/services/test_feature_service.py:1716:16
 ERROR Argument `Literal['active']` is not assignable to parameter `status` with type `AccountStatus | SQLCoreOperations[AccountStatus]` in function `models.account.Account.__init__` [bad-argument-type]
   --> tests/e2e_tests/containers/services/test_file_service.py:67:20
 ERROR Argument `Literal['normal']` is not assignable to parameter `status` with type `SQLCoreOperations[TenantStatus] | TenantStatus` in function `models.account.Tenant.__init__` [bad-argument-type]
@@ -985,35 +969,35 @@
 ERROR Argument `Literal['normal']` is not assignable to parameter `status` with type `MessageStatus | SQLCoreOperations[MessageStatus]` in function `models.model.Message.__init__` [bad-argument-type]
   --> tests/e2e_tests/containers/services/test_message_service_extra_contents.py:44:16
 ERROR Argument `Literal['active']` is not assignable to parameter `status` with type `AccountStatus | SQLCoreOperations[AccountStatus]` in function `models.account.Account.__init__` [bad-argument-type]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:129:20
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:128:20
 ERROR Argument `Literal['normal']` is not assignable to parameter `status` with type `SQLCoreOperations[TenantStatus] | TenantStatus` in function `models.account.Tenant.__init__` [bad-argument-type]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:137:20
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:136:20
 ERROR Argument `Literal['chat']` is not assignable to parameter `mode` with type `AppMode | SQLCoreOperations[AppMode]` in function `models.model.App.__init__` [bad-argument-type]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:160:18
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:159:18
 ERROR Argument `Literal['chat']` is not assignable to parameter `mode` with type `AppMode | SQLCoreOperations[AppMode]` in function `models.model.Conversation.__init__` [bad-argument-type]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:182:18
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:181:18
 ERROR Argument `Literal['normal']` is not assignable to parameter `status` with type `ConversationStatus | SQLCoreOperations[ConversationStatus]` in function `models.model.Conversation.__init__` [bad-argument-type]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:185:20
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:184:20
 ERROR Argument `Literal['local_file']` is not assignable to parameter `transfer_method` with type `FileTransferMethod | SQLCoreOperations[FileTransferMethod]` in function `models.model.MessageFile.__init__` [bad-argument-type]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:267:29
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:266:29
 ERROR Argument `Literal['end_user']` is not assignable to parameter `created_by_role` with type `CreatorUserRole | SQLCoreOperations[CreatorUserRole]` in function `models.model.MessageFile.__init__` [bad-argument-type]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:270:29
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:269:29
 ERROR Argument `Literal['end_user']` is not assignable to parameter `created_by_role` with type `CreatorUserRole | SQLCoreOperations[CreatorUserRole]` in function `models.web.SavedMessage.__init__` [bad-argument-type]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:279:29
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:278:29
 ERROR Object of class `str` has no attribute `id` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:613:13
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:628:13
 ERROR Object of class `str` has no attribute `id` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:614:13
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:632:13
 ERROR Object of class `str` has no attribute `id` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:901:13
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:942:13
 ERROR Object of class `str` has no attribute `id` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:902:13
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:946:13
 ERROR Object of class `str` has no attribute `id` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:903:13
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:950:13
 ERROR Object of class `str` has no attribute `id` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:907:22
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:957:22
 ERROR Object of class `str` has no attribute `id` [missing-attribute]
-   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:907:52
+   --> tests/e2e_tests/containers/services/test_messages_clean_service.py:957:52
 ERROR Argument `Literal['active']` is not assignable to parameter `status` with type `AccountStatus | SQLCoreOperations[AccountStatus]` in function `models.account.Account.__init__` [bad-argument-type]
   --> tests/e2e_tests/containers/services/test_model_load_balancing_service.py:84:20
 ERROR Argument `Literal['normal']` is not assignable to parameter `status` with type `SQLCoreOperations[TenantStatus] | TenantStatus` in function `models.account.Tenant.__init__` [bad-argument-type]
@@ -2116,8 +2100,6 @@
    --> tests/helpers/workflow/table_runner.py:389:23
 ERROR `graph_runtime_state` is uninitialized [unbound-name]
    --> tests/helpers/workflow/table_runner.py:390:37
-WARN `URLError` is already caught earlier in this `try` statement, so it never matches here [unreachable-except-clause]
-   --> tests/pytest_dify.py:155:34
 ERROR Object of class `object` has no attribute `package` [missing-attribute]
    --> tests/unit_tests/commands/test_data_migration.py:218:16
 ERROR Object of class `object` has no attribute `options_override` [missing-attribute]
@@ -2222,26 +2204,6 @@
    --> tests/unit_tests/controllers/console/app/test_message.py:150:16
 ERROR Argument `str | None` is not assignable to parameter `s` with type `bytearray | bytes | str` in function `json.loads` [bad-argument-type]
    --> tests/unit_tests/controllers/console/app/test_model_config.py:891:36
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/app/test_workflow.py:325:34
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/app/test_workflow.py:336:34
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/app/test_workflow.py:365:34
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/app/test_workflow.py:390:34
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/app/test_workflow.py:431:34
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/app/test_workflow.py:461:34
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/app/test_workflow.py:488:34
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/app/test_workflow.py:529:34
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/app/test_workflow.py:592:34
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/app/test_workflow.py:613:34
 ERROR Object of class `WorkflowRun` has no attribute `retry_index` [missing-attribute]
    --> tests/unit_tests/controllers/console/app/test_workflow_run.py:222:5
 ERROR Missing argument `app_model` in function `handler` [missing-argument]
@@ -2300,14 +2262,8 @@
    --> tests/unit_tests/controllers/console/auth/test_email_register.py:236:12
 ERROR Object of class `FunctionType` has no attribute `side_effect` [missing-attribute]
    --> tests/unit_tests/controllers/console/auth/test_email_register.py:268:5
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/datasets/rag_pipeline/test_datasource_auth.py:828:33
 ERROR Object of class `FromClause` has no attribute `create` [missing-attribute]
   --> tests/unit_tests/controllers/console/datasets/rag_pipeline/test_rag_pipeline.py:83:9
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/datasets/rag_pipeline/test_rag_pipeline.py:303:25
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/datasets/rag_pipeline/test_rag_pipeline.py:334:25
 ERROR Unexpected keyword argument `created_at` in function `models.workflow.WorkflowNodeExecutionModel.__init__` [unexpected-keyword]
    --> tests/unit_tests/controllers/console/datasets/rag_pipeline/test_rag_pipeline_workflow.py:876:9
 ERROR Argument `datetime | None` is not assignable to parameter `value` with type `SQLCoreOperations[datetime] | datetime` in function `sqlalchemy.orm.base.Mapped.__set__` [bad-argument-type]
@@ -2398,18 +2354,16 @@
   --> tests/unit_tests/controllers/console/datasets/test_external.py:86:17
 ERROR Argument `UUID` is not assignable to parameter `object` with type `ExternalKnowledgeApiPayload` in function `list.append` [bad-argument-type]
   --> tests/unit_tests/controllers/console/datasets/test_external.py:88:21
+ERROR Argument `UUID` is not assignable to parameter `object` with type `RequestContext` in function `list.append` [bad-argument-type]
+  --> tests/unit_tests/controllers/console/datasets/test_external.py:88:21
 ERROR Generator function should return `Generator` [bad-return]
   --> tests/unit_tests/controllers/console/tag/test_tags.py:66:23
 ERROR Argument `SimpleNamespace` is not assignable to parameter `form` with type `Form` in function `controllers.console.human_input_form._jsonify_form_definition` [bad-argument-type]
   --> tests/unit_tests/controllers/console/test_human_input_form.py:94:41
 ERROR Argument `SimpleNamespace` is not assignable to parameter `form` with type `Form` in function `controllers.console.human_input_form.ConsoleHumanInputFormApi._ensure_console_access` [bad-argument-type]
    --> tests/unit_tests/controllers/console/test_human_input_form.py:105:57
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/test_human_input_form.py:131:22
-ERROR Argument `(ParamSpec(Unknown)) -> Response | Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/test_human_input_form.py:152:22
 ERROR Type `Response` is not iterable [not-iterable]
-   --> tests/unit_tests/controllers/console/test_wraps.py:306:17
+   --> tests/unit_tests/controllers/console/test_wraps.py:305:17
 ERROR Argument value `Literal[0]` violates Pydantic `ge` constraint `Literal[1]` for field `page` [bad-argument-type]
    --> tests/unit_tests/controllers/console/workspace/test_endpoint.py:235:47
 ERROR Missing argument `plugin_id` in function `controllers.console.workspace.endpoint.EndpointListForPluginQuery.__init__` [missing-argument]
@@ -2425,7 +2379,7 @@
 ERROR Missing argument `endpoint_id` in function `controllers.console.workspace.endpoint.EndpointIdPayload.__init__` [missing-argument]
    --> tests/unit_tests/controllers/console/workspace/test_endpoint.py:561:46
 ERROR Argument `Literal['team']` is not assignable to parameter `plan` with type `CloudPlan | None` in function `services.workspace.contracts.EffectiveCreditPool.__init__` [bad-argument-type]
-   --> tests/unit_tests/controllers/console/workspace/test_model_providers.py:359:18
+   --> tests/unit_tests/controllers/console/workspace/test_model_providers.py:358:18
 ERROR `in` is not supported between `Literal['knowledge-retrieval']` and `object` [not-iterable]
    --> tests/unit_tests/controllers/console/workspace/test_snippets.py:213:12
 WARN Call to deprecated overload `contextlib.contextmanager` [deprecated]
@@ -2462,16 +2416,6 @@
    --> tests/unit_tests/controllers/inner_api/plugin/test_wraps.py:423:35
 ERROR Missing argument `payload` in function `protected_view` [missing-argument]
    --> tests/unit_tests/controllers/inner_api/plugin/test_wraps.py:429:36
-ERROR Argument `(ParamSpec(Unknown)) -> Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-  --> tests/unit_tests/controllers/inner_api/test_runtime_credentials.py:77:32
-ERROR Argument `(ParamSpec(Unknown)) -> Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/inner_api/test_runtime_credentials.py:107:32
-ERROR Argument `(ParamSpec(Unknown)) -> Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/inner_api/test_runtime_credentials.py:154:32
-ERROR Argument `(ParamSpec(Unknown)) -> Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/inner_api/test_runtime_credentials.py:202:32
-ERROR Argument `(ParamSpec(Unknown)) -> Unknown` is not assignable to parameter `func` with type `(...) -> Any` in function `inspect.unwrap` [bad-argument-type]
-   --> tests/unit_tests/controllers/inner_api/test_runtime_credentials.py:216:32
 ERROR Attribute `payload` of class `Namespace` is a read-only property and cannot be set [read-only]
   --> tests/unit_tests/controllers/mcp/test_mcp.py:32:5
 ERROR Object of class `FromClause` has no attribute `create` [missing-attribute]
@@ -2555,7 +2499,7 @@
 ERROR `None` is not subscriptable [unsupported-operation]
    --> tests/unit_tests/controllers/service_api/app/test_audio.py:205:16
 ERROR Argument `list[dict[str, Any]] | None` is not assignable to parameter `obj` with type `Sized` in function `len` [bad-argument-type]
-   --> tests/unit_tests/controllers/service_api/app/test_completion.py:258:24
+   --> tests/unit_tests/controllers/service_api/app/test_completion.py:256:24
 ERROR Argument value `Literal[0]` violates Pydantic `ge` constraint `Literal[1]` for field `limit` [bad-argument-type]
   --> tests/unit_tests/controllers/service_api/app/test_conversation.py:69:39
 ERROR Argument value `Literal[101]` violates Pydantic `le` constraint `Literal[100]` for field `limit` [bad-argument-type]
@@ -2831,33 +2775,17 @@
 ERROR Argument `list[Unknown]` is not assignable to parameter `llm_response` with type `Generator[LLMResultChunk]` in function `core.agent.output_parser.cot_output_parser.CotAgentOutputParser.handle_react_stream_output` [bad-argument-type]
    --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:195:71
 ERROR Argument `list[Unknown]` is not assignable to parameter `llm_response` with type `Generator[LLMResultChunk]` in function `core.agent.output_parser.cot_output_parser.CotAgentOutputParser.handle_react_stream_output` [bad-argument-type]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:207:71
-ERROR No matching overload found for function `str.join` called with arguments: (list[AgentScratchpadUnit.Action | str]) [no-matching-overload]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:208:23
+   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:205:71
 ERROR Argument `list[Unknown]` is not assignable to parameter `llm_response` with type `Generator[LLMResultChunk]` in function `core.agent.output_parser.cot_output_parser.CotAgentOutputParser.handle_react_stream_output` [bad-argument-type]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:215:75
-ERROR No matching overload found for function `str.join` called with arguments: (list[AgentScratchpadUnit.Action | str]) [no-matching-overload]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:216:27
+   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:218:71
 ERROR Argument `list[Unknown]` is not assignable to parameter `llm_response` with type `Generator[LLMResultChunk]` in function `core.agent.output_parser.cot_output_parser.CotAgentOutputParser.handle_react_stream_output` [bad-argument-type]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:221:71
+   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:226:71
 ERROR No matching overload found for function `str.join` called with arguments: (list[AgentScratchpadUnit.Action | str]) [no-matching-overload]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:222:25
+   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:227:38
 ERROR Argument `list[Unknown]` is not assignable to parameter `llm_response` with type `Generator[LLMResultChunk]` in function `core.agent.output_parser.cot_output_parser.CotAgentOutputParser.handle_react_stream_output` [bad-argument-type]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:229:71
+   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:247:71
 ERROR No matching overload found for function `str.join` called with arguments: (list[AgentScratchpadUnit.Action | str]) [no-matching-overload]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:230:25
-ERROR Argument `list[Unknown]` is not assignable to parameter `llm_response` with type `Generator[LLMResultChunk]` in function `core.agent.output_parser.cot_output_parser.CotAgentOutputParser.handle_react_stream_output` [bad-argument-type]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:242:71
-ERROR Argument `list[Unknown]` is not assignable to parameter `llm_response` with type `Generator[LLMResultChunk]` in function `core.agent.output_parser.cot_output_parser.CotAgentOutputParser.handle_react_stream_output` [bad-argument-type]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:255:71
-ERROR Argument `list[Unknown]` is not assignable to parameter `llm_response` with type `Generator[LLMResultChunk]` in function `core.agent.output_parser.cot_output_parser.CotAgentOutputParser.handle_react_stream_output` [bad-argument-type]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:263:71
-ERROR No matching overload found for function `str.join` called with arguments: (list[AgentScratchpadUnit.Action | str]) [no-matching-overload]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:264:38
-ERROR Argument `list[Unknown]` is not assignable to parameter `llm_response` with type `Generator[LLMResultChunk]` in function `core.agent.output_parser.cot_output_parser.CotAgentOutputParser.handle_react_stream_output` [bad-argument-type]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:284:71
-ERROR No matching overload found for function `str.join` called with arguments: (list[AgentScratchpadUnit.Action | str]) [no-matching-overload]
-   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:286:25
+   --> tests/unit_tests/core/agent/output_parser/test_cot_output_parser.py:249:25
 ERROR `None` is not assignable to attribute `agent_callback` with type `DifyAgentCallbackHandler` [bad-assignment]
    --> tests/unit_tests/core/agent/test_cot_agent_runner.py:121:29
 ERROR Object of class `DummyRunner` has no attribute `session` [missing-attribute]
@@ -2970,8 +2898,6 @@
    --> tests/unit_tests/core/agent/test_fc_agent_runner.py:238:9
 ERROR Argument `None` is not assignable to parameter `query` with type `str` in function `core.agent.fc_agent_runner.FunctionCallAgentRunner._organize_user_query` [bad-argument-type]
    --> tests/unit_tests/core/agent/test_fc_agent_runner.py:339:46
-ERROR `list[str]` is not assignable to attribute `files` with type `Sequence[File] | list[File]` [bad-assignment]
-   --> tests/unit_tests/core/agent/test_fc_agent_runner.py:351:24
 ERROR Object of class `FunctionCallAgentRunner` has no attribute `session` [missing-attribute]
    --> tests/unit_tests/core/agent/test_fc_agent_runner.py:407:58
 ERROR Object of class `FunctionCallAgentRunner` has no attribute `session` [missing-attribute]
@@ -3116,6 +3042,10 @@
     --> tests/unit_tests/core/app/apps/advanced_chat/test_app_generator.py:1450:33
 ERROR Object of type `Generator[Mapping[str, Any] | str] | Mapping[str, Any]` has no attribute `ok` [missing-attribute]
     --> tests/unit_tests/core/app/apps/advanced_chat/test_app_generator.py:1453:16
+ERROR Object of class `NoneType` has no attribute `app_id` [missing-attribute]
+    --> tests/unit_tests/core/app/apps/advanced_chat/test_app_generator.py:1457:16
+ERROR Object of class `NoneType` has no attribute `user_id` [missing-attribute]
+    --> tests/unit_tests/core/app/apps/advanced_chat/test_app_generator.py:1458:16
 ERROR Argument `SimpleNamespace` is not assignable to parameter `graph_runtime_state` with type `RuntimeState` in function `core.app.apps.advanced_chat.app_generator.AdvancedChatAppGenerator.resume` [bad-argument-type]
     --> tests/unit_tests/core/app/apps/advanced_chat/test_app_generator.py:1498:33
 ERROR Object of type `Generator[Mapping[str, Any] | str] | Mapping[str, Any]` has no attribute `ok` [missing-attribute]
@@ -3686,6 +3616,8 @@
    --> tests/unit_tests/core/app/apps/test_workflow_app_runner.py:925:59
 ERROR Argument `TestWorkflowAppRunnerCoreCases.TestWorkflowBasedAppRunner.test_handle_start_node_result_events_project_outputs._QueueManager` is not assignable to parameter `queue_manager` with type `AppQueueManager` in function `core.app.apps.workflow_app_runner.WorkflowBasedAppRunner.__init__` [bad-argument-type]
     --> tests/unit_tests/core/app/apps/test_workflow_app_runner.py:1004:59
+ERROR Object of class `object` has no attribute `outputs` [missing-attribute]
+    --> tests/unit_tests/core/app/apps/test_workflow_app_runner.py:1027:20
 ERROR Argument `_DummyQueueManager` is not assignable to parameter `queue_manager` with type `AppQueueManager` in function `core.app.apps.workflow_app_runner.WorkflowBasedAppRunner.__init__` [bad-argument-type]
     --> tests/unit_tests/core/app/apps/test_workflow_app_runner.py:1056:55
 ERROR Argument `_DummyWorkflowEntry` is not assignable to parameter `workflow_entry` with type `WorkflowEntry` in function `core.app.apps.workflow_app_runner.WorkflowBasedAppRunner.handle_event` [bad-argument-type]
@@ -3722,6 +3654,10 @@
     --> tests/unit_tests/core/app/apps/workflow/test_app_generator.py:1414:37
 ERROR Object of type `Generator[Mapping[str, Any] | str] | Mapping[str, Any]` has no attribute `ok` [missing-attribute]
     --> tests/unit_tests/core/app/apps/workflow/test_app_generator.py:1419:20
+ERROR Object of class `NoneType` has no attribute `app_id` [missing-attribute]
+    --> tests/unit_tests/core/app/apps/workflow/test_app_generator.py:1423:20
+ERROR Object of class `NoneType` has no attribute `user_id` [missing-attribute]
+    --> tests/unit_tests/core/app/apps/workflow/test_app_generator.py:1424:20
 ERROR Argument `SimpleNamespace` is not assignable to parameter `graph_runtime_state` with type `RuntimeState` in function `core.app.apps.workflow.app_generator.WorkflowAppGenerator.resume` [bad-argument-type]
     --> tests/unit_tests/core/app/apps/workflow/test_app_generator.py:1465:37
 ERROR Object of type `Generator[Mapping[str, Any] | str] | Mapping[str, Any]` has no attribute `ok` [missing-attribute]
@@ -4167,19 +4103,19 @@
 ERROR Object of class `Account` has no attribute `app_id` [missing-attribute]
    --> tests/unit_tests/core/plugin/backwards_invocation/test_app.py:440:16
 ERROR Object of class `NoneType` has no attribute `context_tokens` [missing-attribute]
-   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:408:12
+   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:407:12
 ERROR Object of class `NoneType` has no attribute `max_output_tokens` [missing-attribute]
-   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:409:12
+   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:408:12
 ERROR Object of class `NoneType` has no attribute `output_parameter` [missing-attribute]
-   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:410:12
+   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:409:12
 ERROR Object of class `NoneType` has no attribute `context_tokens` [missing-attribute]
-   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:434:12
+   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:433:12
 ERROR Object of class `NoneType` has no attribute `max_output_tokens` [missing-attribute]
-   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:435:12
+   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:434:12
 ERROR Object of class `NoneType` has no attribute `max_output_tokens` [missing-attribute]
-   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:454:12
+   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:453:12
 ERROR Object of class `NoneType` has no attribute `output_parameter` [missing-attribute]
-   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:455:12
+   --> tests/unit_tests/core/plugin/backwards_invocation/test_model.py:454:12
 ERROR Argument `TestPluginDaemonEntities.test_credential_type_helpers._FakeCredential` is not assignable to parameter `self` with type `CredentialType` in function `core.plugin.entities.plugin_daemon.CredentialType.get_name` [bad-argument-type]
    --> tests/unit_tests/core/plugin/entities/test_plugin_daemon.py:313:40
 ERROR Argument `object` is not assignable to parameter `method` with type `str` in function `httpx._api.request` [bad-argument-type]
@@ -4363,13 +4299,17 @@
 ERROR Argument `str` is not assignable to parameter `doc_form` with type `IndexStructureType | SQLCoreOperations[IndexStructureType]` in function `models.dataset.Document.__init__` [bad-argument-type]
    --> tests/unit_tests/core/rag/datasource/test_retrieval_service.py:148:18
 ERROR Argument `list[FromClause]` is not assignable to parameter `tables` with type `Sequence[Table] | None` in function `sqlalchemy.sql.schema.MetaData.create_all` [bad-argument-type]
-  --> tests/unit_tests/core/rag/extractor/test_excel_extractor.py:17:56
+  --> tests/unit_tests/core/rag/extractor/test_excel_extractor.py:18:56
+WARN Cannot find type stubs for module `xlrd` [untyped-import]
+   --> tests/unit_tests/core/rag/extractor/test_excel_extractor.py:284:16
+WARN Cannot find type stubs for module `xlrd` [untyped-import]
+   --> tests/unit_tests/core/rag/extractor/test_excel_extractor.py:351:16
 ERROR Argument `object | None` is not assignable to parameter `session` with type `Session | None` in function `core.rag.extractor.extract_processor.ExtractProcessor.extract` [bad-argument-type]
    --> tests/unit_tests/core/rag/extractor/test_extract_processor.py:222:85
 ERROR Object of class `NoneType` has no attribute `strip` [missing-attribute]
   --> tests/unit_tests/core/rag/extractor/test_markdown_extractor.py:30:16
 ERROR `_CloseRecorder` is not assignable to attribute `temp_file` with type `_TemporaryFileWrapper[bytes]` [bad-assignment]
-   --> tests/unit_tests/core/rag/extractor/test_word_extractor.py:399:27
+   --> tests/unit_tests/core/rag/extractor/test_word_extractor.py:397:27
 ERROR Object of class `NoneType` has no attribute `indexing_status` [missing-attribute]
    --> tests/unit_tests/core/rag/index_processor/test_index_processor.py:240:16
 ERROR Object of class `FunctionType` has no attribute `return_value` [missing-attribute]
@@ -4489,45 +4429,37 @@
 WARN Call to deprecated overload `contextlib.contextmanager` [deprecated]
    --> tests/unit_tests/core/repositories/test_sqlalchemy_workflow_node_execution_repository.py:874:1
 ERROR Argument `Literal[core.entities.provider_entities.ProviderQuotaType.TRIAL]` is not assignable to parameter `quota_type` with type `models.enums.ProviderQuotaType | SQLCoreOperations[models.enums.ProviderQuotaType | None] | None` in function `models.provider.Provider.__init__` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:120:20
+   --> tests/unit_tests/core/test_provider_manager.py:119:20
 ERROR Argument `Literal['llm']` is not assignable to parameter `model_type` with type `ModelType | SQLCoreOperations[ModelType]` in function `models.provider.ProviderModelSetting.__init__` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:178:20
+   --> tests/unit_tests/core/test_provider_manager.py:177:20
 ERROR Argument `Literal['llm']` is not assignable to parameter `model_type` with type `ModelType | SQLCoreOperations[ModelType]` in function `models.provider.LoadBalancingModelConfig.__init__` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:191:24
-ERROR Argument `Literal['llm']` is not assignable to parameter `model_type` with type `ModelType | SQLCoreOperations[ModelType]` in function `models.provider.LoadBalancingModelConfig.__init__` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:200:24
-ERROR Argument `list[ProviderModelSetting]` is not assignable to parameter `provider_model_settings` with type `list[_ProviderModelSettingCacheEntry] | None` in function `core.provider_manager.ProviderManager._to_model_settings` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:221:37
-ERROR Argument `list[LoadBalancingModelConfig]` is not assignable to parameter `load_balancing_model_configs` with type `list[_LoadBalancingModelConfigCacheEntry] | None` in function `core.provider_manager.ProviderManager._to_model_settings` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:222:42
-ERROR Argument `Literal['llm']` is not assignable to parameter `model_type` with type `ModelType | SQLCoreOperations[ModelType]` in function `models.provider.ProviderModelSetting.__init__` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:265:20
+   --> tests/unit_tests/core/test_provider_manager.py:190:24
 ERROR Argument `Literal['llm']` is not assignable to parameter `model_type` with type `ModelType | SQLCoreOperations[ModelType]` in function `models.provider.LoadBalancingModelConfig.__init__` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:274:24
+   --> tests/unit_tests/core/test_provider_manager.py:199:24
 ERROR Argument `list[ProviderModelSetting]` is not assignable to parameter `provider_model_settings` with type `list[_ProviderModelSettingCacheEntry] | None` in function `core.provider_manager.ProviderManager._to_model_settings` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:288:67
+   --> tests/unit_tests/core/test_provider_manager.py:220:37
 ERROR Argument `list[LoadBalancingModelConfig]` is not assignable to parameter `load_balancing_model_configs` with type `list[_LoadBalancingModelConfigCacheEntry] | None` in function `core.provider_manager.ProviderManager._to_model_settings` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:288:77
+   --> tests/unit_tests/core/test_provider_manager.py:221:42
 ERROR Argument `Literal['llm']` is not assignable to parameter `model_type` with type `ModelType | SQLCoreOperations[ModelType]` in function `models.provider.ProviderModelSetting.__init__` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:478:20
+   --> tests/unit_tests/core/test_provider_manager.py:416:20
 ERROR Argument `Literal['llm']` is not assignable to parameter `model_type` with type `ModelType | SQLCoreOperations[ModelType]` in function `models.provider.LoadBalancingModelConfig.__init__` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:489:24
+   --> tests/unit_tests/core/test_provider_manager.py:427:24
 ERROR Argument `list[ProviderModelSetting]` is not assignable to parameter `provider_model_settings` with type `list[_ProviderModelSettingCacheEntry] | None` in function `core.provider_manager.ProviderManager._to_model_settings` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:509:37
+   --> tests/unit_tests/core/test_provider_manager.py:447:37
 ERROR Argument `list[LoadBalancingModelConfig]` is not assignable to parameter `load_balancing_model_configs` with type `list[_LoadBalancingModelConfigCacheEntry] | None` in function `core.provider_manager.ProviderManager._to_model_settings` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:510:42
+   --> tests/unit_tests/core/test_provider_manager.py:448:42
 ERROR Argument `Literal['llm']` is not assignable to parameter `model_type` with type `ModelType | SQLCoreOperations[ModelType]` in function `models.provider.ProviderModelSetting.__init__` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:528:20
+   --> tests/unit_tests/core/test_provider_manager.py:466:20
 ERROR Argument `Literal['llm']` is not assignable to parameter `model_type` with type `ModelType | SQLCoreOperations[ModelType]` in function `models.provider.LoadBalancingModelConfig.__init__` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:539:24
+   --> tests/unit_tests/core/test_provider_manager.py:477:24
 ERROR Argument `Literal['llm']` is not assignable to parameter `model_type` with type `ModelType | SQLCoreOperations[ModelType]` in function `models.provider.LoadBalancingModelConfig.__init__` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:548:24
+   --> tests/unit_tests/core/test_provider_manager.py:486:24
 ERROR Argument `list[ProviderModelSetting]` is not assignable to parameter `provider_model_settings` with type `list[_ProviderModelSettingCacheEntry] | None` in function `core.provider_manager.ProviderManager._to_model_settings` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:569:37
+   --> tests/unit_tests/core/test_provider_manager.py:507:37
 ERROR Argument `list[LoadBalancingModelConfig]` is not assignable to parameter `load_balancing_model_configs` with type `list[_LoadBalancingModelConfigCacheEntry] | None` in function `core.provider_manager.ProviderManager._to_model_settings` [bad-argument-type]
-   --> tests/unit_tests/core/test_provider_manager.py:570:42
+   --> tests/unit_tests/core/test_provider_manager.py:508:42
 WARN Identity comparison `False is True` is always False [unnecessary-comparison]
-    --> tests/unit_tests/core/test_provider_manager.py:1309:30
+    --> tests/unit_tests/core/test_provider_manager.py:1247:30
 ERROR Class member `DummyTool.get_runtime_parameters` overrides a member in a parent class but is missing an `@override` decorator [missing-override-decorator]
   --> tests/unit_tests/core/tools/__base/test_tool.py:71:9
 ERROR Object of type `ToolInvokeMessage.BlobChunkMessage | ToolInvokeMessage.BlobMessage | ToolInvokeMessage.FileMessage | ToolInvokeMessage.JsonMessage | ToolInvokeMessage.LogMessage | ToolInvokeMessage.RetrieverResourceMessage | ToolInvokeMessage.TextMessage | ToolInvokeMessage.VariableMessage | None` has no attribute `text` [missing-attribute]
@@ -5875,7 +5807,7 @@
 ERROR Object of class `object` has no attribute `agent_role` [missing-attribute]
     --> tests/unit_tests/services/agent/test_roster_service.py:5614:16
 ERROR Argument `object` is not assignable to parameter `pwd` with type `bytes | None` in function `zipfile.ZipFile.read` [bad-argument-type]
-   --> tests/unit_tests/services/agent/test_skill_package_service.py:327:44
+   --> tests/unit_tests/services/agent/test_skill_package_service.py:306:44
 ERROR Object of class `NoneType` has no attribute `node_job_config_dict` [missing-attribute]
    --> tests/unit_tests/services/agent/test_workflow_publish_service.py:601:49
 ERROR Object of class `NoneType` has no attribute `node_job_config_dict` [missing-attribute]
@@ -6009,9 +5941,9 @@
 ERROR Argument `(_storage_key: str, *, expires_in: int, filename: str) -> str` is not assignable to parameter `sign_download_url` with type `WorkflowRunArchiveDownloadUrlSigner` in function `services.retention.workflow_run.archive_log_service.WorkflowRunArchiveService.__init__` [bad-argument-type]
    --> tests/unit_tests/services/retention/workflow_run/test_archive_log_service.py:405:27
 ERROR Argument `FakeRepo` is not assignable to parameter `workflow_run_repo` with type `APIWorkflowRunRepository | None` in function `services.retention.workflow_run.clear_free_plan_expired_workflow_run_logs.WorkflowRunCleanup.__init__` [bad-argument-type]
-   --> tests/unit_tests/services/retention/workflow_run/test_clear_free_plan_expired_workflow_run_logs.py:565:49
+   --> tests/unit_tests/services/retention/workflow_run/test_clear_free_plan_expired_workflow_run_logs.py:564:49
 ERROR Class member `FailingRepo.delete_runs_with_related_by_ids` overrides a member in a parent class but is missing an `@override` decorator [missing-override-decorator]
-   --> tests/unit_tests/services/retention/workflow_run/test_clear_free_plan_expired_workflow_run_logs.py:865:17
+   --> tests/unit_tests/services/retention/workflow_run/test_clear_free_plan_expired_workflow_run_logs.py:864:17
 ERROR Argument `list[FromClause]` is not assignable to parameter `tables` with type `Sequence[Table] | None` in function `sqlalchemy.sql.schema.MetaData.create_all` [bad-argument-type]
   --> tests/unit_tests/services/retention/workflow_run/test_restore_archived_workflow_run.py:58:16
 ERROR Argument `str` is not assignable to parameter `type` with type `SQLCoreOperations[WorkflowType] | WorkflowType` in function `models.workflow.WorkflowRun.__init__` [bad-argument-type]
@@ -6080,26 +6012,44 @@
     --> tests/unit_tests/services/test_app_task_service.py:1319:18
 ERROR `in` is not supported between `Literal['Quota limit reached']` and `None` [not-iterable]
    --> tests/unit_tests/services/test_async_workflow_service.py:344:16
+WARN `services.billing_service.BillingService.get_model_provider_payment_link` is deprecated [deprecated]
+   --> tests/unit_tests/services/test_billing_service.py:660:18
+WARN `services.billing_service.BillingService.get_tenant_feature_plan_usage` is deprecated [deprecated]
+   --> tests/unit_tests/services/test_billing_service.py:791:18
+WARN `services.billing_service.BillingService.get_tenant_feature_plan_usage` is deprecated [deprecated]
+    --> tests/unit_tests/services/test_billing_service.py:1751:17
+WARN `services.billing_service.BillingService.get_tenant_feature_plan_usage` is deprecated [deprecated]
+    --> tests/unit_tests/services/test_billing_service.py:1762:25
+ERROR Argument `BillingInfo` is not assignable to parameter `result` with type `dict[Unknown, Unknown]` in function `TestBillingServiceSubscriptionInfoDataType._assert_billing_info_types` [bad-argument-type]
+    --> tests/unit_tests/services/test_billing_service.py:1853:41
+ERROR Argument `BillingInfo` is not assignable to parameter `result` with type `dict[Unknown, Unknown]` in function `TestBillingServiceSubscriptionInfoDataType._assert_billing_info_types` [bad-argument-type]
+    --> tests/unit_tests/services/test_billing_service.py:1862:41
+ERROR Argument `BillingInfo` is not assignable to parameter `result` with type `dict[Unknown, Unknown]` in function `TestBillingServiceSubscriptionInfoDataType._assert_billing_info_types` [bad-argument-type]
+    --> tests/unit_tests/services/test_billing_service.py:1875:41
+ERROR Argument `BillingInfo` is not assignable to parameter `result` with type `dict[Unknown, Unknown]` in function `TestBillingServiceSubscriptionInfoDataType._assert_billing_info_types` [bad-argument-type]
+    --> tests/unit_tests/services/test_billing_service.py:1886:41
 ERROR Argument `Literal['normal']` is not assignable to parameter `status` with type `ConversationStatus | SQLCoreOperations[ConversationStatus]` in function `models.model.Conversation.__init__` [bad-argument-type]
-   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:119:16
+   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:117:16
 ERROR Object of class `object` has no attribute `id` [missing-attribute]
-   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:331:39
+   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:329:39
 ERROR Class member `FixedDateTime.now` overrides parent class `datetime` in an inconsistent manner [bad-override]
-   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:595:13
+   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:593:13
 ERROR Class member `FixedDateTime.now` overrides a member in a parent class but is missing an `@override` decorator [missing-override-decorator]
-   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:595:13
+   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:593:13
 ERROR Class member `FixedDateTime.now` overrides parent class `datetime` in an inconsistent manner [bad-override]
-   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:667:13
+   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:665:13
 ERROR Class member `FixedDateTime.now` overrides a member in a parent class but is missing an `@override` decorator [missing-override-decorator]
-   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:667:13
+   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:665:13
 ERROR Object of class `object` has no attribute `kw` [missing-attribute]
-   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:764:12
+   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:762:12
 ERROR Object of class `object` has no attribute `kw` [missing-attribute]
-   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:765:12
+   --> tests/unit_tests/services/test_clear_free_plan_tenant_expired_logs.py:763:12
 ERROR Argument `Literal['invalid']` is not assignable to parameter `session_factory` with type `Engine | sessionmaker[Unknown] | None` in function `services.file_service.FileService.__init__` [bad-argument-type]
   --> tests/unit_tests/services/test_file_service.py:92:45
 ERROR Unexpected keyword argument `whole_workspace` in function `core.workflow.human_input_adapter.EmailRecipients.__init__` [unexpected-keyword]
    --> tests/unit_tests/services/test_human_input_delivery_test_service.py:260:44
+ERROR Argument `dict[str, Any]` is not assignable to parameter `utm_info` with type `UtmInfo` in function `services.operation_service.OperationService.record_utm` [bad-argument-type]
+   --> tests/unit_tests/services/test_operation_service.py:118:57
 ERROR Argument `Iterator[dict[str, str | dict[str, str]] | str]` is not assignable to parameter `response` with type `Generator[Mapping[str, Any] | str] | Mapping[str, Any]` in function `services.snippet_generate_service.SnippetGenerateService._filter_virtual_start_events` [bad-argument-type]
   --> tests/unit_tests/services/test_snippet_generate_service.py:80:68
 ERROR Keyword argument `loop_count` with type `Literal[1]` is not assignable to parameter `**kwargs` with type `str` in function `typing.MutableMapping.update` [bad-argument-type]
@@ -6307,11 +6257,11 @@
 ERROR Argument `dict[str, list[Unknown] | str | dict[str, bool] | dict[str, bool | str] | dict[str, dict[str, bool | int | list[str]]]]` is not assignable to parameter `features` with type `dict[str, object]` in function `_create_workflow` [bad-argument-type]
   --> tests/unit_tests/services/test_workflow_restore.py:63:18
 ERROR `dict[str, str]` is not assignable to dict value type `list[Unknown] | str` [bad-assignment]
-   --> tests/unit_tests/services/test_workflow_service.py:237:30
+   --> tests/unit_tests/services/test_workflow_service.py:236:30
 ERROR Argument `Literal['invalid']` is not assignable to parameter `value` with type `AppMode | SQLCoreOperations[AppMode]` in function `sqlalchemy.orm.base.Mapped.__set__` [bad-argument-type]
-    --> tests/unit_tests/services/test_workflow_service.py:3900:24
+    --> tests/unit_tests/services/test_workflow_service.py:3899:24
 ERROR Argument `dict[str, str | dict[str, str]]` is not assignable to parameter `node_config` with type `NodeConfigDict` in function `services.workflow_service.WorkflowService._build_human_input_node_for_debugging` [bad-argument-type]
-    --> tests/unit_tests/services/test_workflow_service.py:3931:69
+    --> tests/unit_tests/services/test_workflow_service.py:3930:69
 ERROR Object of class `MCPToolProvider` has no attribute `provider_icon` [missing-attribute]
   --> tests/unit_tests/services/tools/test_tools_transform_service.py:80:9
 ERROR Object of class `MCPToolProvider` has no attribute `masked_server_url` [missing-attribute]

@github-actions

github-actions Bot commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Pyrefly Type Coverage

Metric Base PR Delta
Type coverage 81.45% 81.40% -0.05%
Strict coverage 81.10% 81.10% +0.01%
Typed symbols 85,166 83,198 -1,968
Untyped symbols 19,477 19,079 -398
Modules 4385 4241 -144

auto-merge was automatically disabled October 30, 2026 04:59

Head branch was pushed to by a user without write access

@codecov

codecov Bot commented Oct 30, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 8.82353% with 31 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.35%. Comparing base (2b35144) to head (be6bf0e).
⚠️ Report is 253 commits behind head on main.

Files with missing lines Patch % Lines
api/core/rag/extractor/excel_extractor.py 8.82% 31 Missing ⚠️

❌ Your project check has failed because the head coverage (82.35%) is below the adjusted base coverage (88.30%). You can increase the head coverage or adjust the Removed Code Behavior.

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #44666      +/-   ##
==========================================
- Coverage   89.30%   82.35%   -6.95%     
==========================================
  Files        5983     6078      +95     
  Lines      375012   377702    +2690     
  Branches    76053    76825     +772     
==========================================
- Hits       334898   311066   -23832     
- Misses      34078    60684   +26606     
+ Partials     6036     5952      -84     
Flag Coverage Δ
api 77.35% <8.82%> (-11.84%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@yuyongyan29-dev

Copy link
Copy Markdown
Author

Hi maintainers, gentle ping on this one when you have a moment — happy to adjust anything. Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Legacy .xls knowledge imports rewrite text identifiers through numeric inference

2 participants