language_models: Update tiktoken-rs to support newer models (#30951)
I was able to get this fix in upstream, so now we can have simpler code paths for our model selection. I also added a test to catch if this would cause a bug again in the future. Release Notes: - N/A
This commit is contained in:
parent
2b6dab9197
commit
57424e4743
3 changed files with 54 additions and 14 deletions
7
Cargo.lock
generated
7
Cargo.lock
generated
|
@ -15807,16 +15807,15 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tiktoken-rs"
|
name = "tiktoken-rs"
|
||||||
version = "0.6.0"
|
version = "0.7.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "44075987ee2486402f0808505dd65692163d243a337fc54363d49afac41087f6"
|
checksum = "25563eeba904d770acf527e8b370fe9a5547bacd20ff84a0b6c3bc41288e5625"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"base64 0.21.7",
|
"base64 0.22.1",
|
||||||
"bstr",
|
"bstr",
|
||||||
"fancy-regex 0.13.0",
|
"fancy-regex 0.13.0",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"parking_lot",
|
|
||||||
"regex",
|
"regex",
|
||||||
"rustc-hash 1.1.0",
|
"rustc-hash 1.1.0",
|
||||||
]
|
]
|
||||||
|
|
|
@ -555,7 +555,7 @@ sysinfo = "0.31.0"
|
||||||
take-until = "0.2.0"
|
take-until = "0.2.0"
|
||||||
tempfile = "3.20.0"
|
tempfile = "3.20.0"
|
||||||
thiserror = "2.0.12"
|
thiserror = "2.0.12"
|
||||||
tiktoken-rs = "0.6.0"
|
tiktoken-rs = "0.7.0"
|
||||||
time = { version = "0.3", features = [
|
time = { version = "0.3", features = [
|
||||||
"macros",
|
"macros",
|
||||||
"parsing",
|
"parsing",
|
||||||
|
|
|
@ -628,22 +628,24 @@ pub fn count_open_ai_tokens(
|
||||||
};
|
};
|
||||||
tiktoken_rs::num_tokens_from_messages(model, &messages)
|
tiktoken_rs::num_tokens_from_messages(model, &messages)
|
||||||
}
|
}
|
||||||
// Not currently supported by tiktoken_rs. All use the same tokenizer as gpt-4o (o200k_base)
|
|
||||||
Model::O1
|
|
||||||
| Model::FourPointOne
|
|
||||||
| Model::FourPointOneMini
|
|
||||||
| Model::FourPointOneNano
|
|
||||||
| Model::O3Mini
|
|
||||||
| Model::O3
|
|
||||||
| Model::O4Mini => tiktoken_rs::num_tokens_from_messages("gpt-4o", &messages),
|
|
||||||
// Currently supported by tiktoken_rs
|
// Currently supported by tiktoken_rs
|
||||||
|
// Sometimes tiktoken-rs is behind on model support. If that is the case, make a new branch
|
||||||
|
// arm with an override. We enumerate all supported models here so that we can check if new
|
||||||
|
// models are supported yet or not.
|
||||||
Model::ThreePointFiveTurbo
|
Model::ThreePointFiveTurbo
|
||||||
| Model::Four
|
| Model::Four
|
||||||
| Model::FourTurbo
|
| Model::FourTurbo
|
||||||
| Model::FourOmni
|
| Model::FourOmni
|
||||||
| Model::FourOmniMini
|
| Model::FourOmniMini
|
||||||
|
| Model::FourPointOne
|
||||||
|
| Model::FourPointOneMini
|
||||||
|
| Model::FourPointOneNano
|
||||||
|
| Model::O1
|
||||||
| Model::O1Preview
|
| Model::O1Preview
|
||||||
| Model::O1Mini => tiktoken_rs::num_tokens_from_messages(model.id(), &messages),
|
| Model::O1Mini
|
||||||
|
| Model::O3
|
||||||
|
| Model::O3Mini
|
||||||
|
| Model::O4Mini => tiktoken_rs::num_tokens_from_messages(model.id(), &messages),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.boxed()
|
.boxed()
|
||||||
|
@ -839,3 +841,42 @@ impl Render for ConfigurationView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use gpui::TestAppContext;
|
||||||
|
use language_model::LanguageModelRequestMessage;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[gpui::test]
|
||||||
|
fn tiktoken_rs_support(cx: &TestAppContext) {
|
||||||
|
let request = LanguageModelRequest {
|
||||||
|
thread_id: None,
|
||||||
|
prompt_id: None,
|
||||||
|
mode: None,
|
||||||
|
messages: vec![LanguageModelRequestMessage {
|
||||||
|
role: Role::User,
|
||||||
|
content: vec![MessageContent::Text("message".into())],
|
||||||
|
cache: false,
|
||||||
|
}],
|
||||||
|
tools: vec![],
|
||||||
|
tool_choice: None,
|
||||||
|
stop: vec![],
|
||||||
|
temperature: None,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Validate that all models are supported by tiktoken-rs
|
||||||
|
for model in Model::iter() {
|
||||||
|
let count = cx
|
||||||
|
.executor()
|
||||||
|
.block(count_open_ai_tokens(
|
||||||
|
request.clone(),
|
||||||
|
model,
|
||||||
|
&cx.app.borrow(),
|
||||||
|
))
|
||||||
|
.unwrap();
|
||||||
|
assert!(count > 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue