use super::{LogitsContext, LogitsProcessor, ProcessorOutcome};
use crate::scheduler::ActiveSeq;
pub struct ToolCallDuringThinkingMask;
impl LogitsProcessor for ToolCallDuringThinkingMask {
fn apply(
&self,
logits: &mut [f32],
a: &mut ActiveSeq,
ctx: &LogitsContext,
) -> ProcessorOutcome {
if a.inside_thinking {
if let Some(tc_start) = ctx.tool_call_start_token
&& ctx.thinking_closed_by != Some(tc_start)
{
let idx = tc_start as usize;
if idx < logits.len() {
logits[idx] = f32::NEG_INFINITY;
}
}
} else if a.suppress_tool_call
&& let Some(tc_start) = ctx.tool_call_start_token
{
let idx = tc_start as usize;
if idx < logits.len() {
logits[idx] -= 12.0;
}
}
ProcessorOutcome::Continue
}
fn name(&self) -> &'static str {
"tool_call_during_thinking_mask"
}
}