@@ -385,6 +390,7 @@ impl crate::routers::RouterTrait for OpenAIRouter {
...
@@ -385,6 +390,7 @@ impl crate::routers::RouterTrait for OpenAIRouter {
}
}
};
};
ifletSome(obj)=payload.as_object_mut(){
ifletSome(obj)=payload.as_object_mut(){
// Always remove SGLang-specific fields (unsupported by OpenAI)
forkeyin[
forkeyin[
"top_k",
"top_k",
"min_p",
"min_p",
...
@@ -535,7 +541,7 @@ impl crate::routers::RouterTrait for OpenAIRouter {
...
@@ -535,7 +541,7 @@ impl crate::routers::RouterTrait for OpenAIRouter {
.into_response();
.into_response();
}
}
// Clone the body and override model if needed
// Clone the body for validation and logic, but we'll build payload differently
letmutrequest_body=body.clone();
letmutrequest_body=body.clone();
ifletSome(model)=model_id{
ifletSome(model)=model_id{
request_body.model=Some(model.to_string());
request_body.model=Some(model.to_string());
...
@@ -690,7 +696,7 @@ impl crate::routers::RouterTrait for OpenAIRouter {
...
@@ -690,7 +696,7 @@ impl crate::routers::RouterTrait for OpenAIRouter {
}
}
// Always set store=false for upstream (we store internally)
// Always set store=false for upstream (we store internally)
request_body.store=false;
request_body.store=Some(false);
// Convert to JSON and strip SGLang-specific fields
// Convert to JSON and strip SGLang-specific fields
letmutpayload=matchto_value(&request_body){
letmutpayload=matchto_value(&request_body){
...
@@ -704,14 +710,13 @@ impl crate::routers::RouterTrait for OpenAIRouter {
...
@@ -704,14 +710,13 @@ impl crate::routers::RouterTrait for OpenAIRouter {
}
}
};
};
// Remove SGLang-specific fields
// Remove SGLang-specific fields only
ifletSome(obj)=payload.as_object_mut(){
ifletSome(obj)=payload.as_object_mut(){
// Remove SGLang-specific fields (not part of OpenAI API)
forkeyin[
forkeyin[
"request_id",
"request_id",
"priority",
"priority",
"top_k",
"top_k",
"frequency_penalty",
"presence_penalty",
"min_p",
"min_p",
"min_tokens",
"min_tokens",
"regex",
"regex",
...
@@ -732,10 +737,38 @@ impl crate::routers::RouterTrait for OpenAIRouter {
...
@@ -732,10 +737,38 @@ impl crate::routers::RouterTrait for OpenAIRouter {
]{
]{
obj.remove(key);
obj.remove(key);
}
}
// XAI doesn't support the OPENAI item type input: https://platform.openai.com/docs/api-reference/responses/create#responses-create-input-input-item-list-item
// To Achieve XAI compatibility, strip extra fields from input messages (id, status)
// XAI doesn't support output_text as type for content with role of assistant
// so normalize content types: output_text -> input_text