From 842547640ee37451c2d66f7e01f8d762e07b336d Mon Sep 17 00:00:00 2001 From: yijiang12 <162359576+yijiang12@users.noreply.github.com> Date: Thu, 6 Aug 2026 17:42:36 +0000 Subject: [PATCH] Honor the configured ChatGPT origin in connector install URLs (#37338) ## What changed - Build connector install URLs from `CODEX_APP_SERVER_CHATGPT_BASE_URL`, falling back to `https://chatgpt.com` when it is unset. - Strip a trailing slash or `/backend-api` suffix before appending the `/apps//` path. - Add a test covering install URL generation with the configured origin. GitOrigin-RevId: 854d15b7e322d2359684f974aaf27fe28205dd5a --- codex-rs/connectors/src/lib.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/codex-rs/connectors/src/lib.rs b/codex-rs/connectors/src/lib.rs index c79adaf047..ec8b19c921 100644 --- a/codex-rs/connectors/src/lib.rs +++ b/codex-rs/connectors/src/lib.rs @@ -480,8 +480,13 @@ fn directory_app_to_app_info(app: DirectoryApp) -> AppInfo { } fn connector_install_url(name: &str, connector_id: &str) -> String { + let chatgpt_base_url = std::env::var("CODEX_APP_SERVER_CHATGPT_BASE_URL") + .unwrap_or_else(|_| "https://chatgpt.com".to_string()); + let chatgpt_origin = chatgpt_base_url + .trim_end_matches('/') + .trim_end_matches("/backend-api"); let slug = connector_name_slug(name); - format!("https://chatgpt.com/apps/{slug}/{connector_id}") + format!("{chatgpt_origin}/apps/{slug}/{connector_id}") } fn connector_name_slug(name: &str) -> String { @@ -569,6 +574,19 @@ mod tests { } } + #[test] + fn connector_install_url_uses_configured_origin() { + let chatgpt_base_url = std::env::var("CODEX_APP_SERVER_CHATGPT_BASE_URL") + .unwrap_or_else(|_| "https://chatgpt.com".to_string()); + let chatgpt_origin = chatgpt_base_url + .trim_end_matches('/') + .trim_end_matches("/backend-api"); + assert_eq!( + connector_install_url("Google Calendar", "calendar"), + format!("{chatgpt_origin}/apps/google-calendar/calendar"), + ); + } + #[test] fn directory_app_icon_assets_reach_app_info() -> anyhow::Result<()> { let response: DirectoryListResponse = serde_json::from_value(serde_json::json!({