* feat(llm): extra request-body fields via LLM_EXTRA_BODY
Some provider parameters, such as OpenAI's service_tier and
safety_identifier, are read only from the request body, so
LLM_EXTRA_HEADERS can't set them. LLM_EXTRA_BODY merges a JSON object
into the body of every request to the configured model, on both routing
paths. A dedicated dedupe model gets its own DEDUPE_LLM_EXTRA_BODY
instead, as with headers.
* fix(config): decode saved JSON-object settings when loading
persist_current() saves env values verbatim, so LLM_EXTRA_HEADERS,
LLM_EXTRA_BODY and their DEDUPE_ variants land in cli-config.json as JSON
text. The loader passed that text unchanged to the dict fields, so a later
launch without the env var failed validation. Decode saved strings for
dict fields, as pydantic-settings does for env vars.
---------
Co-authored-by: Szymon Nastaly <szymon.nastaly@autoform.ch>
A tool call for a name Strix does not register raised ModelBehaviorError
from the SDK turn resolver, which nothing retries: the root agent's raise
tore down the whole scan and a sub-agent died before its status was set.
Opt into the SDK's tool_not_found_behavior="return_error_to_model" so the
unknown call comes back as a tool result and the agent self-corrects.
The setting landed in openai-agents 0.19.0, which requires openai>=2.45,
so both pins move.
feat(inputs): implement logic for required tool choice based on model
test(inputs): add tests for force_required_tool_choice behavior
test(runner): update tests to include force_required_tool_choice in settings