pub struct ChatSession {
pub messages: Vec<ChatMessage>,
pub system_prompt: Option<String>,
pub metadata: HashMap<String, String>,
}Expand description
Represents a chat session, including the conversation history and metadata.
Fields§
§messages: Vec<ChatMessage>The messages in the chat session.
system_prompt: Option<String>The system prompt for the chat session.
metadata: HashMap<String, String>Metadata associated with the chat session.
Implementations§
Source§impl ChatSession
impl ChatSession
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new, empty chat session.
Examples found in repository?
88async fn conversation_with_context() -> helios_engine::Result<()> {
89 // Create a configuration for the LLM.
90 let llm_config = LLMConfig {
91 model_name: "gpt-3.5-turbo".to_string(),
92 base_url: "https://api.openai.com/v1".to_string(),
93 api_key: std::env::var("OPENAI_API_KEY")
94 .unwrap_or_else(|_| "your-api-key-here".to_string()),
95 temperature: 0.7,
96 max_tokens: 2048,
97 };
98
99 // Create a new LLM client.
100 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
101
102 // Use a `ChatSession` to manage the conversation history.
103 let mut session = ChatSession::new()
104 .with_system_prompt("You are a helpful math tutor. Give brief, clear explanations.");
105
106 // --- First turn ---
107 println!("Turn 1:");
108 session.add_user_message("What is 15 * 23?");
109 print!(" User: What is 15 * 23?\n ");
110
111 match client
112 .chat(session.get_messages(), None, None, None, None)
113 .await
114 {
115 Ok(response) => {
116 session.add_assistant_message(&response.content);
117 println!("Assistant: {}", response.content);
118 }
119 Err(e) => {
120 println!("Error: {}", e);
121 return Ok(());
122 }
123 }
124
125 // --- Second turn (with context from the first turn) ---
126 println!("\nTurn 2:");
127 session.add_user_message("Now divide that by 5.");
128 print!(" User: Now divide that by 5.\n ");
129
130 match client
131 .chat(session.get_messages(), None, None, None, None)
132 .await
133 {
134 Ok(response) => {
135 session.add_assistant_message(&response.content);
136 println!("Assistant: {}", response.content);
137 }
138 Err(e) => {
139 println!("Error: {}", e);
140 }
141 }
142
143 println!("\n💡 Notice how the assistant remembered the result from the first calculation!");
144
145 Ok(())
146}
147
148/// Provides information about using different LLM providers.
149fn different_providers_info() {
150 println!("You can use Helios with various LLM providers:\n");
151
152 println!("🔵 OpenAI:");
153 println!(" LLMConfig {{");
154 println!(" model_name: \"gpt-4\".to_string(),");
155 println!(" base_url: \"https://api.openai.com/v1\".to_string(),");
156 println!(" api_key: env::var(\"OPENAI_API_KEY\").unwrap(),");
157 println!(" temperature: 0.7,");
158 println!(" max_tokens: 2048,");
159 println!(" }}\n");
160
161 println!("🟢 Local LM Studio:");
162 println!(" LLMConfig {{");
163 println!(" model_name: \"local-model\".to_string(),");
164 println!(" base_url: \"http://localhost:1234/v1\".to_string(),");
165 println!(" api_key: \"not-needed\".to_string(),");
166 println!(" temperature: 0.7,");
167 println!(" max_tokens: 2048,");
168 println!(" }}\n");
169
170 println!("🦙 Ollama:");
171 println!(" LLMConfig {{");
172 println!(" model_name: \"llama2\".to_string(),");
173 println!(" base_url: \"http://localhost:11434/v1\".to_string(),");
174 println!(" api_key: \"not-needed\".to_string(),");
175 println!(" temperature: 0.7,");
176 println!(" max_tokens: 2048,");
177 println!(" }}\n");
178
179 println!("🔷 Azure OpenAI:");
180 println!(" LLMConfig {{");
181 println!(" model_name: \"gpt-35-turbo\".to_string(),");
182 println!(" base_url: \"https://your-resource.openai.azure.com/...\".to_string(),");
183 println!(" api_key: env::var(\"AZURE_OPENAI_KEY\").unwrap(),");
184 println!(" temperature: 0.7,");
185 println!(" max_tokens: 2048,");
186 println!(" }}\n");
187}
188
189/// Starts an interactive chat session with the LLM.
190async fn interactive_chat() -> helios_engine::Result<()> {
191 // Create a configuration for the LLM.
192 let llm_config = LLMConfig {
193 model_name: "gpt-3.5-turbo".to_string(),
194 base_url: "https://api.openai.com/v1".to_string(),
195 api_key: std::env::var("OPENAI_API_KEY")
196 .unwrap_or_else(|_| "your-api-key-here".to_string()),
197 temperature: 0.7,
198 max_tokens: 2048,
199 };
200
201 // Create a new LLM client.
202 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
203 let mut session =
204 ChatSession::new().with_system_prompt("You are a friendly and helpful AI assistant.");
205
206 println!("Chat started! Type 'exit' or 'quit' to end the conversation.\n");
207
208 loop {
209 print!("You: ");
210 io::stdout().flush()?;
211
212 let mut input = String::new();
213 io::stdin().read_line(&mut input)?;
214 let input = input.trim();
215
216 if input.is_empty() {
217 continue;
218 }
219
220 if input == "exit" || input == "quit" {
221 println!("\n👋 Goodbye!");
222 break;
223 }
224
225 // Handle special commands.
226 if input == "clear" {
227 session.clear();
228 println!("🧹 Conversation cleared!\n");
229 continue;
230 }
231
232 if input == "history" {
233 println!("\n📜 Conversation history:");
234 for (i, msg) in session.messages.iter().enumerate() {
235 println!(" {}. {:?}: {}", i + 1, msg.role, msg.content);
236 }
237 println!();
238 continue;
239 }
240
241 session.add_user_message(input);
242
243 print!("Assistant: ");
244 io::stdout().flush()?;
245
246 match client
247 .chat(session.get_messages(), None, None, None, None)
248 .await
249 {
250 Ok(response) => {
251 session.add_assistant_message(&response.content);
252 println!("{}\n", response.content);
253 }
254 Err(e) => {
255 println!("\n❌ Error: {}", e);
256 println!(" (Make sure OPENAI_API_KEY is set correctly)\n");
257 // Remove the last user message since it failed.
258 session.messages.pop();
259 }
260 }
261 }
262
263 Ok(())
264}More examples
14async fn main() -> helios_engine::Result<()> {
15 println!("🚀 Helios Engine - Streaming Example");
16 println!("=====================================\n");
17
18 // Set up the LLM configuration.
19 let llm_config = LLMConfig {
20 model_name: "gpt-3.5-turbo".to_string(),
21 base_url: "https://api.openai.com/v1".to_string(),
22 api_key: std::env::var("OPENAI_API_KEY")
23 .unwrap_or_else(|_| "your-api-key-here".to_string()),
24 temperature: 0.7,
25 max_tokens: 2048,
26 };
27
28 // Create a new LLM client.
29 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
30
31 // --- Example 1: Simple streaming response ---
32 println!("Example 1: Simple Streaming Response");
33 println!("======================================\n");
34
35 let messages = vec![
36 ChatMessage::system("You are a helpful assistant."),
37 ChatMessage::user("Write a short poem about coding."),
38 ];
39
40 print!("Assistant: ");
41 io::stdout().flush()?;
42
43 // Stream the response from the model, printing each chunk as it arrives.
44 let response = client
45 .chat_stream(messages, None, None, None, None, |chunk| {
46 print!("{}", chunk);
47 io::stdout().flush().unwrap();
48 })
49 .await?;
50
51 println!("\n\n");
52
53 // --- Example 2: Interactive streaming chat ---
54 println!("Example 2: Interactive Streaming Chat");
55 println!("======================================\n");
56
57 let mut session = ChatSession::new().with_system_prompt("You are a helpful coding assistant.");
58
59 let questions = vec![
60 "What is Rust?",
61 "What are its main benefits?",
62 "Show me a simple example.",
63 ];
64
65 for question in questions {
66 println!("User: {}", question);
67 session.add_user_message(question);
68
69 print!("Assistant: ");
70 io::stdout().flush()?;
71
72 // Stream the response, maintaining the conversation context.
73 let response = client
74 .chat_stream(session.get_messages(), None, None, None, None, |chunk| {
75 print!("{}", chunk);
76 io::stdout().flush().unwrap();
77 })
78 .await?;
79
80 session.add_assistant_message(&response.content);
81 println!("\n");
82 }
83
84 // --- Example 3: Streaming with thinking tags ---
85 println!("\nExample 3: Streaming with Thinking Tags");
86 println!("=========================================\n");
87 println!("When using models that support thinking tags (like o1),");
88 println!("you can detect and display them during streaming.\n");
89
90 /// A helper struct to track and display thinking tags in streamed responses.
91 struct ThinkingTracker {
92 in_thinking: bool,
93 thinking_buffer: String,
94 }
95
96 impl ThinkingTracker {
97 /// Creates a new `ThinkingTracker`.
98 fn new() -> Self {
99 Self {
100 in_thinking: false,
101 thinking_buffer: String::new(),
102 }
103 }
104
105 /// Processes a chunk of a streamed response and returns the processed output.
106 fn process_chunk(&mut self, chunk: &str) -> String {
107 let mut output = String::new();
108 let mut chars = chunk.chars().peekable();
109
110 while let Some(c) = chars.next() {
111 if c == '<' {
112 let remaining: String = chars.clone().collect();
113 if remaining.starts_with("thinking>") {
114 self.in_thinking = true;
115 self.thinking_buffer.clear();
116 output.push_str("\n💭 [Thinking");
117 for _ in 0..9 {
118 chars.next();
119 }
120 continue;
121 } else if remaining.starts_with("/thinking>") {
122 self.in_thinking = false;
123 output.push_str("]\n");
124 for _ in 0..10 {
125 chars.next();
126 }
127 continue;
128 }
129 }
130
131 if self.in_thinking {
132 self.thinking_buffer.push(c);
133 if self.thinking_buffer.len() % 3 == 0 {
134 output.push('.');
135 }
136 } else {
137 output.push(c);
138 }
139 }
140
141 output
142 }
143 }
144
145 let messages = vec![ChatMessage::user(
146 "Solve this problem: What is 15 * 234 + 89?",
147 )];
148
149 let mut tracker = ThinkingTracker::new();
150 print!("Assistant: ");
151 io::stdout().flush()?;
152
153 // Stream the response, processing thinking tags as they arrive.
154 let _response = client
155 .chat_stream(messages, None, None, None, None, |chunk| {
156 let output = tracker.process_chunk(chunk);
157 print!("{}", output);
158 io::stdout().flush().unwrap();
159 })
160 .await?;
161
162 println!("\n\n Streaming examples completed!");
163 println!("\nKey benefits of streaming:");
164 println!(" • Real-time response display");
165 println!(" • Better user experience for long responses");
166 println!(" • Ability to show thinking/reasoning process");
167 println!(" • Early cancellation possible (future feature)");
168
169 Ok(())
170}Sourcepub fn with_system_prompt(self, prompt: impl Into<String>) -> Self
pub fn with_system_prompt(self, prompt: impl Into<String>) -> Self
Sets the system prompt for the chat session.
Examples found in repository?
88async fn conversation_with_context() -> helios_engine::Result<()> {
89 // Create a configuration for the LLM.
90 let llm_config = LLMConfig {
91 model_name: "gpt-3.5-turbo".to_string(),
92 base_url: "https://api.openai.com/v1".to_string(),
93 api_key: std::env::var("OPENAI_API_KEY")
94 .unwrap_or_else(|_| "your-api-key-here".to_string()),
95 temperature: 0.7,
96 max_tokens: 2048,
97 };
98
99 // Create a new LLM client.
100 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
101
102 // Use a `ChatSession` to manage the conversation history.
103 let mut session = ChatSession::new()
104 .with_system_prompt("You are a helpful math tutor. Give brief, clear explanations.");
105
106 // --- First turn ---
107 println!("Turn 1:");
108 session.add_user_message("What is 15 * 23?");
109 print!(" User: What is 15 * 23?\n ");
110
111 match client
112 .chat(session.get_messages(), None, None, None, None)
113 .await
114 {
115 Ok(response) => {
116 session.add_assistant_message(&response.content);
117 println!("Assistant: {}", response.content);
118 }
119 Err(e) => {
120 println!("Error: {}", e);
121 return Ok(());
122 }
123 }
124
125 // --- Second turn (with context from the first turn) ---
126 println!("\nTurn 2:");
127 session.add_user_message("Now divide that by 5.");
128 print!(" User: Now divide that by 5.\n ");
129
130 match client
131 .chat(session.get_messages(), None, None, None, None)
132 .await
133 {
134 Ok(response) => {
135 session.add_assistant_message(&response.content);
136 println!("Assistant: {}", response.content);
137 }
138 Err(e) => {
139 println!("Error: {}", e);
140 }
141 }
142
143 println!("\n💡 Notice how the assistant remembered the result from the first calculation!");
144
145 Ok(())
146}
147
148/// Provides information about using different LLM providers.
149fn different_providers_info() {
150 println!("You can use Helios with various LLM providers:\n");
151
152 println!("🔵 OpenAI:");
153 println!(" LLMConfig {{");
154 println!(" model_name: \"gpt-4\".to_string(),");
155 println!(" base_url: \"https://api.openai.com/v1\".to_string(),");
156 println!(" api_key: env::var(\"OPENAI_API_KEY\").unwrap(),");
157 println!(" temperature: 0.7,");
158 println!(" max_tokens: 2048,");
159 println!(" }}\n");
160
161 println!("🟢 Local LM Studio:");
162 println!(" LLMConfig {{");
163 println!(" model_name: \"local-model\".to_string(),");
164 println!(" base_url: \"http://localhost:1234/v1\".to_string(),");
165 println!(" api_key: \"not-needed\".to_string(),");
166 println!(" temperature: 0.7,");
167 println!(" max_tokens: 2048,");
168 println!(" }}\n");
169
170 println!("🦙 Ollama:");
171 println!(" LLMConfig {{");
172 println!(" model_name: \"llama2\".to_string(),");
173 println!(" base_url: \"http://localhost:11434/v1\".to_string(),");
174 println!(" api_key: \"not-needed\".to_string(),");
175 println!(" temperature: 0.7,");
176 println!(" max_tokens: 2048,");
177 println!(" }}\n");
178
179 println!("🔷 Azure OpenAI:");
180 println!(" LLMConfig {{");
181 println!(" model_name: \"gpt-35-turbo\".to_string(),");
182 println!(" base_url: \"https://your-resource.openai.azure.com/...\".to_string(),");
183 println!(" api_key: env::var(\"AZURE_OPENAI_KEY\").unwrap(),");
184 println!(" temperature: 0.7,");
185 println!(" max_tokens: 2048,");
186 println!(" }}\n");
187}
188
189/// Starts an interactive chat session with the LLM.
190async fn interactive_chat() -> helios_engine::Result<()> {
191 // Create a configuration for the LLM.
192 let llm_config = LLMConfig {
193 model_name: "gpt-3.5-turbo".to_string(),
194 base_url: "https://api.openai.com/v1".to_string(),
195 api_key: std::env::var("OPENAI_API_KEY")
196 .unwrap_or_else(|_| "your-api-key-here".to_string()),
197 temperature: 0.7,
198 max_tokens: 2048,
199 };
200
201 // Create a new LLM client.
202 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
203 let mut session =
204 ChatSession::new().with_system_prompt("You are a friendly and helpful AI assistant.");
205
206 println!("Chat started! Type 'exit' or 'quit' to end the conversation.\n");
207
208 loop {
209 print!("You: ");
210 io::stdout().flush()?;
211
212 let mut input = String::new();
213 io::stdin().read_line(&mut input)?;
214 let input = input.trim();
215
216 if input.is_empty() {
217 continue;
218 }
219
220 if input == "exit" || input == "quit" {
221 println!("\n👋 Goodbye!");
222 break;
223 }
224
225 // Handle special commands.
226 if input == "clear" {
227 session.clear();
228 println!("🧹 Conversation cleared!\n");
229 continue;
230 }
231
232 if input == "history" {
233 println!("\n📜 Conversation history:");
234 for (i, msg) in session.messages.iter().enumerate() {
235 println!(" {}. {:?}: {}", i + 1, msg.role, msg.content);
236 }
237 println!();
238 continue;
239 }
240
241 session.add_user_message(input);
242
243 print!("Assistant: ");
244 io::stdout().flush()?;
245
246 match client
247 .chat(session.get_messages(), None, None, None, None)
248 .await
249 {
250 Ok(response) => {
251 session.add_assistant_message(&response.content);
252 println!("{}\n", response.content);
253 }
254 Err(e) => {
255 println!("\n❌ Error: {}", e);
256 println!(" (Make sure OPENAI_API_KEY is set correctly)\n");
257 // Remove the last user message since it failed.
258 session.messages.pop();
259 }
260 }
261 }
262
263 Ok(())
264}More examples
14async fn main() -> helios_engine::Result<()> {
15 println!("🚀 Helios Engine - Streaming Example");
16 println!("=====================================\n");
17
18 // Set up the LLM configuration.
19 let llm_config = LLMConfig {
20 model_name: "gpt-3.5-turbo".to_string(),
21 base_url: "https://api.openai.com/v1".to_string(),
22 api_key: std::env::var("OPENAI_API_KEY")
23 .unwrap_or_else(|_| "your-api-key-here".to_string()),
24 temperature: 0.7,
25 max_tokens: 2048,
26 };
27
28 // Create a new LLM client.
29 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
30
31 // --- Example 1: Simple streaming response ---
32 println!("Example 1: Simple Streaming Response");
33 println!("======================================\n");
34
35 let messages = vec![
36 ChatMessage::system("You are a helpful assistant."),
37 ChatMessage::user("Write a short poem about coding."),
38 ];
39
40 print!("Assistant: ");
41 io::stdout().flush()?;
42
43 // Stream the response from the model, printing each chunk as it arrives.
44 let response = client
45 .chat_stream(messages, None, None, None, None, |chunk| {
46 print!("{}", chunk);
47 io::stdout().flush().unwrap();
48 })
49 .await?;
50
51 println!("\n\n");
52
53 // --- Example 2: Interactive streaming chat ---
54 println!("Example 2: Interactive Streaming Chat");
55 println!("======================================\n");
56
57 let mut session = ChatSession::new().with_system_prompt("You are a helpful coding assistant.");
58
59 let questions = vec![
60 "What is Rust?",
61 "What are its main benefits?",
62 "Show me a simple example.",
63 ];
64
65 for question in questions {
66 println!("User: {}", question);
67 session.add_user_message(question);
68
69 print!("Assistant: ");
70 io::stdout().flush()?;
71
72 // Stream the response, maintaining the conversation context.
73 let response = client
74 .chat_stream(session.get_messages(), None, None, None, None, |chunk| {
75 print!("{}", chunk);
76 io::stdout().flush().unwrap();
77 })
78 .await?;
79
80 session.add_assistant_message(&response.content);
81 println!("\n");
82 }
83
84 // --- Example 3: Streaming with thinking tags ---
85 println!("\nExample 3: Streaming with Thinking Tags");
86 println!("=========================================\n");
87 println!("When using models that support thinking tags (like o1),");
88 println!("you can detect and display them during streaming.\n");
89
90 /// A helper struct to track and display thinking tags in streamed responses.
91 struct ThinkingTracker {
92 in_thinking: bool,
93 thinking_buffer: String,
94 }
95
96 impl ThinkingTracker {
97 /// Creates a new `ThinkingTracker`.
98 fn new() -> Self {
99 Self {
100 in_thinking: false,
101 thinking_buffer: String::new(),
102 }
103 }
104
105 /// Processes a chunk of a streamed response and returns the processed output.
106 fn process_chunk(&mut self, chunk: &str) -> String {
107 let mut output = String::new();
108 let mut chars = chunk.chars().peekable();
109
110 while let Some(c) = chars.next() {
111 if c == '<' {
112 let remaining: String = chars.clone().collect();
113 if remaining.starts_with("thinking>") {
114 self.in_thinking = true;
115 self.thinking_buffer.clear();
116 output.push_str("\n💭 [Thinking");
117 for _ in 0..9 {
118 chars.next();
119 }
120 continue;
121 } else if remaining.starts_with("/thinking>") {
122 self.in_thinking = false;
123 output.push_str("]\n");
124 for _ in 0..10 {
125 chars.next();
126 }
127 continue;
128 }
129 }
130
131 if self.in_thinking {
132 self.thinking_buffer.push(c);
133 if self.thinking_buffer.len() % 3 == 0 {
134 output.push('.');
135 }
136 } else {
137 output.push(c);
138 }
139 }
140
141 output
142 }
143 }
144
145 let messages = vec![ChatMessage::user(
146 "Solve this problem: What is 15 * 234 + 89?",
147 )];
148
149 let mut tracker = ThinkingTracker::new();
150 print!("Assistant: ");
151 io::stdout().flush()?;
152
153 // Stream the response, processing thinking tags as they arrive.
154 let _response = client
155 .chat_stream(messages, None, None, None, None, |chunk| {
156 let output = tracker.process_chunk(chunk);
157 print!("{}", output);
158 io::stdout().flush().unwrap();
159 })
160 .await?;
161
162 println!("\n\n Streaming examples completed!");
163 println!("\nKey benefits of streaming:");
164 println!(" • Real-time response display");
165 println!(" • Better user experience for long responses");
166 println!(" • Ability to show thinking/reasoning process");
167 println!(" • Early cancellation possible (future feature)");
168
169 Ok(())
170}Sourcepub fn add_message(&mut self, message: ChatMessage)
pub fn add_message(&mut self, message: ChatMessage)
Adds a message to the chat session.
Sourcepub fn add_user_message(&mut self, content: impl Into<String>)
pub fn add_user_message(&mut self, content: impl Into<String>)
Adds a user message to the chat session.
Examples found in repository?
88async fn conversation_with_context() -> helios_engine::Result<()> {
89 // Create a configuration for the LLM.
90 let llm_config = LLMConfig {
91 model_name: "gpt-3.5-turbo".to_string(),
92 base_url: "https://api.openai.com/v1".to_string(),
93 api_key: std::env::var("OPENAI_API_KEY")
94 .unwrap_or_else(|_| "your-api-key-here".to_string()),
95 temperature: 0.7,
96 max_tokens: 2048,
97 };
98
99 // Create a new LLM client.
100 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
101
102 // Use a `ChatSession` to manage the conversation history.
103 let mut session = ChatSession::new()
104 .with_system_prompt("You are a helpful math tutor. Give brief, clear explanations.");
105
106 // --- First turn ---
107 println!("Turn 1:");
108 session.add_user_message("What is 15 * 23?");
109 print!(" User: What is 15 * 23?\n ");
110
111 match client
112 .chat(session.get_messages(), None, None, None, None)
113 .await
114 {
115 Ok(response) => {
116 session.add_assistant_message(&response.content);
117 println!("Assistant: {}", response.content);
118 }
119 Err(e) => {
120 println!("Error: {}", e);
121 return Ok(());
122 }
123 }
124
125 // --- Second turn (with context from the first turn) ---
126 println!("\nTurn 2:");
127 session.add_user_message("Now divide that by 5.");
128 print!(" User: Now divide that by 5.\n ");
129
130 match client
131 .chat(session.get_messages(), None, None, None, None)
132 .await
133 {
134 Ok(response) => {
135 session.add_assistant_message(&response.content);
136 println!("Assistant: {}", response.content);
137 }
138 Err(e) => {
139 println!("Error: {}", e);
140 }
141 }
142
143 println!("\n💡 Notice how the assistant remembered the result from the first calculation!");
144
145 Ok(())
146}
147
148/// Provides information about using different LLM providers.
149fn different_providers_info() {
150 println!("You can use Helios with various LLM providers:\n");
151
152 println!("🔵 OpenAI:");
153 println!(" LLMConfig {{");
154 println!(" model_name: \"gpt-4\".to_string(),");
155 println!(" base_url: \"https://api.openai.com/v1\".to_string(),");
156 println!(" api_key: env::var(\"OPENAI_API_KEY\").unwrap(),");
157 println!(" temperature: 0.7,");
158 println!(" max_tokens: 2048,");
159 println!(" }}\n");
160
161 println!("🟢 Local LM Studio:");
162 println!(" LLMConfig {{");
163 println!(" model_name: \"local-model\".to_string(),");
164 println!(" base_url: \"http://localhost:1234/v1\".to_string(),");
165 println!(" api_key: \"not-needed\".to_string(),");
166 println!(" temperature: 0.7,");
167 println!(" max_tokens: 2048,");
168 println!(" }}\n");
169
170 println!("🦙 Ollama:");
171 println!(" LLMConfig {{");
172 println!(" model_name: \"llama2\".to_string(),");
173 println!(" base_url: \"http://localhost:11434/v1\".to_string(),");
174 println!(" api_key: \"not-needed\".to_string(),");
175 println!(" temperature: 0.7,");
176 println!(" max_tokens: 2048,");
177 println!(" }}\n");
178
179 println!("🔷 Azure OpenAI:");
180 println!(" LLMConfig {{");
181 println!(" model_name: \"gpt-35-turbo\".to_string(),");
182 println!(" base_url: \"https://your-resource.openai.azure.com/...\".to_string(),");
183 println!(" api_key: env::var(\"AZURE_OPENAI_KEY\").unwrap(),");
184 println!(" temperature: 0.7,");
185 println!(" max_tokens: 2048,");
186 println!(" }}\n");
187}
188
189/// Starts an interactive chat session with the LLM.
190async fn interactive_chat() -> helios_engine::Result<()> {
191 // Create a configuration for the LLM.
192 let llm_config = LLMConfig {
193 model_name: "gpt-3.5-turbo".to_string(),
194 base_url: "https://api.openai.com/v1".to_string(),
195 api_key: std::env::var("OPENAI_API_KEY")
196 .unwrap_or_else(|_| "your-api-key-here".to_string()),
197 temperature: 0.7,
198 max_tokens: 2048,
199 };
200
201 // Create a new LLM client.
202 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
203 let mut session =
204 ChatSession::new().with_system_prompt("You are a friendly and helpful AI assistant.");
205
206 println!("Chat started! Type 'exit' or 'quit' to end the conversation.\n");
207
208 loop {
209 print!("You: ");
210 io::stdout().flush()?;
211
212 let mut input = String::new();
213 io::stdin().read_line(&mut input)?;
214 let input = input.trim();
215
216 if input.is_empty() {
217 continue;
218 }
219
220 if input == "exit" || input == "quit" {
221 println!("\n👋 Goodbye!");
222 break;
223 }
224
225 // Handle special commands.
226 if input == "clear" {
227 session.clear();
228 println!("🧹 Conversation cleared!\n");
229 continue;
230 }
231
232 if input == "history" {
233 println!("\n📜 Conversation history:");
234 for (i, msg) in session.messages.iter().enumerate() {
235 println!(" {}. {:?}: {}", i + 1, msg.role, msg.content);
236 }
237 println!();
238 continue;
239 }
240
241 session.add_user_message(input);
242
243 print!("Assistant: ");
244 io::stdout().flush()?;
245
246 match client
247 .chat(session.get_messages(), None, None, None, None)
248 .await
249 {
250 Ok(response) => {
251 session.add_assistant_message(&response.content);
252 println!("{}\n", response.content);
253 }
254 Err(e) => {
255 println!("\n❌ Error: {}", e);
256 println!(" (Make sure OPENAI_API_KEY is set correctly)\n");
257 // Remove the last user message since it failed.
258 session.messages.pop();
259 }
260 }
261 }
262
263 Ok(())
264}More examples
14async fn main() -> helios_engine::Result<()> {
15 println!("🚀 Helios Engine - Streaming Example");
16 println!("=====================================\n");
17
18 // Set up the LLM configuration.
19 let llm_config = LLMConfig {
20 model_name: "gpt-3.5-turbo".to_string(),
21 base_url: "https://api.openai.com/v1".to_string(),
22 api_key: std::env::var("OPENAI_API_KEY")
23 .unwrap_or_else(|_| "your-api-key-here".to_string()),
24 temperature: 0.7,
25 max_tokens: 2048,
26 };
27
28 // Create a new LLM client.
29 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
30
31 // --- Example 1: Simple streaming response ---
32 println!("Example 1: Simple Streaming Response");
33 println!("======================================\n");
34
35 let messages = vec![
36 ChatMessage::system("You are a helpful assistant."),
37 ChatMessage::user("Write a short poem about coding."),
38 ];
39
40 print!("Assistant: ");
41 io::stdout().flush()?;
42
43 // Stream the response from the model, printing each chunk as it arrives.
44 let response = client
45 .chat_stream(messages, None, None, None, None, |chunk| {
46 print!("{}", chunk);
47 io::stdout().flush().unwrap();
48 })
49 .await?;
50
51 println!("\n\n");
52
53 // --- Example 2: Interactive streaming chat ---
54 println!("Example 2: Interactive Streaming Chat");
55 println!("======================================\n");
56
57 let mut session = ChatSession::new().with_system_prompt("You are a helpful coding assistant.");
58
59 let questions = vec![
60 "What is Rust?",
61 "What are its main benefits?",
62 "Show me a simple example.",
63 ];
64
65 for question in questions {
66 println!("User: {}", question);
67 session.add_user_message(question);
68
69 print!("Assistant: ");
70 io::stdout().flush()?;
71
72 // Stream the response, maintaining the conversation context.
73 let response = client
74 .chat_stream(session.get_messages(), None, None, None, None, |chunk| {
75 print!("{}", chunk);
76 io::stdout().flush().unwrap();
77 })
78 .await?;
79
80 session.add_assistant_message(&response.content);
81 println!("\n");
82 }
83
84 // --- Example 3: Streaming with thinking tags ---
85 println!("\nExample 3: Streaming with Thinking Tags");
86 println!("=========================================\n");
87 println!("When using models that support thinking tags (like o1),");
88 println!("you can detect and display them during streaming.\n");
89
90 /// A helper struct to track and display thinking tags in streamed responses.
91 struct ThinkingTracker {
92 in_thinking: bool,
93 thinking_buffer: String,
94 }
95
96 impl ThinkingTracker {
97 /// Creates a new `ThinkingTracker`.
98 fn new() -> Self {
99 Self {
100 in_thinking: false,
101 thinking_buffer: String::new(),
102 }
103 }
104
105 /// Processes a chunk of a streamed response and returns the processed output.
106 fn process_chunk(&mut self, chunk: &str) -> String {
107 let mut output = String::new();
108 let mut chars = chunk.chars().peekable();
109
110 while let Some(c) = chars.next() {
111 if c == '<' {
112 let remaining: String = chars.clone().collect();
113 if remaining.starts_with("thinking>") {
114 self.in_thinking = true;
115 self.thinking_buffer.clear();
116 output.push_str("\n💭 [Thinking");
117 for _ in 0..9 {
118 chars.next();
119 }
120 continue;
121 } else if remaining.starts_with("/thinking>") {
122 self.in_thinking = false;
123 output.push_str("]\n");
124 for _ in 0..10 {
125 chars.next();
126 }
127 continue;
128 }
129 }
130
131 if self.in_thinking {
132 self.thinking_buffer.push(c);
133 if self.thinking_buffer.len() % 3 == 0 {
134 output.push('.');
135 }
136 } else {
137 output.push(c);
138 }
139 }
140
141 output
142 }
143 }
144
145 let messages = vec![ChatMessage::user(
146 "Solve this problem: What is 15 * 234 + 89?",
147 )];
148
149 let mut tracker = ThinkingTracker::new();
150 print!("Assistant: ");
151 io::stdout().flush()?;
152
153 // Stream the response, processing thinking tags as they arrive.
154 let _response = client
155 .chat_stream(messages, None, None, None, None, |chunk| {
156 let output = tracker.process_chunk(chunk);
157 print!("{}", output);
158 io::stdout().flush().unwrap();
159 })
160 .await?;
161
162 println!("\n\n Streaming examples completed!");
163 println!("\nKey benefits of streaming:");
164 println!(" • Real-time response display");
165 println!(" • Better user experience for long responses");
166 println!(" • Ability to show thinking/reasoning process");
167 println!(" • Early cancellation possible (future feature)");
168
169 Ok(())
170}Sourcepub fn add_assistant_message(&mut self, content: impl Into<String>)
pub fn add_assistant_message(&mut self, content: impl Into<String>)
Adds an assistant message to the chat session.
Examples found in repository?
88async fn conversation_with_context() -> helios_engine::Result<()> {
89 // Create a configuration for the LLM.
90 let llm_config = LLMConfig {
91 model_name: "gpt-3.5-turbo".to_string(),
92 base_url: "https://api.openai.com/v1".to_string(),
93 api_key: std::env::var("OPENAI_API_KEY")
94 .unwrap_or_else(|_| "your-api-key-here".to_string()),
95 temperature: 0.7,
96 max_tokens: 2048,
97 };
98
99 // Create a new LLM client.
100 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
101
102 // Use a `ChatSession` to manage the conversation history.
103 let mut session = ChatSession::new()
104 .with_system_prompt("You are a helpful math tutor. Give brief, clear explanations.");
105
106 // --- First turn ---
107 println!("Turn 1:");
108 session.add_user_message("What is 15 * 23?");
109 print!(" User: What is 15 * 23?\n ");
110
111 match client
112 .chat(session.get_messages(), None, None, None, None)
113 .await
114 {
115 Ok(response) => {
116 session.add_assistant_message(&response.content);
117 println!("Assistant: {}", response.content);
118 }
119 Err(e) => {
120 println!("Error: {}", e);
121 return Ok(());
122 }
123 }
124
125 // --- Second turn (with context from the first turn) ---
126 println!("\nTurn 2:");
127 session.add_user_message("Now divide that by 5.");
128 print!(" User: Now divide that by 5.\n ");
129
130 match client
131 .chat(session.get_messages(), None, None, None, None)
132 .await
133 {
134 Ok(response) => {
135 session.add_assistant_message(&response.content);
136 println!("Assistant: {}", response.content);
137 }
138 Err(e) => {
139 println!("Error: {}", e);
140 }
141 }
142
143 println!("\n💡 Notice how the assistant remembered the result from the first calculation!");
144
145 Ok(())
146}
147
148/// Provides information about using different LLM providers.
149fn different_providers_info() {
150 println!("You can use Helios with various LLM providers:\n");
151
152 println!("🔵 OpenAI:");
153 println!(" LLMConfig {{");
154 println!(" model_name: \"gpt-4\".to_string(),");
155 println!(" base_url: \"https://api.openai.com/v1\".to_string(),");
156 println!(" api_key: env::var(\"OPENAI_API_KEY\").unwrap(),");
157 println!(" temperature: 0.7,");
158 println!(" max_tokens: 2048,");
159 println!(" }}\n");
160
161 println!("🟢 Local LM Studio:");
162 println!(" LLMConfig {{");
163 println!(" model_name: \"local-model\".to_string(),");
164 println!(" base_url: \"http://localhost:1234/v1\".to_string(),");
165 println!(" api_key: \"not-needed\".to_string(),");
166 println!(" temperature: 0.7,");
167 println!(" max_tokens: 2048,");
168 println!(" }}\n");
169
170 println!("🦙 Ollama:");
171 println!(" LLMConfig {{");
172 println!(" model_name: \"llama2\".to_string(),");
173 println!(" base_url: \"http://localhost:11434/v1\".to_string(),");
174 println!(" api_key: \"not-needed\".to_string(),");
175 println!(" temperature: 0.7,");
176 println!(" max_tokens: 2048,");
177 println!(" }}\n");
178
179 println!("🔷 Azure OpenAI:");
180 println!(" LLMConfig {{");
181 println!(" model_name: \"gpt-35-turbo\".to_string(),");
182 println!(" base_url: \"https://your-resource.openai.azure.com/...\".to_string(),");
183 println!(" api_key: env::var(\"AZURE_OPENAI_KEY\").unwrap(),");
184 println!(" temperature: 0.7,");
185 println!(" max_tokens: 2048,");
186 println!(" }}\n");
187}
188
189/// Starts an interactive chat session with the LLM.
190async fn interactive_chat() -> helios_engine::Result<()> {
191 // Create a configuration for the LLM.
192 let llm_config = LLMConfig {
193 model_name: "gpt-3.5-turbo".to_string(),
194 base_url: "https://api.openai.com/v1".to_string(),
195 api_key: std::env::var("OPENAI_API_KEY")
196 .unwrap_or_else(|_| "your-api-key-here".to_string()),
197 temperature: 0.7,
198 max_tokens: 2048,
199 };
200
201 // Create a new LLM client.
202 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
203 let mut session =
204 ChatSession::new().with_system_prompt("You are a friendly and helpful AI assistant.");
205
206 println!("Chat started! Type 'exit' or 'quit' to end the conversation.\n");
207
208 loop {
209 print!("You: ");
210 io::stdout().flush()?;
211
212 let mut input = String::new();
213 io::stdin().read_line(&mut input)?;
214 let input = input.trim();
215
216 if input.is_empty() {
217 continue;
218 }
219
220 if input == "exit" || input == "quit" {
221 println!("\n👋 Goodbye!");
222 break;
223 }
224
225 // Handle special commands.
226 if input == "clear" {
227 session.clear();
228 println!("🧹 Conversation cleared!\n");
229 continue;
230 }
231
232 if input == "history" {
233 println!("\n📜 Conversation history:");
234 for (i, msg) in session.messages.iter().enumerate() {
235 println!(" {}. {:?}: {}", i + 1, msg.role, msg.content);
236 }
237 println!();
238 continue;
239 }
240
241 session.add_user_message(input);
242
243 print!("Assistant: ");
244 io::stdout().flush()?;
245
246 match client
247 .chat(session.get_messages(), None, None, None, None)
248 .await
249 {
250 Ok(response) => {
251 session.add_assistant_message(&response.content);
252 println!("{}\n", response.content);
253 }
254 Err(e) => {
255 println!("\n❌ Error: {}", e);
256 println!(" (Make sure OPENAI_API_KEY is set correctly)\n");
257 // Remove the last user message since it failed.
258 session.messages.pop();
259 }
260 }
261 }
262
263 Ok(())
264}More examples
14async fn main() -> helios_engine::Result<()> {
15 println!("🚀 Helios Engine - Streaming Example");
16 println!("=====================================\n");
17
18 // Set up the LLM configuration.
19 let llm_config = LLMConfig {
20 model_name: "gpt-3.5-turbo".to_string(),
21 base_url: "https://api.openai.com/v1".to_string(),
22 api_key: std::env::var("OPENAI_API_KEY")
23 .unwrap_or_else(|_| "your-api-key-here".to_string()),
24 temperature: 0.7,
25 max_tokens: 2048,
26 };
27
28 // Create a new LLM client.
29 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
30
31 // --- Example 1: Simple streaming response ---
32 println!("Example 1: Simple Streaming Response");
33 println!("======================================\n");
34
35 let messages = vec![
36 ChatMessage::system("You are a helpful assistant."),
37 ChatMessage::user("Write a short poem about coding."),
38 ];
39
40 print!("Assistant: ");
41 io::stdout().flush()?;
42
43 // Stream the response from the model, printing each chunk as it arrives.
44 let response = client
45 .chat_stream(messages, None, None, None, None, |chunk| {
46 print!("{}", chunk);
47 io::stdout().flush().unwrap();
48 })
49 .await?;
50
51 println!("\n\n");
52
53 // --- Example 2: Interactive streaming chat ---
54 println!("Example 2: Interactive Streaming Chat");
55 println!("======================================\n");
56
57 let mut session = ChatSession::new().with_system_prompt("You are a helpful coding assistant.");
58
59 let questions = vec![
60 "What is Rust?",
61 "What are its main benefits?",
62 "Show me a simple example.",
63 ];
64
65 for question in questions {
66 println!("User: {}", question);
67 session.add_user_message(question);
68
69 print!("Assistant: ");
70 io::stdout().flush()?;
71
72 // Stream the response, maintaining the conversation context.
73 let response = client
74 .chat_stream(session.get_messages(), None, None, None, None, |chunk| {
75 print!("{}", chunk);
76 io::stdout().flush().unwrap();
77 })
78 .await?;
79
80 session.add_assistant_message(&response.content);
81 println!("\n");
82 }
83
84 // --- Example 3: Streaming with thinking tags ---
85 println!("\nExample 3: Streaming with Thinking Tags");
86 println!("=========================================\n");
87 println!("When using models that support thinking tags (like o1),");
88 println!("you can detect and display them during streaming.\n");
89
90 /// A helper struct to track and display thinking tags in streamed responses.
91 struct ThinkingTracker {
92 in_thinking: bool,
93 thinking_buffer: String,
94 }
95
96 impl ThinkingTracker {
97 /// Creates a new `ThinkingTracker`.
98 fn new() -> Self {
99 Self {
100 in_thinking: false,
101 thinking_buffer: String::new(),
102 }
103 }
104
105 /// Processes a chunk of a streamed response and returns the processed output.
106 fn process_chunk(&mut self, chunk: &str) -> String {
107 let mut output = String::new();
108 let mut chars = chunk.chars().peekable();
109
110 while let Some(c) = chars.next() {
111 if c == '<' {
112 let remaining: String = chars.clone().collect();
113 if remaining.starts_with("thinking>") {
114 self.in_thinking = true;
115 self.thinking_buffer.clear();
116 output.push_str("\n💭 [Thinking");
117 for _ in 0..9 {
118 chars.next();
119 }
120 continue;
121 } else if remaining.starts_with("/thinking>") {
122 self.in_thinking = false;
123 output.push_str("]\n");
124 for _ in 0..10 {
125 chars.next();
126 }
127 continue;
128 }
129 }
130
131 if self.in_thinking {
132 self.thinking_buffer.push(c);
133 if self.thinking_buffer.len() % 3 == 0 {
134 output.push('.');
135 }
136 } else {
137 output.push(c);
138 }
139 }
140
141 output
142 }
143 }
144
145 let messages = vec![ChatMessage::user(
146 "Solve this problem: What is 15 * 234 + 89?",
147 )];
148
149 let mut tracker = ThinkingTracker::new();
150 print!("Assistant: ");
151 io::stdout().flush()?;
152
153 // Stream the response, processing thinking tags as they arrive.
154 let _response = client
155 .chat_stream(messages, None, None, None, None, |chunk| {
156 let output = tracker.process_chunk(chunk);
157 print!("{}", output);
158 io::stdout().flush().unwrap();
159 })
160 .await?;
161
162 println!("\n\n Streaming examples completed!");
163 println!("\nKey benefits of streaming:");
164 println!(" • Real-time response display");
165 println!(" • Better user experience for long responses");
166 println!(" • Ability to show thinking/reasoning process");
167 println!(" • Early cancellation possible (future feature)");
168
169 Ok(())
170}Sourcepub fn add_msg(&mut self, content: impl Into<String>)
pub fn add_msg(&mut self, content: impl Into<String>)
Shorthand for adding a user message (alias for add_user_message)
Sourcepub fn add_reply(&mut self, content: impl Into<String>)
pub fn add_reply(&mut self, content: impl Into<String>)
Shorthand for adding an assistant message (alias for add_assistant_message)
Sourcepub fn get_messages(&self) -> Vec<ChatMessage>
pub fn get_messages(&self) -> Vec<ChatMessage>
Returns all messages in the chat session, including the system prompt.
Examples found in repository?
88async fn conversation_with_context() -> helios_engine::Result<()> {
89 // Create a configuration for the LLM.
90 let llm_config = LLMConfig {
91 model_name: "gpt-3.5-turbo".to_string(),
92 base_url: "https://api.openai.com/v1".to_string(),
93 api_key: std::env::var("OPENAI_API_KEY")
94 .unwrap_or_else(|_| "your-api-key-here".to_string()),
95 temperature: 0.7,
96 max_tokens: 2048,
97 };
98
99 // Create a new LLM client.
100 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
101
102 // Use a `ChatSession` to manage the conversation history.
103 let mut session = ChatSession::new()
104 .with_system_prompt("You are a helpful math tutor. Give brief, clear explanations.");
105
106 // --- First turn ---
107 println!("Turn 1:");
108 session.add_user_message("What is 15 * 23?");
109 print!(" User: What is 15 * 23?\n ");
110
111 match client
112 .chat(session.get_messages(), None, None, None, None)
113 .await
114 {
115 Ok(response) => {
116 session.add_assistant_message(&response.content);
117 println!("Assistant: {}", response.content);
118 }
119 Err(e) => {
120 println!("Error: {}", e);
121 return Ok(());
122 }
123 }
124
125 // --- Second turn (with context from the first turn) ---
126 println!("\nTurn 2:");
127 session.add_user_message("Now divide that by 5.");
128 print!(" User: Now divide that by 5.\n ");
129
130 match client
131 .chat(session.get_messages(), None, None, None, None)
132 .await
133 {
134 Ok(response) => {
135 session.add_assistant_message(&response.content);
136 println!("Assistant: {}", response.content);
137 }
138 Err(e) => {
139 println!("Error: {}", e);
140 }
141 }
142
143 println!("\n💡 Notice how the assistant remembered the result from the first calculation!");
144
145 Ok(())
146}
147
148/// Provides information about using different LLM providers.
149fn different_providers_info() {
150 println!("You can use Helios with various LLM providers:\n");
151
152 println!("🔵 OpenAI:");
153 println!(" LLMConfig {{");
154 println!(" model_name: \"gpt-4\".to_string(),");
155 println!(" base_url: \"https://api.openai.com/v1\".to_string(),");
156 println!(" api_key: env::var(\"OPENAI_API_KEY\").unwrap(),");
157 println!(" temperature: 0.7,");
158 println!(" max_tokens: 2048,");
159 println!(" }}\n");
160
161 println!("🟢 Local LM Studio:");
162 println!(" LLMConfig {{");
163 println!(" model_name: \"local-model\".to_string(),");
164 println!(" base_url: \"http://localhost:1234/v1\".to_string(),");
165 println!(" api_key: \"not-needed\".to_string(),");
166 println!(" temperature: 0.7,");
167 println!(" max_tokens: 2048,");
168 println!(" }}\n");
169
170 println!("🦙 Ollama:");
171 println!(" LLMConfig {{");
172 println!(" model_name: \"llama2\".to_string(),");
173 println!(" base_url: \"http://localhost:11434/v1\".to_string(),");
174 println!(" api_key: \"not-needed\".to_string(),");
175 println!(" temperature: 0.7,");
176 println!(" max_tokens: 2048,");
177 println!(" }}\n");
178
179 println!("🔷 Azure OpenAI:");
180 println!(" LLMConfig {{");
181 println!(" model_name: \"gpt-35-turbo\".to_string(),");
182 println!(" base_url: \"https://your-resource.openai.azure.com/...\".to_string(),");
183 println!(" api_key: env::var(\"AZURE_OPENAI_KEY\").unwrap(),");
184 println!(" temperature: 0.7,");
185 println!(" max_tokens: 2048,");
186 println!(" }}\n");
187}
188
189/// Starts an interactive chat session with the LLM.
190async fn interactive_chat() -> helios_engine::Result<()> {
191 // Create a configuration for the LLM.
192 let llm_config = LLMConfig {
193 model_name: "gpt-3.5-turbo".to_string(),
194 base_url: "https://api.openai.com/v1".to_string(),
195 api_key: std::env::var("OPENAI_API_KEY")
196 .unwrap_or_else(|_| "your-api-key-here".to_string()),
197 temperature: 0.7,
198 max_tokens: 2048,
199 };
200
201 // Create a new LLM client.
202 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
203 let mut session =
204 ChatSession::new().with_system_prompt("You are a friendly and helpful AI assistant.");
205
206 println!("Chat started! Type 'exit' or 'quit' to end the conversation.\n");
207
208 loop {
209 print!("You: ");
210 io::stdout().flush()?;
211
212 let mut input = String::new();
213 io::stdin().read_line(&mut input)?;
214 let input = input.trim();
215
216 if input.is_empty() {
217 continue;
218 }
219
220 if input == "exit" || input == "quit" {
221 println!("\n👋 Goodbye!");
222 break;
223 }
224
225 // Handle special commands.
226 if input == "clear" {
227 session.clear();
228 println!("🧹 Conversation cleared!\n");
229 continue;
230 }
231
232 if input == "history" {
233 println!("\n📜 Conversation history:");
234 for (i, msg) in session.messages.iter().enumerate() {
235 println!(" {}. {:?}: {}", i + 1, msg.role, msg.content);
236 }
237 println!();
238 continue;
239 }
240
241 session.add_user_message(input);
242
243 print!("Assistant: ");
244 io::stdout().flush()?;
245
246 match client
247 .chat(session.get_messages(), None, None, None, None)
248 .await
249 {
250 Ok(response) => {
251 session.add_assistant_message(&response.content);
252 println!("{}\n", response.content);
253 }
254 Err(e) => {
255 println!("\n❌ Error: {}", e);
256 println!(" (Make sure OPENAI_API_KEY is set correctly)\n");
257 // Remove the last user message since it failed.
258 session.messages.pop();
259 }
260 }
261 }
262
263 Ok(())
264}More examples
14async fn main() -> helios_engine::Result<()> {
15 println!("🚀 Helios Engine - Streaming Example");
16 println!("=====================================\n");
17
18 // Set up the LLM configuration.
19 let llm_config = LLMConfig {
20 model_name: "gpt-3.5-turbo".to_string(),
21 base_url: "https://api.openai.com/v1".to_string(),
22 api_key: std::env::var("OPENAI_API_KEY")
23 .unwrap_or_else(|_| "your-api-key-here".to_string()),
24 temperature: 0.7,
25 max_tokens: 2048,
26 };
27
28 // Create a new LLM client.
29 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
30
31 // --- Example 1: Simple streaming response ---
32 println!("Example 1: Simple Streaming Response");
33 println!("======================================\n");
34
35 let messages = vec![
36 ChatMessage::system("You are a helpful assistant."),
37 ChatMessage::user("Write a short poem about coding."),
38 ];
39
40 print!("Assistant: ");
41 io::stdout().flush()?;
42
43 // Stream the response from the model, printing each chunk as it arrives.
44 let response = client
45 .chat_stream(messages, None, None, None, None, |chunk| {
46 print!("{}", chunk);
47 io::stdout().flush().unwrap();
48 })
49 .await?;
50
51 println!("\n\n");
52
53 // --- Example 2: Interactive streaming chat ---
54 println!("Example 2: Interactive Streaming Chat");
55 println!("======================================\n");
56
57 let mut session = ChatSession::new().with_system_prompt("You are a helpful coding assistant.");
58
59 let questions = vec![
60 "What is Rust?",
61 "What are its main benefits?",
62 "Show me a simple example.",
63 ];
64
65 for question in questions {
66 println!("User: {}", question);
67 session.add_user_message(question);
68
69 print!("Assistant: ");
70 io::stdout().flush()?;
71
72 // Stream the response, maintaining the conversation context.
73 let response = client
74 .chat_stream(session.get_messages(), None, None, None, None, |chunk| {
75 print!("{}", chunk);
76 io::stdout().flush().unwrap();
77 })
78 .await?;
79
80 session.add_assistant_message(&response.content);
81 println!("\n");
82 }
83
84 // --- Example 3: Streaming with thinking tags ---
85 println!("\nExample 3: Streaming with Thinking Tags");
86 println!("=========================================\n");
87 println!("When using models that support thinking tags (like o1),");
88 println!("you can detect and display them during streaming.\n");
89
90 /// A helper struct to track and display thinking tags in streamed responses.
91 struct ThinkingTracker {
92 in_thinking: bool,
93 thinking_buffer: String,
94 }
95
96 impl ThinkingTracker {
97 /// Creates a new `ThinkingTracker`.
98 fn new() -> Self {
99 Self {
100 in_thinking: false,
101 thinking_buffer: String::new(),
102 }
103 }
104
105 /// Processes a chunk of a streamed response and returns the processed output.
106 fn process_chunk(&mut self, chunk: &str) -> String {
107 let mut output = String::new();
108 let mut chars = chunk.chars().peekable();
109
110 while let Some(c) = chars.next() {
111 if c == '<' {
112 let remaining: String = chars.clone().collect();
113 if remaining.starts_with("thinking>") {
114 self.in_thinking = true;
115 self.thinking_buffer.clear();
116 output.push_str("\n💭 [Thinking");
117 for _ in 0..9 {
118 chars.next();
119 }
120 continue;
121 } else if remaining.starts_with("/thinking>") {
122 self.in_thinking = false;
123 output.push_str("]\n");
124 for _ in 0..10 {
125 chars.next();
126 }
127 continue;
128 }
129 }
130
131 if self.in_thinking {
132 self.thinking_buffer.push(c);
133 if self.thinking_buffer.len() % 3 == 0 {
134 output.push('.');
135 }
136 } else {
137 output.push(c);
138 }
139 }
140
141 output
142 }
143 }
144
145 let messages = vec![ChatMessage::user(
146 "Solve this problem: What is 15 * 234 + 89?",
147 )];
148
149 let mut tracker = ThinkingTracker::new();
150 print!("Assistant: ");
151 io::stdout().flush()?;
152
153 // Stream the response, processing thinking tags as they arrive.
154 let _response = client
155 .chat_stream(messages, None, None, None, None, |chunk| {
156 let output = tracker.process_chunk(chunk);
157 print!("{}", output);
158 io::stdout().flush().unwrap();
159 })
160 .await?;
161
162 println!("\n\n Streaming examples completed!");
163 println!("\nKey benefits of streaming:");
164 println!(" • Real-time response display");
165 println!(" • Better user experience for long responses");
166 println!(" • Ability to show thinking/reasoning process");
167 println!(" • Early cancellation possible (future feature)");
168
169 Ok(())
170}Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Clears all messages from the chat session.
Examples found in repository?
190async fn interactive_chat() -> helios_engine::Result<()> {
191 // Create a configuration for the LLM.
192 let llm_config = LLMConfig {
193 model_name: "gpt-3.5-turbo".to_string(),
194 base_url: "https://api.openai.com/v1".to_string(),
195 api_key: std::env::var("OPENAI_API_KEY")
196 .unwrap_or_else(|_| "your-api-key-here".to_string()),
197 temperature: 0.7,
198 max_tokens: 2048,
199 };
200
201 // Create a new LLM client.
202 let client = LLMClient::new(helios_engine::llm::LLMProviderType::Remote(llm_config)).await?;
203 let mut session =
204 ChatSession::new().with_system_prompt("You are a friendly and helpful AI assistant.");
205
206 println!("Chat started! Type 'exit' or 'quit' to end the conversation.\n");
207
208 loop {
209 print!("You: ");
210 io::stdout().flush()?;
211
212 let mut input = String::new();
213 io::stdin().read_line(&mut input)?;
214 let input = input.trim();
215
216 if input.is_empty() {
217 continue;
218 }
219
220 if input == "exit" || input == "quit" {
221 println!("\n👋 Goodbye!");
222 break;
223 }
224
225 // Handle special commands.
226 if input == "clear" {
227 session.clear();
228 println!("🧹 Conversation cleared!\n");
229 continue;
230 }
231
232 if input == "history" {
233 println!("\n📜 Conversation history:");
234 for (i, msg) in session.messages.iter().enumerate() {
235 println!(" {}. {:?}: {}", i + 1, msg.role, msg.content);
236 }
237 println!();
238 continue;
239 }
240
241 session.add_user_message(input);
242
243 print!("Assistant: ");
244 io::stdout().flush()?;
245
246 match client
247 .chat(session.get_messages(), None, None, None, None)
248 .await
249 {
250 Ok(response) => {
251 session.add_assistant_message(&response.content);
252 println!("{}\n", response.content);
253 }
254 Err(e) => {
255 println!("\n❌ Error: {}", e);
256 println!(" (Make sure OPENAI_API_KEY is set correctly)\n");
257 // Remove the last user message since it failed.
258 session.messages.pop();
259 }
260 }
261 }
262
263 Ok(())
264}Sourcepub fn set_metadata(&mut self, key: impl Into<String>, value: impl Into<String>)
pub fn set_metadata(&mut self, key: impl Into<String>, value: impl Into<String>)
Sets a metadata key-value pair for the session.
Sourcepub fn get_metadata(&self, key: &str) -> Option<&String>
pub fn get_metadata(&self, key: &str) -> Option<&String>
Gets a metadata value by key.
Sourcepub fn remove_metadata(&mut self, key: &str) -> Option<String>
pub fn remove_metadata(&mut self, key: &str) -> Option<String>
Removes a metadata key-value pair.
Sourcepub fn get_summary(&self) -> String
pub fn get_summary(&self) -> String
Returns a summary of the chat session.
Trait Implementations§
Source§impl Clone for ChatSession
impl Clone for ChatSession
Source§fn clone(&self) -> ChatSession
fn clone(&self) -> ChatSession
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more