Static & Dynamic Columns
Whether a column holds values you set yourself, or values a producer computes for you
Where a column’s values come from
Every column is either static or dynamic, and that’s a property of the column itself, not of any single row inside it. The difference comes down to where its values come from.
A static column holds values you supply. You type them in, paste them, or set them through the SDK, and a cell only changes when you go back and edit it.
A dynamic column doesn’t hold values you typed, it holds something that fills them for you: a prompt you run over every row, an evaluation, an API call, and more. Every cell in the column is whatever that produced for that row, not something you set by hand. The full set of things a dynamic column can run is cataloged in Dynamic column methods.
Take a dataset with four columns:
| user_query | expected_answer | model_response | is_correct |
|---|---|---|---|
| What is the capital of France? | Paris | Paris | true |
| Who wrote Hamlet? | Shakespeare | William Shakespeare | true |
user_query and expected_answer are static, you wrote them in. model_response is dynamic: a prompt behind the column answers user_query for every row. is_correct is dynamic too: an evaluation behind it compares model_response against expected_answer.
Mental model: producer or no producer
flowchart TD accTitle: How a column's values are sourced accDescr: A static column has nothing filling it, so its cells hold whatever value you set directly. A dynamic column has a prompt or an evaluation behind it, and that fills the value in every row's cell. COL["Column"] --> ST["Static<br/>you fill it"] COL --> DY["Dynamic<br/>something fills it"] ST -->|"you set it"| CS1["Cell · row 1"] ST -->|"you set it"| CS2["Cell · row 2"] DY -->|"runs"| PR["A prompt, or an evaluation"] PR -->|"fills"| CD1["Cell · row 1"] PR -->|"fills"| CD2["Cell · row 2"]
What follows from having a producer behind the column
Several consequences fall directly out of that difference.
It carries a status while the producer runs. A static column has no run to track, so it has no status to show. A dynamic column does: while its producer is working, the column sits in a running state, and if the producer fails, the column shows failed. That status is the tell for whether you’re looking at a value you can trust yet.
It can be re-run, and every row changes at once. The producer behind a dynamic column doesn’t disappear after the first run. Change the prompt, switch the model, fix the eval config, then re-run the column, and every cell it owns recomputes together. Editing a static column, by contrast, is you overwriting one cell at a time; nothing else moves.
Deleting it takes the producer with it. A dynamic column isn’t just the column, it’s the column plus the producer generating it. Delete the column and its producer goes too, along with anything else that was derived from it. Deleting a static column removes only the column and the values sitting in it, there’s no producer behind it to clean up.
Why it matters
Before you touch a column, it’s worth knowing which kind you’re looking at. The consequences above all come from the same root: touch a dynamic column and you’re really touching the prompt or evaluation behind it, not just the cell or the column in front of you.
Keep exploring
Questions & Discussion