[model-gateway] Fix logging module name, parse endpoint context, and tokenizer factory (#15782)

This commit is contained in:
Simo Lin
2025-12-24 10:54:48 -08:00
committed by GitHub
parent 186a56f6e2
commit 643aeefe6d
6 changed files with 23 additions and 45 deletions
+1 -1
View File
@@ -289,7 +289,7 @@ impl<B> MakeSpan<B> for RequestSpan {
status_code = Empty, status_code = Empty,
latency = Empty, latency = Empty,
error = Empty, error = Empty,
module = "sglang::router_rs" module = "sgl_model_gateway"
) )
} }
} }
+1 -14
View File
@@ -35,14 +35,13 @@ use crate::{
completion::CompletionRequest, completion::CompletionRequest,
embedding::EmbeddingRequest, embedding::EmbeddingRequest,
generate::GenerateRequest, generate::GenerateRequest,
parser::{ParseFunctionCallRequest, SeparateReasoningRequest},
rerank::{RerankRequest, RerankResponse, RerankResult}, rerank::{RerankRequest, RerankResponse, RerankResult},
responses::{ResponsesGetParams, ResponsesRequest}, responses::{ResponsesGetParams, ResponsesRequest},
}, },
routers::{ routers::{
error::{self, extract_error_code_from_response}, error::{self, extract_error_code_from_response},
grpc::utils::{error_type_from_status, route_to_endpoint}, grpc::utils::{error_type_from_status, route_to_endpoint},
header_utils, parse, RouterTrait, header_utils, RouterTrait,
}, },
}; };
@@ -54,7 +53,6 @@ pub struct Router {
dp_aware: bool, dp_aware: bool,
enable_igw: bool, enable_igw: bool,
retry_config: RetryConfig, retry_config: RetryConfig,
context: Option<Arc<AppContext>>,
} }
impl std::fmt::Debug for Router { impl std::fmt::Debug for Router {
@@ -66,7 +64,6 @@ impl std::fmt::Debug for Router {
.field("dp_aware", &self.dp_aware) .field("dp_aware", &self.dp_aware)
.field("enable_igw", &self.enable_igw) .field("enable_igw", &self.enable_igw)
.field("retry_config", &self.retry_config) .field("retry_config", &self.retry_config)
.field("context", &"<AppContext>")
.finish() .finish()
} }
} }
@@ -81,7 +78,6 @@ impl Router {
dp_aware: ctx.router_config.dp_aware, dp_aware: ctx.router_config.dp_aware,
enable_igw: ctx.router_config.enable_igw, enable_igw: ctx.router_config.enable_igw,
retry_config: ctx.router_config.effective_retry_config(), retry_config: ctx.router_config.effective_retry_config(),
context: Some(ctx.clone()),
}) })
} }
@@ -817,14 +813,6 @@ impl RouterTrait for Router {
} }
} }
async fn parse_function_call(&self, req: &ParseFunctionCallRequest) -> Response {
parse::parse_function_call(self.context.as_ref(), req).await
}
async fn parse_reasoning(&self, req: &SeparateReasoningRequest) -> Response {
parse::parse_reasoning(self.context.as_ref(), req).await
}
fn router_type(&self) -> &'static str { fn router_type(&self) -> &'static str {
"regular" "regular"
} }
@@ -859,7 +847,6 @@ mod tests {
client: Client::new(), client: Client::new(),
retry_config: RetryConfig::default(), retry_config: RetryConfig::default(),
enable_igw: false, enable_igw: false,
context: None,
} }
} }
-11
View File
@@ -16,7 +16,6 @@ use crate::protocols::{
completion::CompletionRequest, completion::CompletionRequest,
embedding::EmbeddingRequest, embedding::EmbeddingRequest,
generate::GenerateRequest, generate::GenerateRequest,
parser::{ParseFunctionCallRequest, SeparateReasoningRequest},
rerank::RerankRequest, rerank::RerankRequest,
responses::{ResponsesGetParams, ResponsesRequest}, responses::{ResponsesGetParams, ResponsesRequest},
}; };
@@ -194,16 +193,6 @@ pub trait RouterTrait: Send + Sync + Debug {
(StatusCode::NOT_IMPLEMENTED, "Rerank not implemented").into_response() (StatusCode::NOT_IMPLEMENTED, "Rerank not implemented").into_response()
} }
/// Parse function calls from text
async fn parse_function_call(&self, req: &ParseFunctionCallRequest) -> Response {
parse::parse_function_call(None, req).await
}
/// Separate reasoning from normal text
async fn parse_reasoning(&self, req: &SeparateReasoningRequest) -> Response {
parse::parse_reasoning(None, req).await
}
/// Get router type name /// Get router type name
fn router_type(&self) -> &'static str; fn router_type(&self) -> &'static str;
@@ -28,13 +28,9 @@ fn error_response(status: StatusCode, message: &str) -> Response {
/// Parse function calls from model output text /// Parse function calls from model output text
pub async fn parse_function_call( pub async fn parse_function_call(
context: Option<&Arc<AppContext>>, ctx: &Arc<AppContext>,
req: &ParseFunctionCallRequest, req: &ParseFunctionCallRequest,
) -> Response { ) -> Response {
let Some(ctx) = context else {
return error_response(StatusCode::SERVICE_UNAVAILABLE, "Context not initialized");
};
let Some(factory) = &ctx.tool_parser_factory else { let Some(factory) = &ctx.tool_parser_factory else {
return error_response( return error_response(
StatusCode::SERVICE_UNAVAILABLE, StatusCode::SERVICE_UNAVAILABLE,
@@ -71,14 +67,7 @@ pub async fn parse_function_call(
} }
/// Parse and separate reasoning from normal text /// Parse and separate reasoning from normal text
pub async fn parse_reasoning( pub async fn parse_reasoning(ctx: &Arc<AppContext>, req: &SeparateReasoningRequest) -> Response {
context: Option<&Arc<AppContext>>,
req: &SeparateReasoningRequest,
) -> Response {
let Some(ctx) = context else {
return error_response(StatusCode::SERVICE_UNAVAILABLE, "Context not initialized");
};
let Some(factory) = &ctx.reasoning_parser_factory else { let Some(factory) = &ctx.reasoning_parser_factory else {
return error_response( return error_response(
StatusCode::SERVICE_UNAVAILABLE, StatusCode::SERVICE_UNAVAILABLE,
+3 -3
View File
@@ -50,7 +50,7 @@ use crate::{
validated::ValidatedJson, validated::ValidatedJson,
worker_spec::{WorkerConfigRequest, WorkerUpdateRequest}, worker_spec::{WorkerConfigRequest, WorkerUpdateRequest},
}, },
routers::{conversations, router_manager::RouterManager, tokenize, RouterTrait}, routers::{conversations, parse, router_manager::RouterManager, tokenize, RouterTrait},
service_discovery::{start_service_discovery, ServiceDiscoveryConfig}, service_discovery::{start_service_discovery, ServiceDiscoveryConfig},
wasm::route::{add_wasm_module, list_wasm_modules, remove_wasm_module}, wasm::route::{add_wasm_module, list_wasm_modules, remove_wasm_module},
workflow::{LoggingSubscriber, WorkflowEngine}, workflow::{LoggingSubscriber, WorkflowEngine},
@@ -67,14 +67,14 @@ async fn parse_function_call(
State(state): State<Arc<AppState>>, State(state): State<Arc<AppState>>,
Json(req): Json<ParseFunctionCallRequest>, Json(req): Json<ParseFunctionCallRequest>,
) -> Response { ) -> Response {
state.router.parse_function_call(&req).await parse::parse_function_call(&state.context, &req).await
} }
async fn parse_reasoning( async fn parse_reasoning(
State(state): State<Arc<AppState>>, State(state): State<Arc<AppState>>,
Json(req): Json<SeparateReasoningRequest>, Json(req): Json<SeparateReasoningRequest>,
) -> Response { ) -> Response {
state.router.parse_reasoning(&req).await parse::parse_reasoning(&state.context, &req).await
} }
async fn sink_handler() -> Response { async fn sink_handler() -> Response {
+16 -3
View File
@@ -254,14 +254,27 @@ pub async fn create_tokenizer_async_with_chat_template(
} }
// Check if it's a GPT model name that should use Tiktoken // Check if it's a GPT model name that should use Tiktoken
if model_name_or_path.contains("gpt-") // Only match specific OpenAI model patterns to avoid catching HuggingFace models like "openai/gpt-oss-20b"
if model_name_or_path.contains("gpt-4")
|| model_name_or_path.contains("gpt-3.5")
|| model_name_or_path.contains("gpt-3")
|| model_name_or_path.contains("turbo")
|| model_name_or_path.contains("davinci") || model_name_or_path.contains("davinci")
|| model_name_or_path.contains("curie") || model_name_or_path.contains("curie")
|| model_name_or_path.contains("babbage") || model_name_or_path.contains("babbage")
|| model_name_or_path.contains("ada") || model_name_or_path.contains("ada")
|| model_name_or_path.contains("codex")
{ {
let tokenizer = TiktokenTokenizer::from_model_name(model_name_or_path)?; // Try tiktoken first, but fall back to HuggingFace if it fails
return Ok(Arc::new(tokenizer)); match TiktokenTokenizer::from_model_name(model_name_or_path) {
Ok(tokenizer) => return Ok(Arc::new(tokenizer)),
Err(e) => {
debug!(
"Tiktoken failed for '{}': {}, falling back to HuggingFace",
model_name_or_path, e
);
}
}
} }
// Try to download tokenizer files from HuggingFace // Try to download tokenizer files from HuggingFace