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:
@@ -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):
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
@@ -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
@@ -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():
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user