Skip to content

Commit cd0eb6f

Browse files
authored
fix: improve LLM caching (#1088)
1 parent eeafdfb commit cd0eb6f

1 file changed

Lines changed: 19 additions & 9 deletions

File tree

  • crates/forge_provider/src/forge_provider/transformers

crates/forge_provider/src/forge_provider/transformers/set_cache.rs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,21 @@ pub struct SetCache;
88
impl Transformer for SetCache {
99
type Value = Request;
1010

11+
/// Caches the last 2 eligible messages to optimize API performance. System
12+
/// messages are always eligible, User messages are eligible (but
13+
/// consecutive User messages are consolidated to only the last one),
14+
/// and Assistant messages are never cached but reset User message
15+
/// sequences.
1116
fn transform(&mut self, mut request: Self::Value) -> Self::Value {
1217
if let Some(messages) = request.messages.as_mut() {
1318
let mut last_was_user = false;
1419
let mut cache_positions = Vec::new();
1520
for (i, message) in messages.iter().enumerate() {
1621
if message.role == Role::User {
17-
if !last_was_user {
18-
cache_positions.push(i);
22+
if last_was_user {
23+
cache_positions.pop();
1924
}
25+
cache_positions.push(i);
2026
last_was_user = true;
2127
} else if message.role == Role::Assistant {
2228
last_was_user = false;
@@ -26,7 +32,7 @@ impl Transformer for SetCache {
2632
}
2733
}
2834

29-
for pos in cache_positions.into_iter().rev().skip(2).take(2) {
35+
for pos in cache_positions.into_iter().rev().take(2) {
3036
if let Some(ref content) = messages[pos].content {
3137
messages[pos].content = Some(content.clone().cached());
3238
}
@@ -117,27 +123,31 @@ mod tests {
117123
#[test]
118124
fn test_transformation() {
119125
let actual = create_test_context("suu");
120-
let expected = "suu";
126+
let expected = "[su[u"; // FIXME
121127
assert_eq!(actual, expected);
122128

123129
let actual = create_test_context("suua");
124-
let expected = "suua";
130+
let expected = "[su[ua";
125131
assert_eq!(actual, expected);
126132

127133
let actual = create_test_context("suuau");
128-
let expected = "[suuau";
134+
let expected = "su[ua[u";
129135
assert_eq!(actual, expected);
130136

131137
let actual = create_test_context("suuauu");
132-
let expected = "[suuauu";
138+
let expected = "su[uau[u";
133139
assert_eq!(actual, expected);
134140

135141
let actual = create_test_context("suuauuaaau");
136-
let expected = "[s[uuauuaaau";
142+
let expected = "suuau[uaaa[u";
137143
assert_eq!(actual, expected);
138144

139145
let actual = create_test_context("suuauuaaauauau");
140-
let expected = "suua[uuaaa[uauau";
146+
let expected = "suuauuaaaua[ua[u";
147+
assert_eq!(actual, expected);
148+
149+
let actual = create_test_context("suuaaaaaaaaaaa");
150+
let expected = "[su[uaaaaaaaaaaa";
141151
assert_eq!(actual, expected);
142152
}
143153
}

0 commit comments

Comments
 (0)