lm_studio_api_extended/chat/
context.rs1use super::{ Role, Message };
3
4#[derive(Debug, Clone)]
6pub struct Context {
7 pub messages: Vec<Message>,
8 pub context_tokens: usize,
9 pub context_limit: usize
10}
11
12impl Default for Context {
13 fn default() -> Self {
14 Context {
15 messages: vec![
16 Message {
17 role: Role::System,
18 content: "You are a helpful, knowledgeable, and friendly assistant.".to_string()
19 }
20 ],
21 context_tokens: 0,
22 context_limit: 4090
23 }
24 }
25}
26
27impl Context {
28 pub fn new<S>(context: S, context_limit: usize) -> Self
30 where
31 S: Into<String>
32 {
33 Self {
34 messages: vec![Message::new(Role::System, context.into())],
35 context_tokens: 0,
36 context_limit
37 }
38 }
39
40 pub fn edit<S>(&mut self, modification: S)
42 where
43 S: Into<String>
44 {
45 let sysprompt_extra = format!("\n\nContext: [\n\t{}]", modification.into());
46 self.messages[0].content.push_str(&sysprompt_extra);
47 }
48
49 pub fn add<M>(&mut self, message: M)
51 where
52 M: Into<Message>
53 {
54 let message = message.into();
55
56 self.context_tokens += message.content.chars().count();
58 self.messages.push(message);
59
60 while self.messages.len() > 2 && self.context_tokens > self.context_limit {
62 self.context_tokens -= self.messages[1].content.chars().count();
63 self.messages.remove(1);
64 }
65 }
66
67 pub fn get(&self) -> Vec<Message> {
69 self.messages.clone()
70 }
71
72 pub fn clear(&mut self) {
74 self.messages.truncate(1);
75 }
76}