use dynamo_tokens::{
BlockHash, PositionalLineageHash, SaltHash, SequenceHash, TokenBlockSequence, Tokens,
};
use crate::block::UniversalBlock;
use crate::error::KvHashingError;
use crate::request::Request;
use crate::salt::compute_salt_hash;
impl Request {
pub fn salt_hash(&self) -> Result<SaltHash, KvHashingError> {
compute_salt_hash(self.salt(), self.lora_name())
}
pub fn into_blocks(&self, block_size: u32) -> Result<Vec<UniversalBlock>, KvHashingError> {
let salt_hash = self.salt_hash()?;
let token_mm = self.token_mm_info();
let seq = TokenBlockSequence::new_with_mm(
Tokens::from(self.tokens.clone()),
&token_mm,
block_size,
Some(salt_hash),
)?;
Ok(seq.blocks().iter().map(UniversalBlock::from).collect())
}
fn into_blocks_consuming(self, block_size: u32) -> Result<Vec<UniversalBlock>, KvHashingError> {
let salt_hash = compute_salt_hash(self.salt(), self.lora_name())?;
let token_mm = self.mm_info.into_iter().map(Into::into).collect::<Vec<_>>();
let seq = TokenBlockSequence::new_with_mm(
Tokens::from(self.tokens),
&token_mm,
block_size,
Some(salt_hash),
)?;
Ok(seq.blocks().iter().map(UniversalBlock::from).collect())
}
pub fn block_hashes(&self, block_size: u32) -> Result<Vec<BlockHash>, KvHashingError> {
Ok(self
.into_blocks(block_size)?
.into_iter()
.map(|b| b.block_hash)
.collect())
}
pub fn sequence_hashes(&self, block_size: u32) -> Result<Vec<SequenceHash>, KvHashingError> {
Ok(self
.into_blocks(block_size)?
.into_iter()
.map(|b| b.sequence_hash())
.collect())
}
pub fn into_sequence_hashes(
self,
block_size: u32,
) -> Result<Vec<SequenceHash>, KvHashingError> {
Ok(self
.into_blocks_consuming(block_size)?
.into_iter()
.map(|b| b.sequence_hash())
.collect())
}
pub fn positional_lineage_hashes(
&self,
block_size: u32,
) -> Result<Vec<PositionalLineageHash>, KvHashingError> {
Ok(self
.into_blocks(block_size)?
.into_iter()
.map(|b| b.plh)
.collect())
}
}