Files
2026-07-13 12:08:54 +08:00

68 lines
2.5 KiB
Python

"""No-op format handlers for the two "nothing to parse" document formats.
These are internal (``user_selectable=False``) parsers dispatched by *format*,
not by a user engine choice:
- :class:`ReuseParser` handles ``lightrag`` rows — a document already parsed
by some engine whose sidecar exists. Reached only on resume/retry (a doc
that finished parsing but failed/interrupted at a later stage and is pulled
back through the parse queue). Re-uses the stored content + sidecar
instead of re-parsing (the original source may already be archived).
- :class:`PassthroughParser` handles ``raw`` rows — content supplied verbatim
at insert time (e.g. ``ainsert`` of a plain string).
Both mirror the corresponding branches of the former ``parse_native`` exactly
(no disk writes, ``parse_stage_skipped=True``, no ``parse_engine`` key).
"""
from __future__ import annotations
from lightrag.constants import FULL_DOCS_FORMAT_LIGHTRAG, FULL_DOCS_FORMAT_RAW
from lightrag.parser.base import BaseParser, ParseContext, ParseResult
class ReuseParser(BaseParser):
"""Reuse an already-parsed (``lightrag``-format) document's sidecar."""
engine_name = "reuse"
async def parse(self, ctx: ParseContext) -> ParseResult:
from lightrag.utils_pipeline import (
sidecar_blocks_path,
strip_lightrag_doc_prefix,
)
doc_format = ctx.content_data.get("parse_format", FULL_DOCS_FORMAT_LIGHTRAG)
merged_text = strip_lightrag_doc_prefix(
ctx.content_data.get("content"), doc_format
)
# ``sidecar_location`` may be absent on historical/abnormal rows; tolerate
# it (blocks_path="") rather than failing or re-routing to extraction.
blocks_path = (
sidecar_blocks_path(ctx.content_data.get("sidecar_location")) or ""
)
return ParseResult(
doc_id=ctx.doc_id,
file_path=ctx.file_path,
parse_format=doc_format,
content=merged_text,
blocks_path=blocks_path,
parse_stage_skipped=True,
)
class PassthroughParser(BaseParser):
"""Pass ``raw``-format content through verbatim (no parser ran)."""
engine_name = "passthrough"
async def parse(self, ctx: ParseContext) -> ParseResult:
return ParseResult(
doc_id=ctx.doc_id,
file_path=ctx.file_path,
parse_format=FULL_DOCS_FORMAT_RAW,
content=ctx.content_data.get("content", ""),
blocks_path="",
parse_stage_skipped=True,
)