[Frontend][Rust] Add gRPC forbidden token sequences and cache usage (#59837)

Signed-off-by: Alec Flowers <aflowers@nvidia.com>
This commit is contained in:
Alec
2026-10-07 07:46:44 -07:00
committed by GitHub
parent 548597367e
commit 14e3902d51
8 changed files with 125 additions and 12 deletions
+45 -1
View File
@@ -203,6 +203,10 @@ fn build_sampling_params(
if !d.allowed_token_ids.is_empty() {
params.allowed_token_ids = Some(d.allowed_token_ids.clone());
}
if !d.bad_words_token_ids.is_empty() {
params.bad_words_token_ids =
Some(d.bad_words_token_ids.iter().map(|sequence| sequence.ids.clone()).collect());
}
params.structured_outputs = convert_structured_output(d)?;
}
@@ -403,6 +407,7 @@ fn to_finish_info(finished: &Finished, token_ids: &[u32]) -> Result<pb::FinishIn
stop_reason,
kv_transfer_params: finished.kv_transfer_params.as_ref().and_then(json_to_proto_struct),
ec_transfer_params: finished.ec_transfer_params.as_ref().and_then(json_to_proto_struct),
num_cached_tokens: Some(finished.usage.cached_token_count as u32),
})
}
@@ -580,6 +585,41 @@ mod tests {
}
}
#[test]
fn grpc_bad_words_token_ids_survive_protobuf_conversion_and_lowering() {
let request = pb::GenerateRequest {
decoding: Some(pb::DecodingParameters {
bad_words_token_ids: vec![
pb::TokenIds { ids: vec![5] },
pb::TokenIds { ids: vec![7, 11] },
],
..Default::default()
}),
..base_request()
};
let encoded = request.encode_to_vec();
for stream in [false, true] {
let decoded = pb::GenerateRequest::decode(encoded.as_slice()).unwrap();
let text = to_text_request(decoded, stream, &["test-model".to_string()]).unwrap();
let engine = vllm_text::lower_text_request(
text,
vec![1],
SamplingHints::default(),
SamplingLimits {
max_model_len: 256,
max_logprobs: 20,
model_vocab_size: 512,
tokenizer_vocab_size: 512,
},
&TestTokenizer::new(),
)
.unwrap()
.generate_request;
let params = engine.sampling_params;
assert_eq!(params.bad_words_token_ids, Some(vec![vec![5], vec![7, 11]]));
}
}
#[test]
fn watermarking_defaults_and_opt_out_survive_protobuf_conversion() {
for watermarking in [None, Some(true), Some(false)] {
@@ -859,7 +899,9 @@ mod tests {
#[test]
fn to_sequence_output_threads_token_ids_into_eos_id() {
let fin = finished(FinishReason::Stop(None));
let mut fin = finished(FinishReason::Stop(None));
fin.usage.prompt_token_count = 8;
fin.usage.cached_token_count = 5;
let opts = ResponseOpts {
output_text: true,
output_token_ids: true,
@@ -868,10 +910,12 @@ mod tests {
let out = to_sequence_output("hello", &[10, 20, 30], None, Some(&fin), &opts)
.expect("sequence output");
let out = pb::SequenceOutput::decode(out.encode_to_vec().as_slice()).unwrap();
let finish = out.finish_info.expect("finish_info should be present");
assert_eq!(finish.finish_reason, PbFinishReason::Stop as i32);
assert_eq!(finish.stop_reason, Some(PbStopReason::EosTokenId(30)));
assert_eq!(finish.num_cached_tokens, Some(5));
}
#[test]
+2
View File
@@ -690,6 +690,7 @@ async fn unary_generate_returns_collected_text() {
pb::finish_info::FinishReason::Stop as i32
);
assert_eq!(finish.num_output_tokens, 3);
assert_eq!(finish.num_cached_tokens, Some(0));
let prompt = response.prompt_info.expect("prompt_info present");
assert_eq!(prompt.num_prompt_tokens, 5); // "hello" = 5 bytes
@@ -1438,6 +1439,7 @@ async fn streaming_generate_yields_incremental_responses() {
.find_map(|r| r.outputs.as_ref())
.expect("at least one output");
let finish = last_output.finish_info.as_ref().expect("finish_info on last output");
assert_eq!(finish.num_cached_tokens, Some(0));
assert_eq!(
finish.finish_reason,
pb::finish_info::FinishReason::Stop as i32
@@ -171,6 +171,7 @@ pub(super) fn prepare_chat_request(
logit_bias: convert_logit_bias(request.logit_bias)?,
allowed_token_ids: request.allowed_token_ids,
bad_words: request.bad_words,
bad_words_token_ids: None,
logprob_token_ids: None,
structured_outputs,
skip_reading_prefix_cache: None,
@@ -136,6 +136,7 @@ pub(super) fn prepare_completion_request(
logit_bias: convert_logit_bias(request.logit_bias)?,
allowed_token_ids: request.allowed_token_ids,
bad_words: None,
bad_words_token_ids: None,
logprob_token_ids: None,
structured_outputs,
skip_reading_prefix_cache: None,