runbios-mcp 0.2.14-dev.249 → 0.2.14-dev.253

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/server.js CHANGED
@@ -3099,7 +3099,7 @@ create (1-5 choices), and the queue itself stays opt-in.`,
3099
3099
  server.tool("loop_create_build_rule", "Stand up a STANDING instruction to build a training set whenever enough new reviewed work exists — the automatic version of loop_build_dataset. The manual path asks somebody to notice that enough conversations have been reviewed, remember which filters describe the slice they care about, and press build, every time; nobody does that six weeks in, which is how a workspace accumulates reviewed feedback that never becomes a dataset. The `spec` is the same selection loop_build_dataset takes and is replayed verbatim, so an automatic set is identical to a hand-made one. Tell the user what `min_new_rows` means when you set it: it counts rows reviewed SINCE THE LAST BUILD, not the whole corpus — counting the total would fire the rule forever, because a total that has crossed a threshold stays across it.", {
3100
3100
  name: z.string().describe("What to call the series of sets this rule produces, e.g. 'nightly support sft'. Each build is named after it plus a timestamp. Must be unique in the workspace: two rules writing the same name make the series unreadable."),
3101
3101
  method: z.enum(["sft", "dpo", "grpo", "kto"]).describe("Which training method the sets are curated for"),
3102
- min_new_rows: z.number().int().optional().describe("Rows reviewed since the last build before this fires again. Minimum 10, default 50. A set built from fewer trains nothing and buries the useful ones."),
3102
+ min_new_rows: z.number().int().min(100).optional().describe("Rows reviewed since the last build before this fires again. Minimum 100, default 100. A set built from fewer is too small to learn from and buries the useful ones."),
3103
3103
  enabled: z.boolean().optional().describe("Default true. false stores the rule without running it."),
3104
3104
  spec: z.record(z.string(), z.any()).optional().describe("The selection, same shape as loop_build_dataset: deployment_id, label, attributes, model, origin, holdout_percent, max_items, sample. Omit for the whole corpus."),
3105
3105
  }, async ({ name, method, min_new_rows, enabled, spec }) => {
@@ -3109,7 +3109,7 @@ create (1-5 choices), and the queue itself stays opt-in.`,
3109
3109
  });
3110
3110
  return json(data);
3111
3111
  });
3112
- server.tool("loop_list_build_rules", "The standing build rules, with what each one last did and why. READ last_reason BACK TO THE USER when they ask why no dataset appeared: a rule that is quiet because it is waiting looks exactly like one that is quiet because it is broken, and that field is the only thing that tells them apart — 'waiting: 3 reviewed since the last build, needs 10'.", {}, async () => json(await client.api("/api/loop/build-rules")));
3112
+ server.tool("loop_list_build_rules", "The standing build rules, with what each one last did and why. READ last_reason BACK TO THE USER when they ask why no dataset appeared: a rule that is quiet because it is waiting looks exactly like one that is quiet because it is broken, and that field is the only thing that tells them apart — 'waiting: 3 reviewed since the last build, needs 100'.", {}, async () => json(await client.api("/api/loop/build-rules")));
3113
3113
  server.tool("loop_delete_build_rule", "Stop a standing build rule. The training sets it already produced are untouched — this stops future builds, it does not undo past ones.", { rule_id: z.string().describe("The rule's id, from loop_list_build_rules") }, async ({ rule_id }) => json(await client.api(`/api/loop/build-rules/${encodeURIComponent(rule_id)}`, { method: "DELETE" })));
