in src/requests.rs [602:646]
fn callback(&mut self, request: Arc<TextGenerationRequest>, response: &str) {
// retrieve current turn id
let id = match request.id {
None => {
return;
}
Some(id) => id,
};
// retrieve next turn from id
let next_request = match self.requests.get(&id) {
None => {
return;
}
Some(request) => request,
};
// create a new turn with the prompt concatenated with the response and next turn's prompt
// and add the next turn id to the new turn
let new_prompt =
request.prompt.clone() + "\n" + response + "\n" + next_request.request.prompt.as_str();
// tokenize the prompt
let (prompt, num_tokens) = match tokenize_prompt(
new_prompt.to_string(),
self.tokenizer.clone(),
&TokenizeOptions::default(),
) {
Ok((prompt, num_tokens)) => (prompt, num_tokens),
Err(_) => {
return;
}
};
let next_id = next_request.request.id;
let turn = ConversationTurnRequest {
id,
priority: 100, // move to the front of the queue
tie: Instant::now(), // use the current time as tie-breaking (older turns have higher priority)
request: TextGenerationRequest {
id: next_id,
prompt,
num_prompt_tokens: num_tokens,
num_decode_tokens: request.num_decode_tokens, // decode tokens do not change between turns
},
};
//debug!("Adding new turn to queue: {turn}", turn = turn.request.prompt);
self.queue.push(turn);
}