Files
nvi/docs/graphs/architecture.dot

82 lines
2.5 KiB
Plaintext

digraph nvi {
rankdir=TB;
bgcolor="#161b22";
fontname="JetBrains Mono";
fontcolor="#c9d1d9";
node [
shape=box,
style="rounded,filled",
fillcolor="#21262d",
color="#30363d",
fontname="JetBrains Mono",
fontcolor="#c9d1d9",
fontsize=11,
];
edge [color="#8b949e", fontname="JetBrains Mono", fontcolor="#8b949e", fontsize=10];
user [label="user question", fillcolor="#1f6feb", fontcolor="#ffffff"];
subgraph cluster_l3 {
label="L3 — Plan";
color="#30363d";
fontcolor="#58a6ff";
fontsize=11;
plan [label="planner\n(1 LLM call → ordered Analyses)"];
}
subgraph cluster_l2 {
label="L2 — Analyses (mini-agents)";
color="#30363d";
fontcolor="#58a6ff";
fontsize=11;
direct [label="direct_answer\n(CoT, one shot)"];
compare [label="compare_periods\n(CoT, 2 periods)"];
drill [label="drill_down\n(ReAct loop)"];
planned [label="find_outliers · correlate\n(planned)",
style="rounded,filled,dashed", fontcolor="#6e7681"];
}
subgraph cluster_l1 {
label="L1 — Atomic actions (deterministic, no LLM)";
color="#30363d";
fontcolor="#58a6ff";
fontsize=11;
compose [label="compose(pick, recon)\n→ SQL"];
exec [label="execute_sql\n→ rows"];
}
subgraph cluster_l0 {
label="L0 — Recon + dataset setup (foundation)";
color="#30363d";
fontcolor="#58a6ff";
fontsize=11;
recon [label="recon\nknowledge graph"];
setup [label="schema_docs.yaml · metrics.yaml\nencodings · DDL extract", fontcolor="#8b949e"];
}
warehouse [label="Postgres\nBIRD financial", fillcolor="#388bfd33"];
langfuse [label="Langfuse (lng, WG)", fillcolor="#bf4b8a33", fontcolor="#ffffff"];
synth [label="synthesize\nfindings → answer"];
// General → specific flow.
user -> plan;
plan -> direct; plan -> compare; plan -> drill;
direct -> compose [label="typed Pick"];
compare -> compose;
drill -> compose [label="typed Pick"];
drill -> drill [label="iterate on results", color="#bf4b8a", fontcolor="#bf4b8a"];
compose -> exec;
exec -> warehouse;
direct -> synth; compare -> synth; drill -> synth;
// L0 is consulted by every layer above (not a one-way cascade).
setup -> recon [label="make recon"];
recon -> plan [style=dashed, label="brief names", constraint=false];
recon -> compose [style=dashed, label="columns · joins · metrics", constraint=false];
// Observability.
plan -> langfuse [style=dotted, label="spans"];
compose -> langfuse [style=dotted];
exec -> langfuse [style=dotted];
}