use crate::{
codec::{Dict, StrOrList, Wire},
error::{Error, Result},
msgpack::{Decoder, Encoder},
tensor::Tensor,
value::Value,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Modality {
Image = 1,
Video = 2,
Audio = 3,
}
impl Wire for Modality {
fn encode(&self, encoder: &mut Encoder) {
encoder.uint(*self as u64);
}
fn decode(decoder: &mut Decoder<'_>) -> Result<Self> {
match decoder.integer()?.narrow::<i64>("Modality")? {
1 => Ok(Modality::Image),
2 => Ok(Modality::Video),
3 => Ok(Modality::Audio),
other => Err(Error::Invalid(format!("unknown modality {other}"))),
}
}
}
wire_struct! {
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ShmTensorHandle: map {
pub shm_name: String,
pub shape: Vec<i64>,
pub dtype: String,
}
}
wire_struct! {
#[derive(Debug, Clone, PartialEq)]
pub struct MultimodalDataItem: array {
pub modality: Modality,
pub hash: Option<u64> = None,
pub pad_value: Option<i64> = None,
pub offsets: Option<Vec<(i64, i64)>> = None,
pub feature: Option<Tensor> = None,
pub feature_shm: Option<ShmTensorHandle> = None,
pub model_specific_data: Dict<String, Tensor> = Dict::default(),
pub encoded: Option<Tensor> = None,
pub encoded_deepstack: Option<Tensor> = None,
pub encode_handshake: Option<Dict<Value, Value>> = None,
}
}
wire_struct! {
#[derive(Debug, Clone, PartialEq)]
pub struct MultimodalInputs: array {
pub mm_items: Vec<MultimodalDataItem>,
pub im_token_id: Option<i64> = None,
pub video_token_id: Option<i64> = None,
pub mrope_positions: Option<Tensor> = None,
pub mrope_position_delta: Option<Tensor> = None,
pub mrope_position_delta_scalar: Option<i64> = None,
pub mrope_position_delta_repeated_cache: Option<Tensor> = None,
}
}
wire_struct! {
#[derive(Debug, Clone, PartialEq)]
pub struct EncodeRequest: array("EncodeRequest") {
pub rid: Option<StrOrList> = None,
pub http_worker_ipc: Option<String> = None,
pub request_id: String,
pub bootstrap_host: String,
pub bootstrap_port: i64,
pub bootstrap_room: u64,
pub items: Vec<MultimodalDataItem>,
}
}