File size: 1,759 Bytes
cdd2f89
 
1dd0cc1
 
 
 
 
 
 
 
 
 
 
 
cdd2f89
 
 
 
 
 
 
 
 
 
1dd0cc1
cdd2f89
 
1dd0cc1
 
 
 
 
 
 
 
 
cdd2f89
1dd0cc1
 
 
 
 
 
 
 
 
 
 
 
 
cdd2f89
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from typing import List, Literal, Optional

from pydantic import BaseModel, Field


class DocumentMetadata(BaseModel):
    file_name: str
    page_count: int
    character_count: int
    extraction_method: str
    parsing_notes: str


class DocumentChunk(BaseModel):
    chunk_id: int = Field(ge=1)
    page_number: int = Field(ge=1)
    text: str


class DocumentFinding(BaseModel):
    """A structured finding that remains traceable to the source document."""

    finding_id: str
    category: Literal["key_fact", "entity", "date", "risk", "action_item"]
    text: str
    page_number: int = Field(ge=1)
    chunk_id: Optional[int] = Field(default=None, ge=1)


class DocumentSummary(BaseModel):
    executive_summary: str
    key_facts: List[str] = Field(default_factory=list)
    key_entities: List[str] = Field(default_factory=list)
    important_dates: List[str] = Field(default_factory=list)
    risks_or_issues: List[str] = Field(default_factory=list)
    action_items: List[str] = Field(default_factory=list)
    findings: List[DocumentFinding] = Field(default_factory=list)


class TableExtraction(BaseModel):
    table_id: int
    page_number: Optional[int] = None
    rows: List[dict] = Field(default_factory=list)


class DocumentIntelligenceReport(BaseModel):
    metadata: DocumentMetadata
    summary: DocumentSummary
    chunks: List[DocumentChunk]
    tables: List[TableExtraction] = Field(default_factory=list)


class DocumentProcessingEvent(BaseModel):
    """Observable event emitted by the real deterministic document pipeline."""

    event: str
    message: str
    page_count: Optional[int] = None
    chunk_count: Optional[int] = None
    finding_count: Optional[int] = None
    report: Optional[DocumentIntelligenceReport] = None