Spaces:
Running
title: ChartSage-4B Demo
emoji: 📊
colorFrom: indigo
colorTo: green
sdk: static
pinned: false
license: apache-2.0
ChartSage-4B live demo
Give it a data table and ask for a chart. The page runs the request through the base model
(google/gemma-3-4b-it) and through ChartSage-4B side by side, then executes both
pieces of generated code and shows you the actual rendered charts.
That last part is the point. This entry is not about producing plausible-looking code, it is about producing code that runs. On the public benchmark the base model writes code that crashes on 34 of 50 tasks, mostly because it tries to re-parse the table JSON, and it fails to terminate on 9 more. You can watch that happen here rather than take our word for it.
- Model: https://huggingface.co/Jainamshahhh/chartsage-4b
- Dataset (ChartForge, 117,600 verified rows): https://huggingface.co/datasets/Jainamshahhh/chartforge
The first two examples are real rows from the public TableBench evaluation set, reproduced verbatim, and both are cases the base model actually fails: a 20-row league table where the request asks only for the top 5, and a 10-row table whose numbers carry thousands separators next to a filler column full of nulls. Use those. Tidy little synthetic tables are not where the difference lives, and an earlier version of this page defaulted to one, which showed parity and proved nothing.
The last two examples are easy synthetic tables where both models succeed. They stay on the page on purpose, because a demo that only ever shows the base losing invites the reader to assume it was arranged that way.
The container has pandas and numpy installed, matching the environment our reported numbers were measured in. This is deliberate: the base model reaches for pandas in most of its answers, so running it without pandas would make it fail for a reason that has nothing to do with the model, and the comparison would be worthless.
The GPU backend scales to zero when idle, so the first request after a quiet period may take up to a minute to warm up. Generated code is executed in an isolated container with a hard timeout, matplotlib only.