#![allow(non_camel_case_types)]
use std::os::raw::{c_char, c_float, c_int, c_void};
pub type baseRT_model_t = *mut c_void;
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct BaseRTModelConfig {
pub dim: u32,
pub n_layers: u32,
pub n_heads: u32,
pub n_kv_heads: u32,
pub head_dim: u32,
pub q_dim: u32,
pub kv_dim: u32,
pub ffn_dim: u32,
pub vocab_size: u32,
pub max_seq_len: u32,
pub norm_eps: c_float,
pub rope_theta: c_float,
pub sliding_window_pattern: u32,
pub sliding_window: u32,
pub rope_local_theta: c_float,
pub architecture: [c_char; 32],
pub enc_n_layers: u32,
pub enc_n_heads: u32,
pub enc_dim: u32,
pub enc_ffn_dim: u32,
pub n_mels: u32,
pub enc_max_seq_len: u32,
pub n_embd_per_layer: u32,
pub n_layer_kv_from_start: u32,
pub logit_softcap: c_float,
pub attention_scale: c_float,
pub head_dim_swa: u32,
pub head_dim_global: u32,
pub global_rope_partial_factor: c_float,
pub swa_layers: [u8; 64],
pub ffn_dims: [u32; 128],
pub n_kv_heads_per_layer: [u32; 128],
pub attn_output_gate: u8,
pub _qwen35_pad: [u8; 3],
pub partial_rotary_factor: c_float,
pub full_attention_interval: u32,
pub linear_attn_layers: [u8; 64],
pub gdn_num_k_heads: u32,
pub gdn_num_v_heads: u32,
pub gdn_key_head_dim: u32,
pub gdn_value_head_dim: u32,
pub gdn_conv_kernel: u32,
pub ssm_state_size: u32,
pub ssm_conv_kernel: u32,
pub ssm_num_groups: u32,
pub ssm_inner_size: u32,
pub ssm_num_heads: u32,
pub n_experts: u32,
pub n_experts_used: u32,
pub n_experts_shared: u32,
pub expert_ffn_dim: u32,
pub expert_gating: u8,
pub norm_topk_prob: u8,
pub _moe_pad: [u8; 2],
pub expert_weights_scale: c_float,
pub vision_n_layers: u32,
pub vision_dim: u32,
pub vision_n_heads: u32,
pub vision_head_dim: u32,
pub vision_ffn_dim: u32,
pub vision_patch_size: u32,
pub vision_image_size: u32,
pub vision_pooling_kernel: u32,
pub vision_soft_tokens: u32,
pub vision_norm_eps: c_float,
pub vision_rope_theta: c_float,
pub vision_pos_embed_size: u32,
pub image_token_id: u32,
pub boi_token_id: u32,
pub eoi_token_id: u32,
pub vision_arch: u32,
pub vision_spatial_merge: u32,
pub vision_temporal_patch: u32,
pub vision_out_dim: u32,
pub audio_n_layers: u32,
pub audio_dim: u32,
pub audio_n_heads: u32,
pub audio_head_dim: u32,
pub audio_ffn_dim: u32,
pub audio_output_proj_dim: u32,
pub audio_chunk_size: u32,
pub audio_left_context: u32,
pub audio_conv_kernel: u32,
pub audio_soft_tokens: u32,
pub audio_logit_softcap: c_float,
pub audio_norm_eps: c_float,
pub audio_gradient_clip: c_float,
pub audio_residual_weight: c_float,
pub audio_ms_per_token: c_float,
pub audio_sscp_channels: [u32; 2],
pub audio_token_id: u32,
pub boa_token_id: u32,
pub eoa_token_id: u32,
pub mrope_section: [u32; 3],
pub mrope_interleaved: u8,
pub _mrope_pad: [u8; 3],
pub rope_scaling_factor: c_float,
pub rope_low_freq_factor: c_float,
pub rope_high_freq_factor: c_float,
pub rope_orig_max_pos: u32,
pub rope_scaling_type: u32,
pub qk_scale_factor: c_float,
pub output_multiplier: c_float,
pub post_norm_eps: c_float,
pub nope_layers: [u8; 64],
pub embed_norm_eps: c_float,
pub vision_window_layers: [u8; 64],
pub vision_window_size: u32,
pub vision_pos_embed_h: u32,
pub vision_pos_embed_w: u32,
pub vision_adapter_dim: u32,
pub video_token_id: u32,
pub q_lora_rank: u32,
pub kv_lora_rank: u32,
pub qk_nope_head_dim: u32,
pub qk_rope_head_dim: u32,
pub v_head_dim: u32,
pub routed_scaling_factor: c_float,
pub first_k_dense_replace: u32,
pub nextn_predict_layers: u32,
pub indexer_head_count: u32,
pub indexer_key_length: u32,
pub indexer_top_k: u32,
pub rope_yarn_beta_fast: f32,
pub rope_yarn_beta_slow: f32,
pub swiglu_limit: f32,
pub swiglu_alpha: f32,
pub attention_sinks: u8,
pub attention_bias: u8,
pub rope_yarn_truncate: u8,
pub _gptoss_pad: u8,
}
#[repr(C)]
#[derive(Debug, Clone, Copy, Default)]
pub struct BaseRTTranscribeStats {
pub n_tokens: c_int,
pub audio_ms: c_float,
pub encode_ms: c_float,
pub decode_ms: c_float,
pub total_ms: c_float,
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct BaseRTTranscribeSegment {
pub start_ms: c_int,
pub end_ms: c_int,
pub text: *const c_char,
pub avg_logprob: c_float,
pub no_speech_prob: c_float,
pub compression_ratio: c_float,
pub temperature: c_float,
}
impl Default for BaseRTTranscribeSegment {
fn default() -> Self {
Self {
start_ms: 0,
end_ms: 0,
text: std::ptr::null(),
avg_logprob: 0.0,
no_speech_prob: 0.0,
compression_ratio: 0.0,
temperature: 0.0,
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct BaseRTSamplingConfig {
pub temperature: c_float,
pub top_k: c_int,
pub top_p: c_float,
pub min_p: c_float,
pub repeat_penalty: c_float,
pub presence_penalty: c_float,
pub frequency_penalty: c_float,
pub seed: u32,
pub n_logit_bias: i32,
pub logit_bias_tokens: *const i32,
pub logit_bias_values: *const c_float,
}
impl Default for BaseRTSamplingConfig {
fn default() -> Self {
Self {
temperature: 0.0,
top_k: 40,
top_p: 0.9,
min_p: 0.0,
repeat_penalty: 1.0,
presence_penalty: 0.0,
frequency_penalty: 0.0,
seed: 0,
n_logit_bias: 0,
logit_bias_tokens: std::ptr::null(),
logit_bias_values: std::ptr::null(),
}
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy, Default)]
pub struct BaseRTGenerationStats {
pub prompt_tokens: c_int,
pub generated_tokens: c_int,
pub prefill_time_ms: c_float,
pub decode_time_ms: c_float,
pub prefill_tokens_per_sec: c_float,
pub decode_tokens_per_sec: c_float,
}
pub type baseRT_sequence_t = *mut c_void;
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct BaseRTPrefixMatch {
pub matched_tokens: c_int,
pub n_blocks: c_int,
pub blocks: *const c_int,
pub handle: u64,
}
pub type baseRT_token_callback = Option<
unsafe extern "C" fn(token_id: u32, text: *const c_char, user_data: *mut c_void) -> bool,
>;
pub type baseRT_segment_callback = Option<
unsafe extern "C" fn(
start_ms: c_int,
end_ms: c_int,
text: *const c_char,
user_data: *mut c_void,
) -> bool,
>;
extern "C" {
pub fn baseRT_load_model(
model_path: *const c_char,
kernel_library_path: *const c_char,
max_context: c_int,
) -> baseRT_model_t;
pub fn baseRT_free_model(model: baseRT_model_t);
pub fn baseRT_load_tokenizer_only(model_path: *const c_char) -> baseRT_model_t;
pub fn baseRT_get_config(model: baseRT_model_t) -> BaseRTModelConfig;
pub fn baseRT_model_config_sizeof() -> usize;
pub fn baseRT_abi_version() -> std::os::raw::c_uint;
pub fn baseRT_get_config_into(model: baseRT_model_t, out: *mut c_void, out_size: usize) -> usize;
pub fn baseRT_model_memory(model: baseRT_model_t) -> usize;
pub fn baseRT_device_memory_budget() -> usize;
pub fn baseRT_suggest_max_context(
model_path: *const c_char,
max_batch: c_int,
kv_bits: c_int,
paged_kv: c_int,
) -> c_int;
pub fn baseRT_suggest_max_context_multi(
model_paths: *const *const c_char,
n_models: c_int,
max_batch: c_int,
kv_bits: c_int,
paged_kv: c_int,
) -> c_int;
pub fn baseRT_suggest_max_context_spec(
model_paths: *const *const c_char,
n_models: c_int,
speculator_paths: *const *const c_char,
speculator_embedded: *const c_int,
speculator_target: *const c_int,
n_speculators: c_int,
max_batch: c_int,
kv_bits: c_int,
paged_kv: c_int,
) -> c_int;
pub fn baseRT_context_window_fits(
model_paths: *const *const c_char,
n_models: c_int,
max_batch: c_int,
kv_bits: c_int,
paged_kv: c_int,
window: c_int,
) -> c_int;
pub fn baseRT_get_error() -> *const c_char;
pub fn baseRT_encode(
model: baseRT_model_t,
text: *const c_char,
out_tokens: *mut u32,
max_tokens: c_int,
) -> c_int;
pub fn baseRT_encode_plain(
model: baseRT_model_t,
text: *const c_char,
out_tokens: *mut u32,
max_tokens: c_int,
) -> c_int;
pub fn baseRT_encode_pieces(
model: baseRT_model_t,
texts: *const *const c_char,
plain: *const c_int,
n_pieces: c_int,
out_tokens: *mut u32,
max_tokens: c_int,
) -> c_int;
pub fn baseRT_decode_token(model: baseRT_model_t, token_id: u32) -> *const c_char;
pub fn baseRT_decode_token_raw(
model: baseRT_model_t,
token_id: u32,
out: *mut c_char,
max_bytes: c_int,
) -> c_int;
pub fn baseRT_generate(
model: baseRT_model_t,
prompt_tokens: *const u32,
n_prompt: c_int,
max_tokens: c_int,
sampling: BaseRTSamplingConfig,
callback: baseRT_token_callback,
user_data: *mut c_void,
) -> BaseRTGenerationStats;
pub fn baseRT_generate_continue(
model: baseRT_model_t,
new_tokens: *const u32,
n_new: c_int,
max_tokens: c_int,
sampling: BaseRTSamplingConfig,
callback: baseRT_token_callback,
user_data: *mut c_void,
) -> BaseRTGenerationStats;
pub fn baseRT_prefill(model: baseRT_model_t, tokens: *const u32, n_tokens: c_int) -> u32;
pub fn baseRT_decode_step(model: baseRT_model_t, token_id: u32, position: c_int) -> u32;
pub fn baseRT_chain_decode(
model: baseRT_model_t,
first_token: u32,
start_position: c_int,
count: c_int,
out_tokens: *mut u32,
) -> c_int;
pub fn baseRT_get_position(model: baseRT_model_t) -> c_int;
pub fn baseRT_set_speculation(model: baseRT_model_t, enabled: bool);
pub fn baseRT_reset(model: baseRT_model_t);
pub fn baseRT_transcribe(
model: baseRT_model_t,
wav_path: *const c_char,
language: *const c_char,
stats_out: *mut BaseRTTranscribeStats,
) -> *const c_char;
pub fn baseRT_transcribe_pcm(
model: baseRT_model_t,
samples: *const c_float,
n_samples: c_int,
language: *const c_char,
stats_out: *mut BaseRTTranscribeStats,
) -> *const c_char;
pub fn baseRT_set_timestamps(model: baseRT_model_t, enabled: bool);
pub fn baseRT_set_task(model: baseRT_model_t, task: *const c_char) -> bool;
pub fn baseRT_set_initial_prompt(model: baseRT_model_t, text: *const c_char);
pub fn baseRT_set_condition_on_previous_text(model: baseRT_model_t, enabled: bool);
pub fn baseRT_transcribe_language(model: baseRT_model_t) -> *const c_char;
pub fn baseRT_transcribe_audio_duration_ms(model: baseRT_model_t) -> c_int;
pub fn baseRT_transcribe_segment_count(model: baseRT_model_t) -> c_int;
pub fn baseRT_transcribe_segment(
model: baseRT_model_t,
index: c_int,
out: *mut BaseRTTranscribeSegment,
) -> bool;
pub fn baseRT_is_whisper(model: baseRT_model_t) -> bool;
pub fn baseRT_transcribe_pcm_stream(
model: baseRT_model_t,
samples: *const c_float,
n_samples: c_int,
language: *const c_char,
stats_out: *mut BaseRTTranscribeStats,
callback: baseRT_segment_callback,
user_data: *mut c_void,
) -> *const c_char;
pub fn baseRT_transcribe_stream(
model: baseRT_model_t,
wav_path: *const c_char,
language: *const c_char,
stats_out: *mut BaseRTTranscribeStats,
callback: baseRT_segment_callback,
user_data: *mut c_void,
) -> *const c_char;
pub fn baseRT_embed(
model: baseRT_model_t,
tokens: *const u32,
n_tokens: c_int,
out_embedding: *mut c_float,
max_dims: c_int,
) -> c_int;
pub fn baseRT_embed_text(
model: baseRT_model_t,
text: *const c_char,
out_embedding: *mut c_float,
max_dims: c_int,
) -> c_int;
pub fn baseRT_embedding_dim(model: baseRT_model_t) -> c_int;
pub fn baseRT_is_embedding_model(model: baseRT_model_t) -> bool;
pub fn baseRT_format_chat(
model: baseRT_model_t,
system_prompt: *const c_char,
user_message: *const c_char,
) -> *const c_char;
pub fn baseRT_chat_template(model: baseRT_model_t) -> *const c_char;
pub fn baseRT_chat_template_jinja(model: baseRT_model_t) -> *const c_char;
pub fn baseRT_grammar_create_from_schema(
model: baseRT_model_t,
json_schema: *const c_char,
) -> *mut std::os::raw::c_void;
pub fn baseRT_grammar_create_from_structural_tag(
model: baseRT_model_t,
tag_json: *const c_char,
) -> *mut std::os::raw::c_void;
pub fn baseRT_grammar_create(
model: baseRT_model_t,
gbnf: *const c_char,
) -> *mut std::os::raw::c_void;
pub fn baseRT_grammar_accept_token(
grammar: *mut std::os::raw::c_void,
token_id: u32,
) -> std::os::raw::c_int;
pub fn baseRT_grammar_reset(grammar: *mut std::os::raw::c_void);
pub fn baseRT_grammar_free(grammar: *mut std::os::raw::c_void);
pub fn baseRT_special_token_count(model: baseRT_model_t) -> c_int;
pub fn baseRT_special_token(
model: baseRT_model_t,
index: c_int,
id_out: *mut u32,
) -> *const c_char;
pub fn baseRT_token_count(model: baseRT_model_t, text: *const c_char) -> c_int;
pub fn baseRT_tensor_count(model: baseRT_model_t) -> c_int;
pub fn baseRT_tensor_name(model: baseRT_model_t, index: c_int) -> *const c_char;
pub fn baseRT_tensor_dtype(model: baseRT_model_t, index: c_int) -> u32;
pub fn baseRT_tensor_raw_dtype(model: baseRT_model_t, index: c_int) -> *const c_char;
pub fn baseRT_profile_decode_step(
model: baseRT_model_t,
token_id: u32,
position: c_int,
timing_out: *mut c_float,
max_entries: c_int,
) -> c_int;
pub fn baseRT_profile_label(model: baseRT_model_t, index: c_int) -> *const c_char;
pub fn baseRT_gpu_temperature_scale(model: baseRT_model_t, temperature: c_float);
pub fn baseRT_gpu_repetition_penalty(
model: baseRT_model_t,
token_ids: *const u32,
n_tokens: c_int,
penalty: c_float,
);
pub fn baseRT_set_paged_kv(enable: c_int);
pub fn baseRT_set_baked_decode(enable: c_int);
pub fn baseRT_set_max_batch_size(n: c_int);
pub fn baseRT_set_prefix_cache(enable: c_int);
pub fn baseRT_set_prefill_chunk(n: c_int);
pub fn baseRT_set_kv_bits(bits: c_int);
pub fn baseRT_set_verbose(on: c_int);
pub fn baseRT_get_error_code() -> c_int;
pub fn baseRT_strerror(code: c_int) -> *const c_char;
pub fn baseRT_capabilities(model: baseRT_model_t) -> u32;
pub fn baseRT_eos_token_id(model: baseRT_model_t) -> u32;
pub fn baseRT_is_eos_token(model: baseRT_model_t, token: u32) -> i32;
pub fn baseRT_weights_identity(model: baseRT_model_t) -> u64;
pub fn baseRT_kv_bits_effective(model: baseRT_model_t) -> c_int;
pub fn baseRT_bos_id(model: baseRT_model_t) -> u32;
pub fn baseRT_sequence_create(model: baseRT_model_t) -> baseRT_sequence_t;
pub fn baseRT_sequence_free(seq: baseRT_sequence_t);
pub fn baseRT_sequence_rollback(seq: baseRT_sequence_t, length: c_int) -> c_int;
pub fn baseRT_batch_step(
model: baseRT_model_t,
seqs: *mut baseRT_sequence_t,
n_seqs: c_int,
in_tokens: *const u32,
in_token_counts: *const c_int,
out_tokens: *mut u32,
) -> c_int;
pub fn baseRT_batch_step_fused(
model: baseRT_model_t,
seqs: *mut baseRT_sequence_t,
n_seqs: c_int,
in_tokens: *const u32,
in_token_counts: *const c_int,
out_tokens: *mut u32,
) -> c_int;
pub fn baseRT_batch_step_fused_logits(
model: baseRT_model_t,
seqs: *mut baseRT_sequence_t,
n_seqs: c_int,
in_tokens: *const u32,
in_token_counts: *const c_int,
) -> c_int;
pub fn baseRT_batch_warmup(model: baseRT_model_t, max_batch: c_int) -> c_int;
pub fn baseRT_max_prefill_chunk(model: baseRT_model_t) -> c_int;
pub fn baseRT_read_batch_logits(
model: baseRT_model_t,
n_seqs: c_int,
out_logits_f16: *mut c_void,
) -> c_int;
pub fn baseRT_batch_logits_stride(model: baseRT_model_t) -> usize;
pub fn baseRT_mask_logits_row(
model: baseRT_model_t,
row: *mut c_void,
bitmask: *const i32,
) -> c_int;
pub fn baseRT_sample_logits_row(
model: baseRT_model_t,
row: *const c_void,
cfg: *const BaseRTSamplingConfig,
prev_tokens: *const u32,
n_prev: c_int,
repeat_window: c_int,
seed_offset: u32,
) -> u32;
pub fn baseRT_argmax_logits_row(model: baseRT_model_t, row: *const c_void) -> u32;
pub fn baseRT_logits_row_logprobs(
model: baseRT_model_t,
row: *const c_void,
token: u32,
top_k: c_int,
out_token_logprob: *mut c_float,
out_ids: *mut u32,
out_logprobs: *mut c_float,
) -> c_int;
pub fn baseRT_prefix_match(
model: baseRT_model_t,
tokens: *const u32,
n_tokens: c_int,
) -> BaseRTPrefixMatch;
pub fn baseRT_sequence_seed_prefix(
seq: baseRT_sequence_t,
blocks: *const c_int,
n_blocks: c_int,
n_tokens: c_int,
) -> c_int;
pub fn baseRT_page_size(model: baseRT_model_t) -> c_int;
pub fn baseRT_prefix_insert(
model: baseRT_model_t,
tokens: *const u32,
n_tokens: c_int,
seq: baseRT_sequence_t,
) -> c_int;
pub fn baseRT_prefix_unlock(model: baseRT_model_t, handle: u64);
pub fn baseRT_prefix_release(model: baseRT_model_t, handle: u64);
pub fn baseRT_prefix_discard(model: baseRT_model_t, handle: u64);
pub fn baseRT_prefix_evict(model: baseRT_model_t, n_blocks: c_int) -> c_int;
pub fn baseRT_prefix_cache_stats(
model: baseRT_model_t,
out_hits: *mut u64,
out_misses: *mut u64,
out_reused_tokens: *mut u64,
out_blocks_cached: *mut c_int,
);
pub fn baseRT_gdn_snapshot_size(model: baseRT_model_t) -> c_int;
pub fn baseRT_sequence_gdn_capture(seq: baseRT_sequence_t, out: *mut u8, cap: c_int) -> c_int;
pub fn baseRT_sequence_gdn_restore(
seq: baseRT_sequence_t,
blob: *const u8,
len: c_int,
) -> c_int;
}
#[cfg(test)]
mod tests {
use super::*;
use std::mem;
#[test]
fn model_config_size() {
assert!(
mem::size_of::<BaseRTModelConfig>() > 1000,
"config struct unexpectedly small ({})",
mem::size_of::<BaseRTModelConfig>()
);
assert_eq!(mem::size_of::<BaseRTModelConfig>(), 1792);
}
#[test]
fn model_config_size_matches_library() {
assert_eq!(
unsafe { baseRT_model_config_sizeof() },
mem::size_of::<BaseRTModelConfig>(),
"BaseRTModelConfig mirror drifted from include/baseRT/types.h"
);
}
#[test]
fn model_config_alignment() {
assert_eq!(mem::align_of::<BaseRTModelConfig>(), 4);
}
#[test]
fn sampling_config_size() {
assert_eq!(mem::size_of::<BaseRTSamplingConfig>(), 56);
}
#[test]
fn sampling_config_alignment() {
assert_eq!(mem::align_of::<BaseRTSamplingConfig>(), 8);
}
#[test]
fn generation_stats_size() {
assert_eq!(mem::size_of::<BaseRTGenerationStats>(), 24);
}
#[test]
fn generation_stats_alignment() {
assert_eq!(mem::align_of::<BaseRTGenerationStats>(), 4);
}
#[test]
fn transcribe_stats_size() {
assert_eq!(mem::size_of::<BaseRTTranscribeStats>(), 20);
}
#[test]
fn transcribe_stats_alignment() {
assert_eq!(mem::align_of::<BaseRTTranscribeStats>(), 4);
}
#[test]
fn model_config_field_offsets() {
let base: BaseRTModelConfig = unsafe { mem::zeroed() };
let base_ptr = &base as *const _ as usize;
assert_eq!(&base.dim as *const _ as usize - base_ptr, 0);
assert_eq!(&base.n_layers as *const _ as usize - base_ptr, 4);
assert_eq!(&base.norm_eps as *const _ as usize - base_ptr, 40);
assert_eq!(&base.rope_theta as *const _ as usize - base_ptr, 44);
assert_eq!(
&base.sliding_window_pattern as *const _ as usize - base_ptr,
48
);
assert_eq!(&base.sliding_window as *const _ as usize - base_ptr, 52);
assert_eq!(&base.rope_local_theta as *const _ as usize - base_ptr, 56);
assert_eq!(&base.architecture as *const _ as usize - base_ptr, 60);
assert_eq!(&base.enc_n_layers as *const _ as usize - base_ptr, 92);
assert_eq!(&base.enc_max_seq_len as *const _ as usize - base_ptr, 112);
assert_eq!(&base.swa_layers as *const _ as usize - base_ptr, 144);
assert_eq!(&base.ffn_dims as *const _ as usize - base_ptr, 208);
assert_eq!(&base.attn_output_gate as *const _ as usize - base_ptr, 1232);
assert_eq!(
&base.linear_attn_layers as *const _ as usize - base_ptr,
1244
);
assert_eq!(&base.gdn_num_k_heads as *const _ as usize - base_ptr, 1308);
assert_eq!(&base.ssm_state_size as *const _ as usize - base_ptr, 1328);
assert_eq!(&base.ssm_num_heads as *const _ as usize - base_ptr, 1344);
assert_eq!(&base.n_experts as *const _ as usize - base_ptr, 1348);
assert_eq!(
&base.expert_weights_scale as *const _ as usize - base_ptr,
1368
);
assert_eq!(&base.vision_n_layers as *const _ as usize - base_ptr, 1372);
assert_eq!(&base.vision_arch as *const _ as usize - base_ptr, 1432);
assert_eq!(&base.audio_n_layers as *const _ as usize - base_ptr, 1448);
assert_eq!(&base.eoa_token_id as *const _ as usize - base_ptr, 1524);
assert_eq!(&base.mrope_section as *const _ as usize - base_ptr, 1528);
assert_eq!(
&base.mrope_interleaved as *const _ as usize - base_ptr,
1540
);
assert_eq!(
&base.rope_scaling_factor as *const _ as usize - base_ptr,
1544
);
assert_eq!(
&base.rope_orig_max_pos as *const _ as usize - base_ptr,
1556
);
assert_eq!(
&base.rope_scaling_type as *const _ as usize - base_ptr,
1560
);
assert_eq!(&base.qk_scale_factor as *const _ as usize - base_ptr, 1564);
assert_eq!(&base.nope_layers as *const _ as usize - base_ptr, 1576);
assert_eq!(&base.embed_norm_eps as *const _ as usize - base_ptr, 1640);
assert_eq!(
&base.vision_window_layers as *const _ as usize - base_ptr,
1644
);
assert_eq!(&base.video_token_id as *const _ as usize - base_ptr, 1724);
assert_eq!(&base.q_lora_rank as *const _ as usize - base_ptr, 1728);
assert_eq!(&base.indexer_top_k as *const _ as usize - base_ptr, 1768);
assert_eq!(
&base.rope_yarn_beta_fast as *const _ as usize - base_ptr,
1772
);
}
#[test]
fn sampling_config_field_offsets() {
let base = BaseRTSamplingConfig::default();
let base_ptr = &base as *const _ as usize;
assert_eq!(&base.temperature as *const _ as usize - base_ptr, 0);
assert_eq!(&base.top_k as *const _ as usize - base_ptr, 4);
assert_eq!(&base.top_p as *const _ as usize - base_ptr, 8);
assert_eq!(&base.min_p as *const _ as usize - base_ptr, 12);
assert_eq!(&base.repeat_penalty as *const _ as usize - base_ptr, 16);
assert_eq!(&base.presence_penalty as *const _ as usize - base_ptr, 20);
assert_eq!(&base.frequency_penalty as *const _ as usize - base_ptr, 24);
assert_eq!(&base.seed as *const _ as usize - base_ptr, 28);
assert_eq!(&base.n_logit_bias as *const _ as usize - base_ptr, 32);
assert_eq!(&base.logit_bias_tokens as *const _ as usize - base_ptr, 40);
assert_eq!(&base.logit_bias_values as *const _ as usize - base_ptr, 48);
}
#[test]
fn generation_stats_field_offsets() {
let base = BaseRTGenerationStats::default();
let base_ptr = &base as *const _ as usize;
assert_eq!(&base.prompt_tokens as *const _ as usize - base_ptr, 0);
assert_eq!(&base.generated_tokens as *const _ as usize - base_ptr, 4);
assert_eq!(&base.prefill_time_ms as *const _ as usize - base_ptr, 8);
assert_eq!(&base.decode_time_ms as *const _ as usize - base_ptr, 12);
assert_eq!(
&base.prefill_tokens_per_sec as *const _ as usize - base_ptr,
16
);
assert_eq!(
&base.decode_tokens_per_sec as *const _ as usize - base_ptr,
20
);
}
#[test]
fn sampling_config_default_values() {
let cfg = BaseRTSamplingConfig::default();
assert_eq!(cfg.temperature, 0.0);
assert_eq!(cfg.top_k, 40);
assert!((cfg.top_p - 0.9).abs() < f32::EPSILON);
assert_eq!(cfg.min_p, 0.0);
assert_eq!(cfg.repeat_penalty, 1.0);
assert_eq!(cfg.presence_penalty, 0.0);
assert_eq!(cfg.frequency_penalty, 0.0);
assert_eq!(cfg.seed, 0);
assert_eq!(cfg.n_logit_bias, 0);
assert!(cfg.logit_bias_tokens.is_null());
assert!(cfg.logit_bias_values.is_null());
}
#[test]
fn prefix_match_layout() {
assert_eq!(mem::size_of::<BaseRTPrefixMatch>(), 24);
assert_eq!(mem::offset_of!(BaseRTPrefixMatch, matched_tokens), 0);
assert_eq!(mem::offset_of!(BaseRTPrefixMatch, n_blocks), 4);
assert_eq!(mem::offset_of!(BaseRTPrefixMatch, blocks), 8);
assert_eq!(mem::offset_of!(BaseRTPrefixMatch, handle), 16);
}
#[test]
fn transcribe_stats_default_values() {
let stats = BaseRTTranscribeStats::default();
assert_eq!(stats.n_tokens, 0);
assert_eq!(stats.audio_ms, 0.0);
assert_eq!(stats.encode_ms, 0.0);
assert_eq!(stats.decode_ms, 0.0);
assert_eq!(stats.total_ms, 0.0);
}
#[test]
fn generation_stats_default_values() {
let stats = BaseRTGenerationStats::default();
assert_eq!(stats.prompt_tokens, 0);
assert_eq!(stats.generated_tokens, 0);
assert_eq!(stats.prefill_time_ms, 0.0);
assert_eq!(stats.decode_time_ms, 0.0);
assert_eq!(stats.prefill_tokens_per_sec, 0.0);
assert_eq!(stats.decode_tokens_per_sec, 0.0);
}
}