3114
3114
  server.tool("loop_list_datasets", "List the training sets built in this workspace, each with how many rows it kept, how many conversations were considered, and why the rest were left out.", {
3115
3115
  method: z.enum(["sft", "dpo", "grpo", "kto"]).optional(),
@@ -3198,7 +3198,7 @@ create (1-5 choices), and the queue itself stays opt-in.`,
3198
3198
  cadence_hour_utc: z.number().int().min(0).max(23).optional().describe("The UTC hour the rule is due. The platform adds its own per-rule jitter so ten thousand rules are not all due at once."),
3199
3199
  cadence_weekday: z.number().int().min(0).max(6).nullable().optional().describe("0 is Sunday. null DROPS the weekday, which is what a weekly rule moved to daily needs."),
3200
3200
  combinator: z.enum(["and", "or"]).optional().describe("'and' fires only when the schedule is due AND enough new rows exist; 'or' fires on either"),
3201
- min_new_rows: z.number().int().min(1).nullable().optional().describe("Rows reviewed SINCE THE LAST FIRING, not the whole corpus. null removes the row floor, leaving the schedule as the only trigger."),
3201
+ min_new_rows: z.number().int().min(100).nullable().optional().describe("Rows reviewed SINCE THE LAST FIRING, not the whole corpus. At least 100. null removes the row floor, leaving the schedule as the only trigger."),
3202
3202
  max_versions: z.number().int().min(1).max(10).optional().describe("How many versions this pipeline may make, 1 to 10; five if absent on a create, unchanged if absent on an update. A version is a trained model whose comparison scored conversations, or one a member put live. At the limit the pipeline stops and a manual run is refused with VERSION_LIMIT_REACHED until the limit is raised. Each version is a paid run, so the limit is also a bound on how many the rule will pay for."),
3203
3203
  explore_recipes: z.boolean().optional().describe("MONEY-BEARING. true lets the pipeline, once it has made a version and nothing reviewed since adds anything new to train on (nothing was reviewed, or the reviews give it no row the last version's set lacked, such as thumbs-down with no correction), train the SAME base model on the SAME conversations with ONE training setting changed (the learning rate, the epochs, the LoRA rank) and compare it like any other version; it only takes over if it beats the model serving the app. Every such variant is a FULL PAID RUN inside the rule's per-run ceilings and its monthly limit, so changing it in EITHER direction changes the terms: turning it on or off pauses the rule, and it makes no version of any kind until somebody accepts the terms again. Turning it off to save money stops the pipeline too. Say that before you set it. Absent on a create means off; absent on an update leaves it alone."),
3204
3204
  }).optional(),
@@ -3236,13 +3236,13 @@ create (1-5 choices), and the queue itself stays opt-in.`,
3236
3236
  candidate_ceiling_cents: z.number().int().min(1).optional().describe("The hard stop on the candidate's serving spend for one run, in cents"),
3237
3237
  eval_ceiling_cents: z.number().int().min(1).optional().describe("The hard stop on the comparison's model calls for one run, in cents"),
3238
3238
  monthly_ceiling_cents: z.number().int().min(1).nullable().optional().describe("The monthly limit. A run starts only if the most this rule's runs this UTC calendar month can have cost (month_spent_cents, an upper bound, not an exact spend), plus the most one more run can cost, fits under it. null REMOVES the monthly cap; absent leaves it exactly where it stands."),
3239
- eval_max_rows: z.number().int().min(1).optional().describe("How many held-out conversations the comparison scores"),
3239
+ eval_max_rows: z.number().int().min(20).max(500).optional().describe("How many held-out conversations the comparison scores, 20 to 500 and never below evaluation.min_holdout_rows. 100 if absent on a create."),
3240
3240
  }).optional(),
3241
3241
  evaluation: z.object({
3242
3242
  judge_id: z.string().nullable().optional().describe("The rubric that scores both answers (loop_list_judges). null removes the judge from this rule."),
3243
3243
  judge_model: z.string().nullable().optional().describe("Override the judge's own advisory model. null drops the override."),
3244
3244
  graders_scope: z.enum(["source", "all", "none"]).optional().describe("Which deterministic graders also run: the source's own, every grader in the workspace, or none"),
3245
- min_holdout_rows: z.number().int().min(1).optional().describe("Below this the run refuses to fire rather than reporting a verdict from a handful of rows"),
3245
+ min_holdout_rows: z.number().int().min(20).optional().describe("The fewest held-back conversations that may decide a comparison. At least 20, and 20 if absent on a create. Below this the run refuses to fire rather than reporting a verdict from a handful of rows"),
3246
3246
  eval_max_tokens: z.number().int().min(1).optional(),
3247
3247
  }).optional(),
3248
3248
  promotion: z.object({
@@ -3359,7 +3359,7 @@ create (1-5 choices), and the queue itself stays opt-in.`,
3359
3359
  server.tool("loop_update_build_rule", "Edit or pause a standing build rule: its row floor, its selection, or whether it runs at all. Send only what is changing. A build rule OWNED BY AN ENABLED TRAINING RULE refuses a change of spec.deployment_id with a 409, because that would silently retrain a live model on a different slice of conversations than the one its consent was priced against.", {
3360
3360
  rule_id: z.string().describe("The build rule's id, from loop_list_build_rules"),
3361
3361
  enabled: z.boolean().optional().describe("false stores the rule without running it"),
3362
- min_new_rows: z.number().int().min(1).optional().describe("Rows reviewed since the last build before it fires again"),
3362
+ min_new_rows: z.number().int().min(100).optional().describe("Rows reviewed since the last build before it fires again. Minimum 100."),
3363
3363
  spec: z.record(z.string(), z.any()).optional().describe("The selection, same shape as loop_build_dataset"),
3364
3364
  }, async ({ rule_id, enabled, min_new_rows, spec }) => json(await client.api(`/api/loop/build-rules/${encodeURIComponent(rule_id)}`, {
3365
3365
  method: "PUT",