Per-model service tier default (codex: gpt-6.1-sol -> fast), tier:<x> / tier:none labels

executors.<x>.tier_defaults maps a model to the tier used when no label sets one;
a tier:<name> label sets it explicitly and tier:none drops the tier argument.
This commit is contained in:
jj.wang
2026-10-21 08:08:01 +00:00
parent 34b2ba1cc7
commit f2f7e4308a
6 changed files with 38 additions and 1 deletions
+6
View File
@@ -491,6 +491,8 @@ class Agentd:
r["model"] = label[6:] r["model"] = label[6:]
elif label.startswith("effort:"): elif label.startswith("effort:"):
r["effort"] = label[7:] r["effort"] = label[7:]
elif label.startswith("tier:"):
r["tier"] = label[5:]
elif label.startswith("cap:"): elif label.startswith("cap:"):
caps.append(label[4:]) caps.append(label[4:])
elif parse_budget(label) is not None: elif parse_budget(label) is not None:
@@ -503,6 +505,10 @@ class Agentd:
ecfg = self.cfg.executors[r["executor"]] ecfg = self.cfg.executors[r["executor"]]
r["model"] = r["model"] or (ecfg.get("models") or [None])[0] r["model"] = r["model"] or (ecfg.get("models") or [None])[0]
r["effort"] = r["effort"] or ecfg.get("default_effort") r["effort"] = r["effort"] or ecfg.get("default_effort")
if r["tier"] is None: # per-model default unless a label set one; `tier:none` = no tier argument
r["tier"] = (ecfg.get("tier_defaults") or {}).get(r["model"])
if r["tier"] in ("none", ""):
r["tier"] = None
return r return r
def protocol(self, pcfg): def protocol(self, pcfg):
+1
View File
@@ -45,6 +45,7 @@ executors:
run: "codex exec --json -C '{repo}' -s workspace-write -m {model} -c 'model_reasoning_effort=\"{effort}\"' {tier} -o '{out}' -" run: "codex exec --json -C '{repo}' -s workspace-write -m {model} -c 'model_reasoning_effort=\"{effort}\"' {tier} -o '{out}' -"
resume: "codex exec resume {thread} --json -m {model} -c 'model_reasoning_effort=\"{effort}\"' {tier} -o '{out}' -" resume: "codex exec resume {thread} --json -m {model} -c 'model_reasoning_effort=\"{effort}\"' {tier} -o '{out}' -"
tier_arg: "-c 'service_tier=\"{tier}\"'" tier_arg: "-c 'service_tier=\"{tier}\"'"
tier_defaults: {gpt-6.1-sol: fast} # tier when no label sets one (`tier:<x>`, `tier:none` = no tier)
thread_from: events.jsonl:thread.started.thread_id thread_from: events.jsonl:thread.started.thread_id
last_message: '{out}' last_message: '{out}'
models: [gpt-6.1-sol, gpt-6-astra] models: [gpt-6.1-sol, gpt-6-astra]
+1
View File
@@ -44,6 +44,7 @@ executors:
# `exec resume` takes no -C/-s: the runner already cd's into the repo, the sandbox goes in as a -c override # `exec resume` takes no -C/-s: the runner already cd's into the repo, the sandbox goes in as a -c override
resume: "codex exec resume {thread} --json -m {model} -c 'model_reasoning_effort=\"{effort}\"' -c 'sandbox_mode=\"workspace-write\"' {tier} -o '{out}' -" resume: "codex exec resume {thread} --json -m {model} -c 'model_reasoning_effort=\"{effort}\"' -c 'sandbox_mode=\"workspace-write\"' {tier} -o '{out}' -"
tier_arg: "-c 'service_tier=\"{tier}\"'" tier_arg: "-c 'service_tier=\"{tier}\"'"
tier_defaults: {gpt-6.1-sol: fast} # tier when no label sets one (`tier:<x>`, `tier:none` = no tier)
thread_from: events.jsonl:thread.started.thread_id thread_from: events.jsonl:thread.started.thread_id
last_message: '{out}' last_message: '{out}'
models: [gpt-6.1-sol, gpt-6-astra] models: [gpt-6.1-sol, gpt-6-astra]
+1
View File
@@ -76,6 +76,7 @@
"default_effort": {"type": "string"}, "default_effort": {"type": "string"},
"permission_mode": {"type": "string"}, "permission_mode": {"type": "string"},
"tier_arg": {"type": "string"}, "tier_arg": {"type": "string"},
"tier_defaults": {"type": "object", "additionalProperties": {"type": "string"}},
"script": {"type": "string"} "script": {"type": "string"}
} }
}, },
+2 -1
View File
@@ -9,7 +9,8 @@ from agentd.store import Store
STATES = {"Backlog": "s-bl", "Todo": "s-todo", "In Progress": "s-run", "Waiting": "s-wait", "Review": "s-rev", "Done": "s-done"} STATES = {"Backlog": "s-bl", "Todo": "s-todo", "In Progress": "s-run", "Waiting": "s-wait", "Review": "s-rev", "Done": "s-done"}
MEMBERS = {"window10": "u-w10", "oregon": "u-or", "kappiee": "u-k"} MEMBERS = {"window10": "u-w10", "oregon": "u-or", "kappiee": "u-k"}
LABELS = {"model:astra": "l-astra", "needs-game": "l-game", "exec:claude": "l-claude", "budget:30m": "l-b30", "cap:gpu": "l-gpu"} LABELS = {"model:astra": "l-astra", "needs-game": "l-game", "exec:claude": "l-claude", "budget:30m": "l-b30", "cap:gpu": "l-gpu",
"tier:none": "l-tnone", "tier:flex": "l-tflex"}
def config_data(): def config_data():
+27
View File
@@ -362,5 +362,32 @@ class EnvFailureTest(unittest.TestCase):
h.close() h.close()
class TierDefaultTest(unittest.TestCase):
"""executors.<x>.tier_defaults: tier per model unless a label (`tier:<x>`, `tier:none`) sets one."""
def run_with(self, labels):
data = config_data()
data["executors"]["codex"]["tier_defaults"] = {"sol": "fast"}
h = Harness(data)
try:
iid = h.plane.add_issue(1, labels=labels)
h.tick()
return h.execs[("win10", "codex")].started[0].tier, h.plane.texts(iid)[-1]
finally:
h.close()
def test_default_model_gets_its_tier(self):
tier, text = self.run_with(())
self.assertEqual(tier, "fast")
self.assertIn("codex / sol / medium / fast @ win10", text)
def test_other_model_has_no_default(self):
self.assertIsNone(self.run_with(("model:astra",))[0])
def test_labels_override(self):
self.assertEqual(self.run_with(("tier:flex",))[0], "flex")
self.assertIsNone(self.run_with(("tier:none",))[0])
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()