From 090ffa4b0fbaa633dbd14b53e721be43a3b60af3 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Thu, 13 Nov 2025 17:30:20 -0800 Subject: [PATCH] move --- codex-rs/Cargo.lock | 1 + codex-rs/core/src/codex.rs | 7 ------- codex-rs/core/src/conversation_manager.rs | 5 +++++ codex-rs/utils/tokenizer/Cargo.toml | 1 + codex-rs/utils/tokenizer/src/lib.rs | 7 +++++++ 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/codex-rs/Cargo.lock b/codex-rs/Cargo.lock index 35424d822a..7306a246cc 100644 --- a/codex-rs/Cargo.lock +++ b/codex-rs/Cargo.lock @@ -1552,6 +1552,7 @@ dependencies = [ "pretty_assertions", "thiserror 2.0.17", "tiktoken-rs", + "tokio", ] [[package]] diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index dfe4f899de..48e4d79e2e 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -133,7 +133,6 @@ use codex_protocol::protocol::InitialHistory; use codex_protocol::user_input::UserInput; use codex_utils_readiness::Readiness; use codex_utils_readiness::ReadinessFlag; -use codex_utils_tokenizer::shared_default_tokenizer; /// The high-level interface to the Codex system. /// It operates as a queue pair where you send submissions and receive events. @@ -248,10 +247,6 @@ impl Codex { } } -async fn warm_up_tokenizer() { - let _ = tokio::task::spawn_blocking(shared_default_tokenizer).await; -} - /// Context for an initialized model agent /// /// A session has at most 1 running task at a time, and can be interrupted by user input. @@ -502,7 +497,6 @@ impl Session { config.mcp_servers.iter(), config.mcp_oauth_credentials_store_mode, ); - let tokenizer_warmup_fut = warm_up_tokenizer(); // Join all independent futures. let ( @@ -517,7 +511,6 @@ impl Session { default_shell_fut, history_meta_fut, auth_statuses_fut, - tokenizer_warmup_fut ); let rollout_recorder = rollout_recorder.map_err(|e| { diff --git a/codex-rs/core/src/conversation_manager.rs b/codex-rs/core/src/conversation_manager.rs index 8ffefd5679..0ced5d5465 100644 --- a/codex-rs/core/src/conversation_manager.rs +++ b/codex-rs/core/src/conversation_manager.rs @@ -17,9 +17,13 @@ use codex_protocol::models::ResponseItem; use codex_protocol::protocol::InitialHistory; use codex_protocol::protocol::RolloutItem; use codex_protocol::protocol::SessionSource; +use codex_utils_tokenizer::shared_default_tokenizer; +use codex_utils_tokenizer::warm_up_default_tokenizer; +use codex_utils_tokenizer::warm_up_tokenizer; use std::collections::HashMap; use std::path::PathBuf; use std::sync::Arc; +use std::time::Duration; use tokio::sync::RwLock; /// Represents a newly created Codex conversation, including the first event @@ -40,6 +44,7 @@ pub struct ConversationManager { impl ConversationManager { pub fn new(auth_manager: Arc, session_source: SessionSource) -> Self { + warm_up_default_tokenizer(); Self { conversations: Arc::new(RwLock::new(HashMap::new())), auth_manager, diff --git a/codex-rs/utils/tokenizer/Cargo.toml b/codex-rs/utils/tokenizer/Cargo.toml index 6f6b4decf0..d18d7decc5 100644 --- a/codex-rs/utils/tokenizer/Cargo.toml +++ b/codex-rs/utils/tokenizer/Cargo.toml @@ -10,6 +10,7 @@ workspace = true anyhow = { workspace = true } thiserror = { workspace = true } tiktoken-rs = "0.7" +tokio.workspace = true [dev-dependencies] pretty_assertions = { workspace = true } diff --git a/codex-rs/utils/tokenizer/src/lib.rs b/codex-rs/utils/tokenizer/src/lib.rs index bc9bf0146f..fa972d3b44 100644 --- a/codex-rs/utils/tokenizer/src/lib.rs +++ b/codex-rs/utils/tokenizer/src/lib.rs @@ -1,6 +1,7 @@ use std::fmt; use std::sync::Arc; use std::sync::OnceLock; +use std::time::Duration; use anyhow::Context; use anyhow::Error as AnyhowError; @@ -111,6 +112,12 @@ impl Tokenizer { static DEFAULT_TOKENIZER: OnceLock, TokenizerError>> = OnceLock::new(); +pub fn warm_up_default_tokenizer() { + tokio::spawn(tokio::time::timeout(Duration::from_secs(5), async { + let _ = shared_default_tokenizer(); + })); +} + /// Return a shared default tokenizer (`O200kBase`), loading it once per process. /// Returns `None` if initialization fails. #[must_use]