feat:LLM 分析文件并生成结构化建议

This commit is contained in:
2026-10-10 06:07:56 -07:00
parent b90842237f
commit e3699d1a30
22 changed files with 457 additions and 327 deletions
+5 -10
View File
@@ -19,7 +19,8 @@ from python_calamine import (
SheetVisibleEnum,
)
from app.datafiles.base import MAX_TABLE_ROWS, DataFileError, rows_exceeded
from app.datafiles.base import MAX_TABLE_ROWS, DataFileError, brief, rows_exceeded
from app.datafiles.columns import as_text
from app.schemas.data_file import ParseWarning
# 原始网格比数据多出的标题、表头、空行,读取时先粗略拦住明显超限的文件,精确的行数在拆表后检查
@@ -153,7 +154,7 @@ def read_jsonl(text: str) -> Records:
result.warnings.append(
ParseWarning(
code="bad_lines_skipped",
message=f"跳过了 {len(bad)} 行无法解析的内容:{_line_list(bad)}",
message=f"跳过了 {len(bad)} 行无法解析的内容:{brief([f'第 {n} 行' for n in bad])}",
)
)
return result
@@ -230,11 +231,5 @@ def _flatten(record: dict, prefix: str, level: int, out: dict[str, Any]) -> None
def _scalar(value: Any) -> Any:
if isinstance(value, (dict, list)):
return json.dumps(value, ensure_ascii=False)
return value
def _line_list(numbers: list[int]) -> str:
shown = "、".join(f"第 {number} 行" for number in numbers[:5])
return shown + ("等" if len(numbers) > 5 else "")
# 嵌套的对象、数组存成 JSON 字符串,其余原样交给类型推断
return as_text(value) if isinstance(value, (dict, list)) else value