Hello,
a quick update. Community version is taking shape. Here it is its roadmap (v.1b):
Community 0.1b — Lean Roadmap
1) Conversation history (short context)
-
Scope: keep N last exchanges in memory per session.
-
DoD: flag history.enabled, history.max_turns; test validates truncation.
-
Dep.: storage in file/SQLite.
-
Risk: context leakage — log final size.
2) Multi-model support
-
Scope: driver/adapter with unified interface (generate(), stream()), mapping Llama/Qwen/Mistral/…
-
DoD: switch by config (model.name, model.path, backend), smoke test per backend.
-
Dep.: inference libs (e.g., llama.cpp/gguf, vllm/ctransformers).
3) Report size limit per model
-
Scope: table model_limits.json (context/input, max output tokens).
-
DoD: validation before sending prompt; clear error message and chunking suggestion.
-
Dep.: token count normalizer (≈4 chars/token, override per backend).
4) Gnuplot support (dumb terminal)
-
Scope: run .gp scripts and capture ASCII output with set term dumb.
-
DoD: command gnuplot.run(script, data_path) returns ASCII block; tested with simple chart.
-
Dep.: gnuplot binary available; exec sandbox.
5) Prompt template
-
Scope: templates with placeholders ({{report}}, {{instructions}}, {{neg}}).
-
DoD: simple engine (Mustache/format), validation for missing placeholders.
-
Dep.: file templates/*.tmpl.
6) Negative prompt
-
Scope: optional field negative_prompt injecting avoidance instructions in template.
-
DoD: if present, appears in “Do not…” section of the template; basic A/B test.
7) Save conversation (last only)
-
Scope: persist only the last full session (input/output) for reopening.
-
DoD: file last_session.json with checksum; “restore last” command.
-
Dep.: same storage as item 1.
8) Mistral support
-
Scope: load Mistral weights (e.g., 7B/NeMo quantized) via same model adapter.
-
DoD: selection model.family = "mistral" + basic generation works.
-
Dep.: GGUF/compatible formats.
A few observations:
- I’ve decided to use SQLite as the primary data store. It’s convenient and ubiquitous (macOS, Linux, Windows, and mainframes), and the same data file is compatible across all environments, including big-endian mainframes.
- The report buffer supports up to 50 pages at 160 columns each, which should cover ~99% of analytics reports. The page limit may vary by model and processing cost (execution time, in this case); the Pro version will also account for cloud pricing.
- The Pro version will include guardrails to prevent excessive cloud charges.
I stumbled across Gnuplot recently, and I’m impressed by its ability to generate ASCII charts instead of images. This allows older or SSH-only terminals to display basic analytics. The example below is a quick proof of concept and still needs improvements—for instance, each KPI should use its own distinct characters for visual differentiation. I don’t expect end users to rely on this; it’s mainly intended as a development aid. The model can also be directed to generate CSV data from the analysis, which can then be uploaded by some agent to somewhere (a path, a database, or even a cloud bucket) and consumed by more sophisticated tools such as Power BI, Tableau, or QuickSight.
Also, gnuplot can generate rich graphical charts as a image file (e.g., PNG, SVG, or PDF) with full control over colors, fonts, and annotations. This will be probably the way to interact with data in Pro version using CGI.
LLama 3.1 created the script that generated the chart below, but failed with some more complexes charts. Probably it would be better handled by an agent.
Last Year vs This Year Sales Comparison
60000 +-----------------------------------------------+
| + +++ + + + + + + + + + + + | This YTD +-----+
| | | Last YTD +-----+
50000 |-+........|..................................+-|
| | |
| | |
40000 |-+........|..................................+-|
| | |
| | |
30000 |-+........|..................................+-|
| | |
| ++| + |
20000 |-+......|||.......|..........................+-|
| ||| | |
| ||| + | ++ ++++ + |
10000 |-+......|||.....|.|....||....||||........|...+-|
| ||| | | || |||| | |
| +|||+ + | | +|| +|||| + + | |
0 +-----------------------------------------------+
Just to make sure gnupplot is not underestimated, here it is a graphical example (there are hundreds of examples in the Internet).
gnuplot script
#!/usr/local/bin/gnuplot -persist
# set terminal pngcairo transparent enhanced font "arial,10" fontscale 1.0 size 600, 400
# set output 'boxes3d.6.png'
set boxwidth 0.4 absolute
set boxdepth 0.3
set style fill solid 1.00 border
set grid nopolar
set grid xtics nomxtics ytics nomytics ztics nomztics nortics nomrtics \
nox2tics nomx2tics noy2tics nomy2tics nocbtics nomcbtics
set grid vertical layerdefault lt 0 linecolor 0 linewidth 1.000, lt 0 linecolor 0 linewidth 1.000
unset key
set wall z0 fc rgb "slategrey" fillstyle transparent solid 0.50 border lt -1
unset parametric
set view 59, 24, 1, 1
set style data lines
set xyplane at 0
set title "Full treatment: 3D boxes with pm3d depth sorting and lighting"
set xrange [ * : * ] noreverse writeback
set x2range [ * : * ] noreverse writeback
set yrange [ 0.00000 : 6.00000 ] noreverse nowriteback
set y2range [ * : * ] noreverse writeback
set zrange [ * : * ] noreverse writeback
set cbrange [ * : * ] noreverse writeback
set rrange [ * : * ] noreverse writeback
set pm3d depthorder base
set pm3d interpolate 1,1 flush begin noftriangles border linewidth 1.000 dashtype solid corners2color mean
set pm3d lighting primary 0.5 specular 0.2 spec2 0
set colorbox vertical origin screen 0.9, 0.2 size screen 0.05, 0.6 front noinvert bdefault
rgbfudge(x) = x*51*32768 + (11-x)*51*128 + int(abs(5.5-x)*510/9.)
ti(col) = sprintf("%d",col)
NO_ANIMATION = 1
## Last datafile plotted: "candlesticks.dat"
splot for [col=1:5] 'candlesticks.dat' using 1:(col):(col*column(col)):(rgbfudge($1)) with boxes fc rgb variable