diff --git a/strix/entry.py b/strix/entry.py index e669420..0d1b30f 100644 --- a/strix/entry.py +++ b/strix/entry.py @@ -161,7 +161,7 @@ async def run_strix_scan( bus: AgentMessageBus | None = None, interactive: bool = False, max_turns: int = STRIX_DEFAULT_MAX_TURNS, - model: str = "anthropic/claude-sonnet-4-6", + model: str | None = None, cleanup_on_exit: bool = True, ) -> RunResult: """Run one Strix scan end-to-end against a freshly-prepared sandbox. @@ -169,7 +169,7 @@ async def run_strix_scan( Args: scan_config: Per-scan configuration — ``targets``, ``user_instructions``, ``diff_scope``, ``scan_mode``, - ``is_whitebox``, ``skills``. + ``skills``. ``is_whitebox`` is derived from ``targets``. scan_id: Used to key the sandbox session cache. Auto-generated if omitted — callers that want resume-after-crash semantics should pass a stable id. @@ -181,6 +181,9 @@ async def run_strix_scan( interactive: Renders the interactive-mode prompt block on the root agent. max_turns: Cap on root-agent LLM turns (default 300). + model: Litellm model alias. ``None`` (default) reads + :attr:`Settings.llm.model` — caller pre-validates via + :func:`validate_environment` that it's set. cleanup_on_exit: When True (default), tears down the sandbox session in a ``finally``. Set to False for resume scenarios where the caller wants to preserve the container. @@ -192,6 +195,12 @@ async def run_strix_scan( scan_id = f"scan-{uuid.uuid4().hex[:8]}" logger.info("Starting Strix scan %s", scan_id) + resolved_model = model or load_settings().llm.model + if not resolved_model: + raise RuntimeError( + "No LLM model configured. Set STRIX_LLM env or pass model= to run_strix_scan().", + ) + # Caller may pre-create the bus so it can hold a handle (e.g., the # TUI uses it to route stop / chat-input commands). Otherwise we # own the bus internally for the scan's lifetime. @@ -244,7 +253,7 @@ async def run_strix_scan( agent_id=root_id, parent_id=None, tracer=tracer, - model=model, + model=resolved_model, max_turns=max_turns, is_whitebox=is_whitebox, diff_scope=diff_scope, @@ -258,7 +267,7 @@ async def run_strix_scan( run_config = make_run_config( sandbox_session=bundle["session"], sandbox_client=bundle["client"], - model=model, + model=resolved_model, reasoning_effort=reasoning_effort, ) diff --git a/strix/run_config_factory.py b/strix/run_config_factory.py index a2a7f50..40153d0 100644 --- a/strix/run_config_factory.py +++ b/strix/run_config_factory.py @@ -55,7 +55,7 @@ DEFAULT_RETRY = ModelRetrySettings( def make_run_config( *, sandbox_session: BaseSandboxSession | None, - model: str = "anthropic/claude-sonnet-4-6", + model: str, reasoning_effort: Literal["low", "medium", "high"] | None = None, model_settings_override: ModelSettings | None = None, sandbox_client: Any | None = None, @@ -71,8 +71,8 @@ def make_run_config( this scan (one container per scan; see :mod:`strix.runtime.session_manager`). ``None`` is allowed for unit tests and dry runs. - model: Model alias passed to ``MultiProvider``. Defaults to the - production Anthropic alias. + model: Litellm model alias passed to ``MultiProvider``. Caller + resolves from :attr:`Settings.llm.model`. reasoning_effort: ``"low" | "medium" | "high"``; routes to ``ModelSettings.reasoning``. model_settings_override: Optional per-run ``ModelSettings`` @@ -117,7 +117,7 @@ def make_agent_context( agent_id: str, parent_id: str | None, tracer: Any | None, - model: str = "anthropic/claude-sonnet-4-6", + model: str, model_settings: ModelSettings | None = None, max_turns: int = 300, is_whitebox: bool = False, diff --git a/strix/tools/agents_graph/tools.py b/strix/tools/agents_graph/tools.py index 11c9bd5..03b21ca 100644 --- a/strix/tools/agents_graph/tools.py +++ b/strix/tools/agents_graph/tools.py @@ -446,7 +446,7 @@ async def create_agent( agent_id=child_id, parent_id=parent_id, tracer=inner.get("tracer"), - model=inner.get("model", "anthropic/claude-sonnet-4-6"), + model=inner["model"], model_settings=inner.get("model_settings"), max_turns=int(inner.get("max_turns", 300)), is_whitebox=bool(inner.get("is_whitebox", False)), @@ -458,7 +458,7 @@ async def create_agent( child_run_config = make_run_config( sandbox_session=inner.get("sandbox_session"), sandbox_client=inner.get("sandbox_client"), - model=inner.get("model", "anthropic/claude-sonnet-4-6"), + model=inner["model"], model_settings_override=inner.get("model_settings"), )