supercode_interchange/
token_estimator.rs1use crate::message::ChatMessage;
8
9pub fn estimate_tokens(value: &str) -> u64 {
11 (value.len() as u64).div_ceil(4)
12}
13
14pub fn estimate_view_tokens(messages: &[ChatMessage]) -> u64 {
16 messages.iter().map(estimate_message_tokens).sum()
17}
18
19fn estimate_message_tokens(message: &ChatMessage) -> u64 {
20 match serde_json::to_string(message) {
21 Ok(wire) => estimate_tokens(&wire),
22 Err(_) => estimate_tokens(&format!("{message:?}")),
23 }
24}
25
26pub fn format_commas(n: usize) -> String {
28 let digits = n.to_string();
29 let bytes = digits.as_bytes();
30 let mut output = String::with_capacity(bytes.len() + bytes.len() / 3);
31 for (index, byte) in bytes.iter().enumerate() {
32 if index > 0 && (bytes.len() - index) % 3 == 0 {
33 output.push(',');
34 }
35 output.push(*byte as char);
36 }
37 output
38}