Skip to content

model-provider: route model discovery through HTTP client factory#31361

Draft
bolinfest wants to merge 1 commit into
pr31442from
pr31361
Draft

model-provider: route model discovery through HTTP client factory#31361
bolinfest wants to merge 1 commit into
pr31442from
pr31361

Conversation

@bolinfest

@bolinfest bolinfest commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

Why

Model discovery is a startup-critical request path, but it still constructed a default reqwest client directly. That meant features.respect_system_proxy could apply to Responses API traffic while /models catalog refreshes bypassed the same resolved proxy policy.

This is the next focused migration on top of #31342. It makes the proxy decision mandatory at the model-provider boundary rather than adding another optional flag a caller could omit.

What changed

  • Require an HttpClientFactory when constructing a ModelProvider models manager.
  • Pass the factory resolved from Config through codex-core into the OpenAI models endpoint.
  • Build the /models transport with the route-aware API client and the full request destination.
  • Keep the Amazon Bedrock provider unchanged functionally because its model catalog is static.
  • Give test-only construction an explicit ReqwestDefault policy.

Review guide

  1. model-provider/src/provider.rs adds the required factory to the provider API.
  2. model-provider/src/models_endpoint.rs is the behavior change that routes /models through the shared client policy.
  3. core/src/thread_manager.rs supplies the feature-derived factory; the remaining edits update test and alternate-provider construction.

Validation

  • cargo check --tests -p codex-model-provider -p codex-core -p codex-memories-write
  • just test -p codex-model-provider (50 tests passed)

Follow-up

Other direct reqwest consumers will be migrated in separate, reviewable stack entries.


Stack created with Sapling. Best reviewed with ReviewStack.

@bolinfest bolinfest changed the base branch from main to pr31342 July 7, 2026 04:48
@bolinfest bolinfest force-pushed the pr31361 branch 2 times, most recently from 11a2bda to 1c63ae4 Compare July 7, 2026 17:35
@bolinfest bolinfest changed the base branch from pr31342 to pr31442 July 7, 2026 17:35
bolinfest added a commit that referenced this pull request Jul 7, 2026
## Why

#31335 lets HTTP callers obtain proxy-aware clients from
`HttpClientFactory`, but a non-HTTP transport such as WebSockets also
needs two pieces of policy owned by `codex-http-client`: a concrete
route decision for its destination and the same custom-CA-aware rustls
trust configuration used by HTTPS.

Keeping these prerequisites in the shared abstraction means the
dependent Responses WebSocket change (#31441) cannot independently
reinterpret `features.respect_system_proxy`, PAC results, or enterprise
CA settings.

## What changed

- Add a redaction-safe `OutboundProxyRoute` with explicit
transport-default, direct, and concrete-proxy outcomes.
- Add `HttpClientFactory::resolve_proxy_route()` so transports can
resolve a destination through the already-selected outbound proxy
policy.
- Resolve `ws://` and `wss://` URLs through their HTTP equivalents so
system and PAC rules apply consistently.
- Add an always-returned rustls config builder that starts from native
roots and layers in any configured Codex custom CA bundle. The existing
optional builder remains available to callers that can delegate the
default configuration to their transport.
- Continue redacting proxy URLs from `Debug` output because they may
contain credentials.

## Review guide

1. `http-client/src/outbound_proxy.rs` defines the transport-neutral
route result and WebSocket URL normalization.
2. `http-client/src/custom_ca.rs` factors the native-root/custom-CA
construction so callers that perform TLS themselves can always obtain a
config.
3. `http-client/src/outbound_proxy_tests.rs` verifies WebSocket
normalization and legacy transport-default behavior.

## Test plan

- `just test -p codex-http-client outbound_proxy`
- `just test -p codex-http-client custom_ca`

---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/31342).
* #31431
* #31363
* #31362
* #31361
* #31442
* #31441
* __->__ #31342
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant