Building Layers
A Lattice is built incrementally, one layer at a time. You can call build() for a fully automated pipeline, or step through each layer manually for more control.
Layer types
Each layer controls how nodes are grouped before being passed to the LLM for synthesis.
| Class | Groups by | Required metadata |
|---|---|---|
SessionLayer(n=1) | N consecutive sessions | input_session |
TimeLayer(by="day") | Calendar period (day, week, month, year) | time |
NumberLayer(n=20) | Fixed chunks of N nodes | — |
AllLayer() | All nodes into one group | — |
CustomLayer(fn=...) | Arbitrary splitting function | depends on fn |
Import them from lattice:
from lattice import Sequential, SessionLayer, TimeLayer, NumberLayer, AllLayer, CustomLayer
Defining a config with Sequential
Wrap your layers in a Sequential and pass it to Lattice at construction time (or assign it to l.config before calling build()):
from lattice import Sequential, SessionLayer, TimeLayer, AllLayer
config = Sequential(
TimeLayer(by="day"), # L1: one group per calendar day
AllLayer(), # L2: collapse everything into one top-level insight
)
l = Lattice(..., config=config)
await l.build()
Auto-config
If you don't want to tune the layer structure manually, auto_config() generates a Sequential based on heuristics.
l = Lattice(...)
config = l.auto_config() # infer layers
# or: l.auto_config(target_layer_num=3)
await l.build()
Custom splitting logic
Use CustomLayer when none of the built-in layers fit your grouping needs:
from lattice import CustomLayer
def split_by_topic(nodes):
# return a list of groups (each group is a list of nodes)
...
config = Sequential(CustomLayer(fn=split_by_topic), AllLayer())