File size: 2,878 Bytes
0762fba
a688aff
0762fba
a688aff
5f7dc7e
a688aff
 
 
 
0762fba
a688aff
 
0762fba
 
 
a688aff
 
 
 
 
 
 
 
 
0762fba
 
5f7dc7e
 
 
0762fba
 
 
a688aff
5f7dc7e
a688aff
 
 
 
 
 
0762fba
a688aff
 
0762fba
 
a688aff
5f7dc7e
a688aff
 
5f7dc7e
a688aff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0762fba
 
 
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
63
64
65
66
67
68
69
70
71
from langgraph.graph import StateGraph, END
from langgraph.types import Send
from backend.graph.state import BrainState
from backend.graph.nodes.load_sources import load_sources
from backend.graph.nodes.chunk_documents import chunk_documents
from backend.graph.nodes.extract_decisions import extract_decisions
from backend.graph.nodes.extract_workflows import extract_workflows
from backend.graph.nodes.extract_exceptions import extract_exceptions
from backend.graph.nodes.detect_contradictions import detect_contradictions
from backend.graph.nodes.synthesize_skills import synthesize_skills
from backend.graph.nodes.link_evidence import link_evidence
from backend.graph.nodes.score_confidence import score_confidence
from backend.graph.nodes.write_brain import write_brain


def route_to_extraction(state: BrainState) -> list[Send]:
    return [
        Send("extract_decisions", dict(state)),
        Send("extract_workflows", dict(state)),
        Send("extract_exceptions", dict(state)),
        Send("detect_contradictions", dict(state)),
    ]


def build_compilation_graph() -> StateGraph:
    """
    load_sources → chunk_documents → route_to_extraction (Send fan-out)
    → [extract_decisions, extract_workflows, extract_exceptions, detect_contradictions] (parallel)
    → synthesize_skills → link_evidence → score_confidence → write_brain
    """
    workflow = StateGraph(BrainState)

    workflow.add_node("load_sources", load_sources)
    workflow.add_node("chunk_documents", chunk_documents)

    workflow.add_node("extract_decisions", extract_decisions)
    workflow.add_node("extract_workflows", extract_workflows)
    workflow.add_node("extract_exceptions", extract_exceptions)
    workflow.add_node("detect_contradictions", detect_contradictions)

    workflow.add_node("synthesize_skills", synthesize_skills)
    workflow.add_node("link_evidence", link_evidence)
    workflow.add_node("score_confidence", score_confidence)
    workflow.add_node("write_brain", write_brain)

    workflow.set_entry_point("load_sources")
    workflow.add_edge("load_sources", "chunk_documents")

    workflow.add_conditional_edges(
        "chunk_documents",
        route_to_extraction,
        [
            "extract_decisions",
            "extract_workflows",
            "extract_exceptions",
            "detect_contradictions",
        ],
    )

    workflow.add_edge("extract_decisions", "synthesize_skills")
    workflow.add_edge("extract_workflows", "synthesize_skills")
    workflow.add_edge("extract_exceptions", "synthesize_skills")
    workflow.add_edge("detect_contradictions", "synthesize_skills")

    workflow.add_edge("synthesize_skills", "link_evidence")
    workflow.add_edge("link_evidence", "score_confidence")
    workflow.add_edge("score_confidence", "write_brain")
    workflow.add_edge("write_brain", END)

    return workflow.compile()