Set user-agent (#2230)
Use the same well-defined value in all cases when sending user-agent header
This commit is contained in:
14
codex-rs/Cargo.lock
generated
14
codex-rs/Cargo.lock
generated
@@ -689,9 +689,11 @@ dependencies = [
|
|||||||
"mcp-types",
|
"mcp-types",
|
||||||
"mime_guess",
|
"mime_guess",
|
||||||
"openssl-sys",
|
"openssl-sys",
|
||||||
|
"os_info",
|
||||||
"predicates",
|
"predicates",
|
||||||
"pretty_assertions",
|
"pretty_assertions",
|
||||||
"rand 0.9.2",
|
"rand 0.9.2",
|
||||||
|
"regex-lite",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"seccompiler",
|
"seccompiler",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -3044,6 +3046,18 @@ version = "0.2.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
|
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "os_info"
|
||||||
|
version = "3.12.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d0e1ac5fde8d43c34139135df8ea9ee9465394b2d8d20f032d38998f64afffc3"
|
||||||
|
dependencies = [
|
||||||
|
"log",
|
||||||
|
"plist",
|
||||||
|
"serde",
|
||||||
|
"windows-sys 0.52.0",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "overload"
|
name = "overload"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use codex_core::config::Config;
|
use codex_core::config::Config;
|
||||||
|
use codex_core::user_agent::get_codex_user_agent;
|
||||||
|
|
||||||
use crate::chatgpt_token::get_chatgpt_token_data;
|
use crate::chatgpt_token::get_chatgpt_token_data;
|
||||||
use crate::chatgpt_token::init_chatgpt_token_from_auth;
|
use crate::chatgpt_token::init_chatgpt_token_from_auth;
|
||||||
@@ -30,7 +31,7 @@ pub(crate) async fn chatgpt_get_request<T: DeserializeOwned>(
|
|||||||
.bearer_auth(&token.access_token)
|
.bearer_auth(&token.access_token)
|
||||||
.header("chatgpt-account-id", account_id?)
|
.header("chatgpt-account-id", account_id?)
|
||||||
.header("Content-Type", "application/json")
|
.header("Content-Type", "application/json")
|
||||||
.header("User-Agent", "codex-cli")
|
.header("User-Agent", get_codex_user_agent(None))
|
||||||
.send()
|
.send()
|
||||||
.await
|
.await
|
||||||
.context("Failed to send request")?;
|
.context("Failed to send request")?;
|
||||||
|
|||||||
@@ -27,11 +27,12 @@ futures = "0.3"
|
|||||||
libc = "0.2.174"
|
libc = "0.2.174"
|
||||||
mcp-types = { path = "../mcp-types" }
|
mcp-types = { path = "../mcp-types" }
|
||||||
mime_guess = "2.0"
|
mime_guess = "2.0"
|
||||||
|
os_info = "3.12.0"
|
||||||
rand = "0.9"
|
rand = "0.9"
|
||||||
reqwest = { version = "0.12", features = ["json", "stream"] }
|
reqwest = { version = "0.12", features = ["json", "stream"] }
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
serde_json = "1"
|
|
||||||
serde_bytes = "0.11"
|
serde_bytes = "0.11"
|
||||||
|
serde_json = "1"
|
||||||
sha1 = "0.10.6"
|
sha1 = "0.10.6"
|
||||||
shlex = "1.3.0"
|
shlex = "1.3.0"
|
||||||
similar = "2.7.0"
|
similar = "2.7.0"
|
||||||
@@ -75,6 +76,7 @@ core_test_support = { path = "tests/common" }
|
|||||||
maplit = "1.0.2"
|
maplit = "1.0.2"
|
||||||
predicates = "3"
|
predicates = "3"
|
||||||
pretty_assertions = "1.4.1"
|
pretty_assertions = "1.4.1"
|
||||||
|
regex-lite = "0.1.6"
|
||||||
tempfile = "3"
|
tempfile = "3"
|
||||||
tokio-test = "0.4"
|
tokio-test = "0.4"
|
||||||
walkdir = "2.5.0"
|
walkdir = "2.5.0"
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ use crate::model_provider_info::WireApi;
|
|||||||
use crate::models::ResponseItem;
|
use crate::models::ResponseItem;
|
||||||
use crate::openai_tools::create_tools_json_for_responses_api;
|
use crate::openai_tools::create_tools_json_for_responses_api;
|
||||||
use crate::protocol::TokenUsage;
|
use crate::protocol::TokenUsage;
|
||||||
|
use crate::user_agent::get_codex_user_agent;
|
||||||
use crate::util::backoff;
|
use crate::util::backoff;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
@@ -208,6 +209,7 @@ impl ModelClient {
|
|||||||
.as_deref()
|
.as_deref()
|
||||||
.unwrap_or("codex_cli_rs");
|
.unwrap_or("codex_cli_rs");
|
||||||
req_builder = req_builder.header("originator", originator);
|
req_builder = req_builder.header("originator", originator);
|
||||||
|
req_builder = req_builder.header("User-Agent", get_codex_user_agent(Some(originator)));
|
||||||
|
|
||||||
let res = req_builder.send().await;
|
let res = req_builder.send().await;
|
||||||
if let Ok(resp) = &res {
|
if let Ok(resp) = &res {
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ pub mod seatbelt;
|
|||||||
pub mod shell;
|
pub mod shell;
|
||||||
pub mod spawn;
|
pub mod spawn;
|
||||||
pub mod turn_diff_tracker;
|
pub mod turn_diff_tracker;
|
||||||
|
pub mod user_agent;
|
||||||
mod user_notification;
|
mod user_notification;
|
||||||
pub mod util;
|
pub mod util;
|
||||||
pub use apply_patch::CODEX_APPLY_PATCH_ARG1;
|
pub use apply_patch::CODEX_APPLY_PATCH_ARG1;
|
||||||
|
|||||||
36
codex-rs/core/src/user_agent.rs
Normal file
36
codex-rs/core/src/user_agent.rs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
const DEFAULT_ORIGINATOR: &str = "codex_cli_rs";
|
||||||
|
|
||||||
|
pub fn get_codex_user_agent(originator: Option<&str>) -> String {
|
||||||
|
let build_version = env!("CARGO_PKG_VERSION");
|
||||||
|
let os_info = os_info::get();
|
||||||
|
format!(
|
||||||
|
"{}/{build_version} ({} {}; {})",
|
||||||
|
originator.unwrap_or(DEFAULT_ORIGINATOR),
|
||||||
|
os_info.os_type(),
|
||||||
|
os_info.version(),
|
||||||
|
os_info.architecture().unwrap_or("unknown"),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
#[allow(clippy::unwrap_used)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_codex_user_agent() {
|
||||||
|
let user_agent = get_codex_user_agent(None);
|
||||||
|
assert!(user_agent.starts_with("codex_cli_rs/"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
fn test_macos() {
|
||||||
|
use regex_lite::Regex;
|
||||||
|
let user_agent = get_codex_user_agent(None);
|
||||||
|
let re =
|
||||||
|
Regex::new(r"^codex_cli_rs/\d+\.\d+\.\d+ \(Mac OS \d+\.\d+\.\d+; (x86_64|arm64)\)$")
|
||||||
|
.unwrap();
|
||||||
|
assert!(re.is_match(&user_agent));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -67,13 +67,7 @@ async fn check_for_update(version_file: &Path) -> anyhow::Result<()> {
|
|||||||
tag_name: latest_tag_name,
|
tag_name: latest_tag_name,
|
||||||
} = reqwest::Client::new()
|
} = reqwest::Client::new()
|
||||||
.get(LATEST_RELEASE_URL)
|
.get(LATEST_RELEASE_URL)
|
||||||
.header(
|
.header("User-Agent", get_codex_user_agent(None))
|
||||||
"User-Agent",
|
|
||||||
format!(
|
|
||||||
"codex/{} (+https://github.com/openai/codex)",
|
|
||||||
env!("CARGO_PKG_VERSION")
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.send()
|
.send()
|
||||||
.await?
|
.await?
|
||||||
.error_for_status()?
|
.error_for_status()?
|
||||||
|
|||||||
Reference in New Issue
Block a user