diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 344f10b3f28..435350c0711 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -144,6 +144,13 @@ too_many_arguments = "allow" [profile.dev] panic = "abort" +# Speed up cold tokenizer construction in tests. +[profile.dev.package] +fastokens = { opt-level = 3 } +regex-automata = { opt-level = 3 } +serde_json = { opt-level = 3 } +tokenizers = { opt-level = 3 } + [profile.release] lto = "thin" panic = "abort" diff --git a/rust/src/chat/tests/roundtrip.rs b/rust/src/chat/tests/roundtrip.rs index f2ad815af44..e6044614aa9 100644 --- a/rust/src/chat/tests/roundtrip.rs +++ b/rust/src/chat/tests/roundtrip.rs @@ -214,14 +214,17 @@ macro_rules! roundtrip_tests { ($($case:ident => [$($(#[$fixture_attr:meta])* $fixture:ident),* $(,)?]),+ $(,)?) => { paste::paste! { $( - $( - #[tokio::test] - $(#[$fixture_attr])* - #[file_serial([])] - async fn []() -> Result<()> { - [](RoundtripCase::$case()).await - } - )* + #[tokio::test] + #[file_serial([])] + async fn []() -> Result<()> { + let case = RoundtripCase::$case(); + let backends = load_roundtrip_backends(&case).await?; + $( + $(#[$fixture_attr])* + [](&case, &backends).await?; + )* + Ok(()) + } )+ } }; @@ -241,18 +244,21 @@ roundtrip_tests! { } /// Run the fixed reasoning+content fixture for one model/parser case. -async fn run_roundtrip_reasoning_and_content(case: RoundtripCase) -> Result<()> { +async fn run_roundtrip_reasoning_and_content( + case: &RoundtripCase, + backends: &vllm_chat::LoadedModelBackends, +) -> Result<()> { for thinking in case.thinking_behavior.fixtures() { - run_roundtrip_reasoning_and_content_inner(case.clone(), thinking).await?; + run_roundtrip_reasoning_and_content_inner(case, backends, thinking).await?; } Ok(()) } async fn run_roundtrip_reasoning_and_content_inner( - case: RoundtripCase, + case: &RoundtripCase, + backends: &vllm_chat::LoadedModelBackends, thinking: Option, ) -> Result<()> { - let backends = load_roundtrip_backends(&case).await?; let request = roundtrip_request( "roundtrip-reasoning-content", vec![ChatMessage::text(ChatRole::User, "What is 2 + 2?")], @@ -275,7 +281,7 @@ async fn run_roundtrip_reasoning_and_content_inner( }); AssistantMessage { content } }; - let result = run_roundtrip(&case, &backends, &request, assistant).await?; + let result = run_roundtrip(case, backends, &request, assistant).await?; assert_eq!( result.parsed_message.reasoning().as_deref().map(str::trim), @@ -293,8 +299,10 @@ async fn run_roundtrip_reasoning_and_content_inner( } /// Run the fixed reasoning+multiple-tools fixture for one model/parser case. -async fn run_roundtrip_tool_call_mix(case: RoundtripCase) -> Result<()> { - let backends = load_roundtrip_backends(&case).await?; +async fn run_roundtrip_tool_call_mix( + case: &RoundtripCase, + backends: &vllm_chat::LoadedModelBackends, +) -> Result<()> { let request = roundtrip_request( "roundtrip-reasoning-tools", vec![ChatMessage::text( @@ -308,8 +316,8 @@ async fn run_roundtrip_tool_call_mix(case: RoundtripCase) -> Result<()> { let expected_text = "I will call the tools."; let result = run_roundtrip( - &case, - &backends, + case, + backends, &request, AssistantMessage { content: vec![ @@ -353,12 +361,12 @@ async fn run_roundtrip_tool_call_mix(case: RoundtripCase) -> Result<()> { assert_eq!(tool_calls[0].name, "get_weather"); assert_eq!( tool_calls[0].arguments, - expected_arguments(&case, r#"{"location": "Shanghai"}"#)?, + expected_arguments(case, r#"{"location": "Shanghai"}"#)?, ); assert_eq!(tool_calls[1].name, "add"); assert_eq!( tool_calls[1].arguments, - expected_arguments(&case, r#"{"y": 1.0, "x": 2, "items": ["left", "right"]}"#)?, + expected_arguments(case, r#"{"y": 1.0, "x": 2, "items": ["left", "right"]}"#)?, ); assert_eq!(