Port the options-block merging logic from SimpleLLMAgent._resolve_llm()
(stream_router.py, added in PR #11225 / commit b3851693) to the parallel
resolution path ToolCallingLLMCaller._resolve_llm() in tool_caller.py.
Without this fix, running an actor with --skill would ignore the options
block in the actor YAML, causing openai_api_base and openai_api_key to be
silently dropped. The provider registry then fell back to OPENAI_API_KEY
from the environment, routing requests to api.openai.com instead of the
configured local llama-swap/llama.cpp backend (HTTP 401).
Changes:
- tool_caller.ToolCallingLLMCaller._resolve_llm: read actor_config.options;
extract openai_api_key -> __api_key_sentinel; forward allowed keys
(openai_api_base, timeout, top_p, frequency_penalty, presence_penalty);
reject reserved keys (provider_type, model_id) and unknown keys with
logger.warning, matching SimpleLLMAgent behaviour exactly.
- features/actor_run_tool_calling.feature: add five BDD regression
scenarios (section V, tagged @tdd_issue @tdd_issue_11243) covering
api_base+key forwarding, allowed extra keys, reserved key rejection,
unknown key rejection, and top-level precedence over options.
- features/steps/actor_run_tool_calling_steps.py: add corresponding step
definitions for all five scenarios.
All nox quality gates pass (lint, typecheck, unit_tests 15822/0 fail,
integration_tests 1999/0 fail, coverage_report 97%).
ISSUES CLOSED: #11243