[router][grpc] Consolidate parser checks for chat completions (#11439)

This commit is contained in:
Chang Su
2025-10-10 17:44:29 -07:00
committed by GitHub
parent c495833186
commit 92777135a0
7 changed files with 152 additions and 43 deletions

View File

@@ -6,7 +6,7 @@ use tokio::sync::Mutex;
use crate::tool_parser::parsers::{
DeepSeekParser, Glm4MoeParser, GptOssHarmonyParser, GptOssParser, JsonParser, KimiK2Parser,
LlamaParser, MistralParser, PythonicParser, QwenParser, Step3Parser,
LlamaParser, MistralParser, PassthroughParser, PythonicParser, QwenParser, Step3Parser,
};
use crate::tool_parser::traits::ToolParser;
@@ -36,7 +36,7 @@ impl ParserRegistry {
creators: Arc::new(RwLock::new(HashMap::new())),
pool: Arc::new(RwLock::new(HashMap::new())),
model_mapping: Arc::new(RwLock::new(HashMap::new())),
default_parser: Arc::new(RwLock::new("json".to_string())),
default_parser: Arc::new(RwLock::new("passthrough".to_string())),
}
}
@@ -124,10 +124,9 @@ impl ParserRegistry {
}
}
// Check if default parser exists
let default = self.default_parser.read().unwrap().clone();
let creators = self.creators.read().unwrap();
creators.contains_key(&default)
// Return false if no specific parser found for this model
// (get_pooled will still fall back to default parser)
false
}
/// Create a fresh (non-pooled) parser instance for a specific model.
@@ -228,6 +227,7 @@ impl ParserFactory {
let registry = ParserRegistry::new();
// Register default parsers
registry.register_parser("passthrough", || Box::new(PassthroughParser::new()));
registry.register_parser("json", || Box::new(JsonParser::new()));
registry.register_parser("mistral", || Box::new(MistralParser::new()));
registry.register_parser("qwen", || Box::new(QwenParser::new()));
@@ -311,15 +311,15 @@ impl ParserFactory {
/// Get a pooled parser for the given model ID.
/// Returns a shared instance that can be used concurrently.
/// Falls back to JSON parser if model is not recognized.
/// Falls back to passthrough parser if model is not recognized.
pub fn get_pooled(&self, model_id: &str) -> PooledParser {
self.registry
.get_pooled_for_model(model_id)
.unwrap_or_else(|| {
// Fallback to JSON parser
// Fallback to passthrough parser (no-op, returns text unchanged)
self.registry
.get_pooled_parser("json")
.expect("JSON parser should always be registered")
.get_pooled_parser("passthrough")
.expect("Passthrough parser should always be registered")
})
}