@@ -8,15 +8,21 @@ pub struct SetCache;
88impl 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