Skip to content

v2.3.0

Choose a tag to compare

@pgalko pgalko released this 13 Oct 01:40
· 49 commits to main since this release

BambooAI 2.3.0 — routines

An analysis can now be kept as a method and run again, without a model, on new data: a later window from Intervals.icu, the next race from Endura, another athlete behind a new API key, an updated file. Each run is compared with the run before it. Exploration and routine runs are kept apart: you explore with the analyst as before, and a routine is what you keep when you land on something worth repeating.

Routines

  • Save as routine. The Save pill's menu now offers Save as favourite and Save as routine. Saving as a routine reads the finished chain once (one model call, the new Promoter seat), names the few things that vary between runs as inputs — a date window, a race, a file, a number, a choice — and verifies the method by running it once on the original data, checked line by line against what the analysis printed. The routine stays linked to the analysis it came from.
  • Run. The Routines entry in the rail lists your routines. Run asks for the inputs only — nothing to edit, nothing to ask — loads the data the way the original analysis did (an Intervals.icu window, an Endura race, a file uploaded, loaded now or taken from the Dataset cache), tells you what differs from the original before anything runs, and runs the method deterministically. The model never runs the method; it writes a short note on what moved. A run costs cents.
  • Runs, compared. Every result is shown next to the previous run's (or run 0's), with a mark between the two numbers it compares and a trend sparkline from the third run. A run that fails is kept as a run, named at the cell that failed, its results up to that point compared like any other.
  • Versions. Continue the analysis behind a routine (its card opens the favourite), and Save as routine on a later chain of that thread offers the next version. Versions and runs are listed in the manager; the script downloads as a .py with an INPUTS block.
  • Data that fits. A run adapts the data to the method, never the method to the data: the recorded file names open this run's files, a column this data lacks is added empty, a changed type is read back. A date input that only restates the period the data covers follows the data. A load already in the executor's cache is reused, cut to the window asked for; each Intervals.icu key's data is kept apart in the cache (executor image v52).
  • Retired. The 1.x way of running a saved workflow again (Execute, a new analyst chain seeded with the script) is gone; the Routine button stands in its place. The Code tab's Edit and Execute are replaced by Copy and Download (.py), and the editor's CDN scripts leave the page.

The analysis

  • Figures are drawn once, after the report, in a step of their own. Cells compute; the final figures are drawn when the report is written, so the Plots tab holds the figures the report cites and nothing redrawn along the way. The plain-language version cites them too.
  • Follow-ups after the data changed. A follow-up asked after the loaded data changed (another window, a replaced file) starts in a fresh kernel on the data loaded now; the earlier chains stay in its context, marked as on other data. The same file uploaded again — a new session, a favourite reopened — is the same data, and the follow-up continues as before.
  • The contract. A value read off the data — a date in it, a subject's identifier, a threshold — is kept in a named variable rather than typed as a literal, so a method holds when the data is loaded again. A REPORT with nothing under it is no longer taken as the report.

The web app

  • Ask about a plot. The chat button on a plot sends the picture with your question. The analyst's model sees it when its model_properties entry says "multimodal": "true"; otherwise the question goes alone and the pane says so.
  • The Plots tab shows a run's figures in the order they were drawn, and a Plotly figure fills its tab.
  • The Answer tab reads at 92 characters per line (was 76).

Configuration

  • A new seat, Promoter, in every tier of LLM_CONFIG_template.json; a configuration without one uses the analyst's seat.
  • "multimodal": "true" on a model's model_properties entry lets Ask about a plot send the picture.

Hosted edition

  • Stripe: payment_method_types removed from the Checkout call, which Stripe API 2026-09-30 rejects (#63, thanks @brandonphelps1212); stripe pinned to 16.x; the webhook credits an account only once the payment is in.

Upgrading

pip install -U bambooai
bambooai serve

The first start builds the new executor image (bambooai-executor:2.3.0-v52; a few minutes). Favourites, labels and memory are unchanged; routines are stored beside the favourites. If you keep your own copy of the configuration template, the shipped one has the Promoter seat to copy.

Full changelog: v2.2.2...v2.3.0