feat: support custom HTTP headers for model providers (#1473)

This adds support for two new model provider config options:

- `http_headers` for hardcoded (key, value) pairs
- `env_http_headers` for headers whose values should be read from
environment variables

This also updates the built-in `openai` provider to use this feature to
set the following headers:

- `originator` => `codex_cli_rs`
- `version` => [CLI version]
- `OpenAI-Organization` => `OPENAI_ORGANIZATION` env var
- `OpenAI-Project` => `OPENAI_PROJECT` env var

for consistency with the TypeScript implementation:


bd5a9e8ba9/codex-cli/src/utils/agent/agent-loop.ts (L321-L329)

While here, this also consolidates some logic that was duplicated across
`client.rs` and `chat_completions.rs` by introducing
`ModelProviderInfo.create_request_builder()`.

Resolves https://github.com/openai/codex/discussions/1152
This commit is contained in:
Michael Bolin
2025-07-07 13:09:16 -07:00
committed by GitHub
parent bd5a9e8ba9
commit c221eab0b5
7 changed files with 147 additions and 27 deletions

View File

@@ -108,6 +108,8 @@ async fn keeps_previous_response_id_between_tasks() {
env_key_instructions: None,
wire_api: codex_core::WireApi::Responses,
query_params: None,
http_headers: None,
env_http_headers: None,
};
// Init session

View File

@@ -97,6 +97,8 @@ async fn retries_on_early_close() {
env_key_instructions: None,
wire_api: codex_core::WireApi::Responses,
query_params: None,
http_headers: None,
env_http_headers: None,
};
let ctrl_c = std::sync::Arc::new(tokio::sync::Notify::new());