mirror of
https://github.com/rennf93/roboco.git
synced 2026-08-03 07:23:24 +02:00
feat(grok): reasoning-effort by role (cut grok-build cost on cheap roles)
grok-build-0.1 reasons heavily by default and reasoning bills at the output rate (a live "say ok" call emitted ~300 reasoning tokens, ~85% of its cost). Confirmed live that opencode's `--variant minimal` cuts reasoning ~54% (298 -> 136 tokens, same prompt). GrokProvider now picks reasoning effort by role: code-quality roles (developer, qa, pr_reviewer) keep full reasoning; coordination / docs / board roles (cell_pm, main_pm, documenter, product_owner, head_marketing, auditor, prompter, secretary) run "minimal". It's passed to opencode via the entrypoint's `--variant`. Operators can force one effort for ALL grok agents with the ROBOCO_GROK_REASONING_EFFORT env (minimal | high | max, or default/full). Tests cover the role map, the env override, and the spawn env wiring.
This commit is contained in:
@@ -23,19 +23,21 @@ from roboco.llm.providers import (
|
||||
ProviderRegistry,
|
||||
SpawnResult,
|
||||
)
|
||||
from roboco.llm.providers.grok import _reasoning_effort_for
|
||||
from roboco.models.base import ModelProvider
|
||||
from roboco.models.runtime import OrchestratorAgentConfig
|
||||
|
||||
|
||||
def _config(
|
||||
*,
|
||||
agent_id: str = "be-dev-1",
|
||||
provider_type: str = "grok",
|
||||
provider_base_url: str | None = "https://api.x.ai/v1",
|
||||
provider_auth_token: str | None = "xai-secret-key",
|
||||
mcp_config_path: Path | None = Path("/host/mcp-configs/be-dev-1.json"),
|
||||
) -> OrchestratorAgentConfig:
|
||||
return OrchestratorAgentConfig(
|
||||
agent_id="be-dev-1",
|
||||
agent_id=agent_id,
|
||||
blueprint_path=Path("/app/system-prompt.md"),
|
||||
model="grok-build-0.1",
|
||||
mcp_config_path=mcp_config_path,
|
||||
@@ -243,6 +245,52 @@ async def test_grok_spawn_raises_on_docker_failure() -> None:
|
||||
await provider.spawn(_config())
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# Reasoning effort by role
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_reasoning_effort_full_for_code_roles() -> None:
|
||||
# developer / qa / pr_reviewer keep full reasoning (no variant).
|
||||
assert _reasoning_effort_for("be-dev-1") is None
|
||||
assert _reasoning_effort_for("be-qa") is None
|
||||
assert _reasoning_effort_for("pr-reviewer-1") is None
|
||||
|
||||
|
||||
def test_reasoning_effort_minimal_for_coordination_roles() -> None:
|
||||
for slug in ("be-pm", "main-pm", "be-doc", "auditor", "product-owner"):
|
||||
assert _reasoning_effort_for(slug) == "minimal", slug
|
||||
|
||||
|
||||
def test_reasoning_effort_override(monkeypatch: pytest.MonkeyPatch) -> None:
|
||||
monkeypatch.setenv("ROBOCO_GROK_REASONING_EFFORT", "max")
|
||||
assert _reasoning_effort_for("be-dev-1") == "max" # override wins over role
|
||||
monkeypatch.setenv("ROBOCO_GROK_REASONING_EFFORT", "default")
|
||||
assert _reasoning_effort_for("be-pm") is None # "default" => full reasoning
|
||||
|
||||
|
||||
async def test_grok_spawn_sets_variant_for_minimal_role() -> None:
|
||||
host = _FakeHost()
|
||||
provider = GrokProvider(host)
|
||||
with patch(
|
||||
"asyncio.create_subprocess_exec", AsyncMock(return_value=_proc())
|
||||
) as exec_mock:
|
||||
await provider.spawn(_config(agent_id="be-pm")) # cell_pm -> minimal
|
||||
cmd = list(exec_mock.call_args.args)
|
||||
assert "ROBOCO_GROK_VARIANT=minimal" in cmd
|
||||
|
||||
|
||||
async def test_grok_spawn_no_variant_for_dev_role() -> None:
|
||||
host = _FakeHost()
|
||||
provider = GrokProvider(host)
|
||||
with patch(
|
||||
"asyncio.create_subprocess_exec", AsyncMock(return_value=_proc())
|
||||
) as exec_mock:
|
||||
await provider.spawn(_config(agent_id="be-dev-1")) # developer -> full
|
||||
cmd = list(exec_mock.call_args.args)
|
||||
assert not any(c.startswith("ROBOCO_GROK_VARIANT=") for c in cmd)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# ClaudeCodeProvider
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user