use super::{LogitsContext, LogitsProcessor, ProcessorOutcome};
use crate::scheduler::ActiveSeq;
pub struct ForcedTokenFastPath;
impl LogitsProcessor for ForcedTokenFastPath {
fn apply(
&self,
_logits: &mut [f32],
a: &mut ActiveSeq,
ctx: &LogitsContext,
) -> ProcessorOutcome {
if !a.inside_thinking
&& a.top_logprobs.is_none()
&& ctx.sampling.forced_token_fastpath
&& let Some(ref mut gs) = a.grammar_state
&& let Some(forced) = gs.forced_token()
{
let forced = forced as u32;
let generated_before = a.output_tokens.len().saturating_add(ctx.verify_pos);
if crate::scheduler::eos_hold::eos_masked_at(a, forced, generated_before) {
return ProcessorOutcome::Continue;
}
return ProcessorOutcome::EmitToken(forced);
}
ProcessorOutcome::Continue
}
fn name(&self) -> &'static str {
"forced_token_fastpath"
}
}