diff --git a/crates/xserv-server/src/api.rs b/crates/xserv-server/src/api.rs index aa67936..00e3557 100644 --- a/crates/xserv-server/src/api.rs +++ b/crates/xserv-server/src/api.rs @@ -89,7 +89,7 @@ async fn chat_non_stream(state: Arc, req: ChatRequest) -> Response { return response; } - let prompt = build_prompt(&req.messages); + let prompt = build_prompt(&req.messages, &state.model_type); let prompt_tokens = state.engine_tokenizer.lock().unwrap().encode(&prompt); let prompt_token_count = prompt_tokens.len(); @@ -159,7 +159,7 @@ fn chat_stream( return response; } - let prompt = build_prompt(&req.messages); + let prompt = build_prompt(&req.messages, &state.model_type); let prompt_tokens = state.engine_tokenizer.lock().unwrap().encode(&prompt); let max_seq_len = state.max_seq_len; @@ -325,7 +325,11 @@ fn sampling_params(req: &ChatRequest) -> SamplingParams { } } -fn build_prompt(messages: &[Message]) -> String { +fn build_prompt(messages: &[Message], model_type: &str) -> String { + if model_type == "gpt_oss" { + return build_prompt_gpt_oss(messages); + } + // Default: Qwen3 ChatML format let mut prompt = String::new(); for msg in messages { match msg.role.as_str() { @@ -343,3 +347,28 @@ fn build_prompt(messages: &[Message]) -> String { prompt.push_str("\n\n\n\n"); prompt } + +fn build_prompt_gpt_oss(messages: &[Message]) -> String { + let mut prompt = String::new(); + // System prompt + prompt.push_str("<|start|>system<|message|>"); + prompt.push_str("You are a helpful assistant.\n\n# Valid channels: analysis, commentary, final. Channel must be included for every message."); + prompt.push_str("<|end|>"); + for msg in messages { + match msg.role.as_str() { + "user" => { + prompt.push_str("<|start|>user<|message|>"); + prompt.push_str(&msg.content); + prompt.push_str("<|end|>"); + } + "assistant" => { + prompt.push_str("<|start|>assistant<|channel|>final<|message|>"); + prompt.push_str(&msg.content); + prompt.push_str("<|end|>"); + } + _ => {} + } + } + prompt.push_str("<|start|>assistant"); + prompt +} diff --git a/crates/xserv-server/src/main.rs b/crates/xserv-server/src/main.rs index e030c3d..7dd78b7 100644 --- a/crates/xserv-server/src/main.rs +++ b/crates/xserv-server/src/main.rs @@ -11,6 +11,7 @@ use xserv_model::ModelConfig; pub struct AppState { pub model_name: String, + pub model_type: String, pub engine_sender: Mutex>, pub engine_tokenizer: Mutex, pub max_seq_len: usize, @@ -99,8 +100,10 @@ async fn main() { } }); + let model_type = model_config.model_type.clone().unwrap_or_default(); let state = Arc::new(AppState { model_name, + model_type, engine_sender: Mutex::new(tx), engine_tokenizer: Mutex::new(tokenizer), max_seq_len,