| name | simba-optimizer-runs |
|---|---|
| description | Run Simba budget optimizations correctly over MCP — payload conventions (percent bounds, laydown/CPM arrays), revenue vs profit objectives, polling by run_id, interpreting decision vs comparison columns, and curating run history. Use when optimizing budgets or reading optimizer results through the Simba MCP tools. |
- Channel keys = ACTIVITY-COLUMN names, case- and space-sensitive. Get
them from
channel_summaryorget_scenario_template(avg_cpu_by_channeldoubles as baseline CPM). boundsare PERCENTAGES oftotal_budget(0–100), not currency.laydown_weightsandperiod_cpmare ARRAYS of lengthnum_periods({"TV": [10, 10, 10, 10]}, never {"TV": 10}); CPMs strictly positive; the same channel keys must appear inbounds,laydown_weights, ANDperiod_cpm.gammais uncertainty aversion (objective = mean − gamma·spread): 0 = maximize expected return; higher = more conservative. Typical dashboard range 0–0.1.
objective="profit"needs a margin: the model's stored operating margin is used automatically; otherwise passforward_marginor the API errors. Result Revenue/ROI columns are then on the profit basis.group_bounds(joint % constraints over channel sets) forces the slsqp engine; a BINDING group's members legitimately sit off the global marginal.
run_optimizerreturns 202 + arun_id("opt_..."). Pollget_optimizer_results(model_hash, run_id=...)— the model-level form reflects only the LATEST run and a newer run overwrites it.- Column conventions must not be mixed in one summary:
Revenue/ROI= the solver's decision math (removal-lift counterfactual).OptimizedEvalRevenue/ROI,HistoricalRevenue/ROI= fitted-convention comparison columns (match the Contributions panel).ObjectiveMarginal(solver's equalized marginal) ≠MroiAtOptimized(posterior mROI at the optimized spend, with 94% HDI) — they can differ by several times; quote the one matching the question.
list_runs(artifact="optimizer"|"scenario", ...): pinned-first then newest-first.countis the PAGE length, not the total — page until a short page. The objective is NOT in summaries: fetch the run'sinputs(profit runs carryobjective: "profit"; revenue runs omit the key).update_runrenames/annotates (setsauto_namedfalse permanently);set_run_pinnedpins declaratively and idempotently. Scenario runs work the same viaget_scenario_results(run_id=...).