From 71d8607d9ca9fce6e5a5c82925dc25ca25547acd Mon Sep 17 00:00:00 2001 From: zhongxiong Date: Fri, 27 Mar 2026 22:49:05 +0800 Subject: [PATCH 1/2] Add qwen3.5-flash, qwen3.5-plus, qwen3-max model --- crates/openfang-runtime/src/model_catalog.rs | 42 ++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/crates/openfang-runtime/src/model_catalog.rs b/crates/openfang-runtime/src/model_catalog.rs index ba08ebd62..87c8979f3 100644 --- a/crates/openfang-runtime/src/model_catalog.rs +++ b/crates/openfang-runtime/src/model_catalog.rs @@ -2955,6 +2955,48 @@ fn builtin_models() -> Vec { supports_streaming: true, aliases: vec![], }, + ModelCatalogEntry { + id: "qwen3.5-flash".into(), + display_name: "Qwen3.5 Flash".into(), + provider: "qwen".into(), + tier: ModelTier::Fast, + context_window: 991_000, + max_output_tokens: 64_000, + input_cost_per_m: 0.20, + output_cost_per_m: 2.00, + supports_tools: true, + supports_vision: true, + supports_streaming: true, + aliases: vec!["qwen3.5-flash".into()], + }, + ModelCatalogEntry { + id: "qwen3.5-plus".into(), + display_name: "Qwen3.5 Plus".into(), + provider: "qwen".into(), + tier: ModelTier::Smart, + context_window: 991_000, + max_output_tokens: 64_000, + input_cost_per_m: 0.80, + output_cost_per_m: 4.80, + supports_tools: true, + supports_vision: true, + supports_streaming: true, + aliases: vec!["qwen3.5".into()], + }, + ModelCatalogEntry { + id: "qwen3-max".into(), + display_name: "Qwen3 Max".into(), + provider: "qwen".into(), + tier: ModelTier::Frontier, + context_window: 252_000, + max_output_tokens: 64_000, + input_cost_per_m: 2.50, + output_cost_per_m: 10.00, + supports_tools: true, + supports_vision: true, + supports_streaming: true, + aliases: vec![], + }, ModelCatalogEntry { id: "qwen3-235b-a22b".into(), display_name: "Qwen3 235B".into(), From 619f8ba58b91832f72d3e07669df9952ec2c27be Mon Sep 17 00:00:00 2001 From: Dan Castrillo Date: Sat, 28 Mar 2026 21:54:58 +0100 Subject: [PATCH 2/2] fix(model-catalog): correct qwen3.5-flash, qwen3.5-plus, qwen3-max entries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - qwen3.5-flash: output_cost 2.00→0.60, context_window 991K→1M, remove self-alias, supports_vision true→false, max_output_tokens 64K→8192 - qwen3.5-plus: output_cost 4.80→3.20, context_window 991K→1M, supports_vision true→false, max_output_tokens 64K→8192 - qwen3-max: tier Frontier (not Smart), context_window 1M (not 252K or 131K), supports_vision false, max_output_tokens 64K→8192 - test_catalog_has_providers: replace brittle hardcoded count (41) with named-provider assertions --- crates/openfang-runtime/src/model_catalog.rs | 31 ++++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/crates/openfang-runtime/src/model_catalog.rs b/crates/openfang-runtime/src/model_catalog.rs index 87c8979f3..307d81ee7 100644 --- a/crates/openfang-runtime/src/model_catalog.rs +++ b/crates/openfang-runtime/src/model_catalog.rs @@ -2960,26 +2960,26 @@ fn builtin_models() -> Vec { display_name: "Qwen3.5 Flash".into(), provider: "qwen".into(), tier: ModelTier::Fast, - context_window: 991_000, - max_output_tokens: 64_000, + context_window: 1_000_000, + max_output_tokens: 8_192, input_cost_per_m: 0.20, - output_cost_per_m: 2.00, + output_cost_per_m: 0.60, supports_tools: true, - supports_vision: true, + supports_vision: false, supports_streaming: true, - aliases: vec!["qwen3.5-flash".into()], + aliases: vec![], }, ModelCatalogEntry { id: "qwen3.5-plus".into(), display_name: "Qwen3.5 Plus".into(), provider: "qwen".into(), tier: ModelTier::Smart, - context_window: 991_000, - max_output_tokens: 64_000, + context_window: 1_000_000, + max_output_tokens: 8_192, input_cost_per_m: 0.80, - output_cost_per_m: 4.80, + output_cost_per_m: 3.20, supports_tools: true, - supports_vision: true, + supports_vision: false, supports_streaming: true, aliases: vec!["qwen3.5".into()], }, @@ -2988,12 +2988,12 @@ fn builtin_models() -> Vec { display_name: "Qwen3 Max".into(), provider: "qwen".into(), tier: ModelTier::Frontier, - context_window: 252_000, - max_output_tokens: 64_000, + context_window: 1_000_000, + max_output_tokens: 8_192, input_cost_per_m: 2.50, output_cost_per_m: 10.00, supports_tools: true, - supports_vision: true, + supports_vision: false, supports_streaming: true, aliases: vec![], }, @@ -3881,7 +3881,12 @@ mod tests { #[test] fn test_catalog_has_providers() { let catalog = ModelCatalog::new(); - assert_eq!(catalog.list_providers().len(), 41); + let providers = catalog.list_providers(); + assert!(!providers.is_empty(), "provider list must not be empty"); + let ids: Vec<&str> = providers.iter().map(|p| p.id.as_str()).collect(); + for expected in ["anthropic", "openai", "qwen", "groq"] { + assert!(ids.contains(&expected), "provider '{expected}' missing from catalog"); + } } #[test]