feat(evaluation): support OpenAI models in jobbench and deep-swe harnesses - #162
Merged
Merged
Conversation
…esses Both harnesses were Anthropic-only on the model-under-test path. Provider selection is now derived from --model at runtime, so an OpenAI model and claude-sonnet-5 can both be run from the same tree. Per harness: - New providers.py maps a model id to a provider family and carries the per-family constants (credential env vars, provider module, opencode provider id and npm package). - The amplifier-agent arm selects the provider module by family and pins base_url explicitly rather than relying on SDK environment fallback. - The amplifier-foundation arm emits a family-appropriate settings.yaml, dropping the Anthropic-only caching and long-context keys on the OpenAI path, where they are not consumed. - The opencode-vanilla arm uses the family's ai-sdk package and provider id, with the base URL in provider options. The Anthropic-specific /v1 URL normalisation no longer runs for OpenAI, which already carries it. - Rate cards gain gpt-5.6-terra so recomputed cost is a real number rather than "not available". deep-swe additionally: - agent_env() forwards only the selected family's credentials. - network_allowlist() opens the selected family's API host. This is load-bearing: tasks run no-network behind an egress proxy, so without it every request is blocked before it reaches the model. - The preflight credential check keys off the selected family, so an OpenAI run no longer requires an unused Anthropic key. jobbench additionally: - The trial launch profile passes OpenAI credentials through to the container. Reasoning effort is pinned to "high" for all three arms on the OpenAI path, from a single REASONING_EFFORT constant per harness. The arms previously inherited differing defaults, which made reasoning-token volume incomparable across stacks. The claude-sonnet-5 path is unchanged: generated configuration is byte-identical to before for every arm. 🤖 Generated with [Amplifier](https://github.com/microsoft/amplifier) Co-Authored-By: Amplifier <240397093+microsoft-amplifier@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Both benchmark harnesses were Anthropic-only on the model-under-test path. Provider selection is now derived from
--modelat runtime, so an OpenAI model andclaude-sonnet-5can both be run from the same tree without editing code between runs.Scope is the
amplifier-agent,amplifier-foundation, andopencode-vanillaarms. Theopencode-amplifierarm is untouched.Why
Running a benchmark against a different provider previously required hand-editing four separate layers per harness, each of which fails differently when missed. Two of those failures are silent: a missing
base_urlfalls back to the vendor's public endpoint via an SDK default, and a missing rate-card entry reports cost as unavailable rather than wrong. Deriving everything from one input removes that class of mistake.How
Per harness:
providers.pymaps a model id to a provider family and holds the per-family constants: credential env var names, provider module and source, opencode provider id and npm package.amplifier-agentarm selects the provider module by family and pinsbase_urlexplicitly rather than relying on SDK environment fallback.amplifier-foundationarm emits a family-appropriatesettings.yaml. The Anthropic-only caching and long-context keys are dropped on the OpenAI path, where they are not consumed and would be silently inert.opencode-vanillaarm uses the family's ai-sdk package and provider id, with the base URL in provider options. The Anthropic-specific/v1normalisation no longer runs for OpenAI, whose base URL already carries it.gpt-5.6-terra, using the published list rates thatamplifier-module-provider-openaicarries.deep-sweadditionally:agent_env()forwards only the selected family's credentials, rather than handing the container a key for a provider nobody asked to benchmark.network_allowlist()opens the selected family's API host. This one is load-bearing: deep-swe tasks runno-networkbehind an egress proxy, so without it every request is blocked before reaching the model, and the failure surfaces as a network error rather than a model error.jobbenchadditionally:Reasoning effort
Effort is pinned to
highfor all three arms on the OpenAI path, from a singleREASONING_EFFORTconstant per harness. The arms previously inherited different defaults from their respective stacks, which made reasoning-token volume incomparable between them. Changing the one constant re-pins all three together.The Anthropic path is deliberately excluded: it uses a thinking-token budget rather than an effort level, and pinning it is a separate change.
Compatibility
The
claude-sonnet-5path is unchanged. Generated configuration, environment, allowlists, and run commands are byte-identical to before for all three arms, verified by diffing generated output against the pre-change tree.Testing
jobbench: 127 tests pass.deep-swe: 27 tests pass.ruff checkandruff format --checkclean on both.Known follow-ups, not in this change
jobbenchforwards both families' credentials into every trial container via a static passthrough block, wheredeep-swenow selects per family. Rendering that block per trial would make the two harnesses consistent.deep-sweallowlist appends the vendor's default API host even when a base URL override is set, which leaves the public endpoint reachable on a run intended for a proxy.