Config

Struct Config 

Source
pub struct Config {
    pub llm: LLMConfig,
}
Expand description

The main configuration for the Helios Engine.

Fields§

§llm: LLMConfig

The configuration for the remote LLM.

Implementations§

Source§

impl Config

Source

pub fn from_file<P: AsRef<Path>>(path: P) -> Result<Self>

Loads the configuration from a TOML file.

§Arguments
  • path - The path to the TOML file.
§Returns

A Result containing the loaded Config.

Examples found in repository?
examples/custom_tool.rs (line 76)
74async fn main() -> helios_engine::Result<()> {
75    // Load configuration from `config.toml`.
76    let config = Config::from_file("config.toml")?;
77
78    // Create an agent named "WeatherAgent" and equip it with the `WeatherTool`.
79    let mut agent = Agent::builder("WeatherAgent")
80        .config(config)
81        .system_prompt("You are a helpful weather assistant. Use the weather tool to answer questions about weather.")
82        .tool(Box::new(WeatherTool))
83        .build()
84        .await?;
85
86    // --- Ask the agent about the weather ---
87    let response = agent.chat("What's the weather like in New York?").await?;
88    println!("Agent: {}\n", response);
89
90    // --- Ask again, but with a different unit ---
91    let response = agent.chat("How about in London, but in celsius?").await?;
92    println!("Agent: {}\n", response);
93
94    Ok(())
95}
More examples
Hide additional examples
examples/agent_with_tools.rs (line 11)
9async fn main() -> helios_engine::Result<()> {
10    // Load configuration from `config.toml`.
11    let config = Config::from_file("config.toml")?;
12
13    // Create an agent named "ToolAgent" and equip it with the `CalculatorTool` and `EchoTool`.
14    // Using the improved syntax to add multiple tools at once!
15    let mut agent = Agent::builder("ToolAgent")
16        .config(config)
17        .system_prompt("You are a helpful assistant with access to tools. Use them when needed.")
18        .tools(vec![Box::new(CalculatorTool), Box::new(EchoTool)])
19        .max_iterations(5)
20        .build()
21        .await?;
22
23    println!(
24        "Available tools: {:?}\n",
25        agent.tool_registry().list_tools()
26    );
27
28    // --- Test the calculator tool ---
29    let response = agent.chat("What is 25 * 4 + 10?").await?;
30    println!("Agent: {}\n", response);
31
32    // --- Test the echo tool ---
33    let response = agent
34        .chat("Can you echo this message: 'Hello from Helios!'")
35        .await?;
36    println!("Agent: {}\n", response);
37
38    Ok(())
39}
examples/serve_agent.rs (line 16)
9async fn main() -> helios_engine::Result<()> {
10    // Initialize tracing
11    tracing_subscriber::fmt()
12        .with_max_level(tracing::Level::INFO)
13        .init();
14
15    // Load configuration
16    let config = Config::from_file("config.toml")?;
17
18    // Create an agent with tools
19    let agent = Agent::builder("API Agent")
20        .config(config)
21        .system_prompt("You are a helpful AI assistant with access to a calculator tool.")
22        .tool(Box::new(CalculatorTool))
23        .max_iterations(5)
24        .build()
25        .await?;
26
27    // Start the server
28    println!("Starting server on http://127.0.0.1:8000");
29    println!("Try: curl http://127.0.0.1:8000/v1/chat/completions \\");
30    println!("  -H 'Content-Type: application/json' \\");
31    println!("  -d '{{\"model\": \"local-model\", \"messages\": [{{\"role\": \"user\", \"content\": \"What is 15 * 7?\"}}]}}'");
32
33    helios_engine::serve::start_server_with_agent(
34        agent,
35        "local-model".to_string(),
36        "127.0.0.1:8000",
37    )
38    .await?;
39
40    Ok(())
41}
examples/basic_chat.rs (line 20)
14async fn main() -> helios_engine::Result<()> {
15    println!("🚀 Helios Engine - Basic Chat Example");
16    println!("=====================================");
17    println!("💡 Streaming is enabled by default - watch tokens appear in real-time!\n");
18
19    // Load configuration from `config.toml`.
20    let config = Config::from_file("config.toml")?;
21
22    // Create a simple agent named "BasicAgent".
23    let mut agent = Agent::builder("BasicAgent")
24        .config(config)
25        .system_prompt("You are a helpful assistant.")
26        .build()
27        .await?;
28
29    // --- Send a message to the agent ---
30    println!("User: Hello! How are you?");
31    print!("Agent (streaming): ");
32    io::stdout().flush()?;
33
34    let _response = agent.chat("Hello! How are you?").await?;
35    println!();
36
37    // --- Continue the conversation ---
38    println!("\nUser: What can you help me with?");
39    print!("Agent (streaming): ");
40    io::stdout().flush()?;
41
42    let _response = agent.chat("What can you help me with?").await?;
43    println!();
44
45    println!("\n✅ Demo completed! Notice how responses streamed in real-time.");
46
47    Ok(())
48}
examples/multiple_agents.rs (line 12)
10async fn main() -> helios_engine::Result<()> {
11    // Load configuration from `config.toml`.
12    let config = Config::from_file("config.toml")?;
13
14    // --- Create multiple agents with different personalities and tools ---
15
16    // An agent specialized in math, equipped with a calculator tool.
17    let mut math_agent = Agent::builder("MathAgent")
18        .config(config.clone())
19        .system_prompt("You are a math expert. You love numbers and equations.")
20        .tool(Box::new(CalculatorTool))
21        .build()
22        .await?;
23
24    // A creative agent for writing and storytelling.
25    let mut creative_agent = Agent::builder("CreativeAgent")
26        .config(config)
27        .system_prompt("You are a creative writer who loves storytelling and poetry.")
28        .build()
29        .await?;
30
31    // --- Interact with the Math Agent ---
32    println!("=== Math Agent ===");
33    let response = math_agent.chat("What is the square root of 144?").await?;
34    println!("Math Agent: {}\n", response);
35
36    // --- Interact with the Creative Agent ---
37    println!("=== Creative Agent ===");
38    let response = creative_agent
39        .chat("Write a haiku about programming.")
40        .await?;
41    println!("Creative Agent: {}\n", response);
42
43    Ok(())
44}
examples/rag_qdrant_comparison.rs (line 27)
19async fn demonstrate_in_memory() -> helios_engine::Result<()> {
20    println!("=== IN-MEMORY RAG DEMONSTRATION ===\n");
21
22    let api_key = std::env::var("OPENAI_API_KEY").unwrap_or_else(|_| {
23        println!("⚠ Warning: OPENAI_API_KEY not set. Using placeholder.");
24        "your-api-key-here".to_string()
25    });
26
27    let config = Config::from_file("config.toml").unwrap_or_else(|_| Config::new_default());
28
29    // Create in-memory RAG tool
30    let rag_tool = RAGTool::new_in_memory("https://api.openai.com/v1/embeddings", &api_key);
31
32    let mut agent = Agent::builder("InMemoryAgent")
33        .config(config)
34        .system_prompt("You are a helpful assistant with in-memory RAG capabilities.")
35        .tool(Box::new(rag_tool))
36        .max_iterations(8)
37        .build()
38        .await?;
39
40    println!("✓ In-memory agent created\n");
41
42    // Add some documents
43    println!("Adding documents...");
44    agent.chat("Store: The capital of France is Paris.").await?;
45    agent
46        .chat("Store: The capital of Germany is Berlin.")
47        .await?;
48    agent.chat("Store: The capital of Italy is Rome.").await?;
49    println!("✓ Documents added\n");
50
51    // Search
52    println!("Searching...");
53    let response = agent.chat("What is the capital of Germany?").await?;
54    println!("Agent: {}\n", response);
55
56    println!("Advantages of in-memory:");
57    println!("  ✓ No external dependencies");
58    println!("  ✓ Fast and simple");
59    println!("  ✓ Perfect for development");
60    println!("  ✗ No persistence (data lost on restart)");
61    println!("  ✗ Limited scalability\n");
62
63    Ok(())
64}
65
66async fn demonstrate_qdrant() -> helios_engine::Result<()> {
67    println!("=== QDRANT RAG DEMONSTRATION ===\n");
68
69    let api_key = std::env::var("OPENAI_API_KEY").unwrap_or_else(|_| {
70        println!("⚠ Warning: OPENAI_API_KEY not set. Using placeholder.");
71        "your-api-key-here".to_string()
72    });
73
74    let config = Config::from_file("config.toml").unwrap_or_else(|_| Config::new_default());
75
76    // Create Qdrant RAG tool
77    let rag_tool = RAGTool::new_qdrant(
78        "http://localhost:6333",
79        "comparison_demo",
80        "https://api.openai.com/v1/embeddings",
81        &api_key,
82    );
83
84    let mut agent = Agent::builder("QdrantAgent")
85        .config(config)
86        .system_prompt("You are a helpful assistant with Qdrant RAG capabilities.")
87        .tool(Box::new(rag_tool))
88        .max_iterations(8)
89        .build()
90        .await?;
91
92    println!("✓ Qdrant agent created\n");
93
94    // Clear any existing data
95    println!("Clearing existing data...");
96    agent.chat("Clear all documents").await?;
97    println!("✓ Cleared\n");
98
99    // Add some documents
100    println!("Adding documents...");
101    agent
102        .chat("Store: The Eiffel Tower is located in Paris, France.")
103        .await?;
104    agent
105        .chat("Store: The Colosseum is located in Rome, Italy.")
106        .await?;
107    agent
108        .chat("Store: The Brandenburg Gate is located in Berlin, Germany.")
109        .await?;
110    println!("✓ Documents added\n");
111
112    // Search
113    println!("Searching...");
114    let response = agent.chat("What famous landmark is in Berlin?").await?;
115    println!("Agent: {}\n", response);
116
117    println!("Advantages of Qdrant:");
118    println!("  ✓ Persistent storage");
119    println!("  ✓ Highly scalable");
120    println!("  ✓ Production-ready");
121    println!("  ✓ Advanced features (filtering, etc.)");
122    println!("  ✗ Requires external service");
123    println!("  ✗ More complex setup\n");
124
125    Ok(())
126}
Source

pub fn new_default() -> Self

Creates a new default configuration.

Examples found in repository?
examples/rag_qdrant_comparison.rs (line 27)
19async fn demonstrate_in_memory() -> helios_engine::Result<()> {
20    println!("=== IN-MEMORY RAG DEMONSTRATION ===\n");
21
22    let api_key = std::env::var("OPENAI_API_KEY").unwrap_or_else(|_| {
23        println!("⚠ Warning: OPENAI_API_KEY not set. Using placeholder.");
24        "your-api-key-here".to_string()
25    });
26
27    let config = Config::from_file("config.toml").unwrap_or_else(|_| Config::new_default());
28
29    // Create in-memory RAG tool
30    let rag_tool = RAGTool::new_in_memory("https://api.openai.com/v1/embeddings", &api_key);
31
32    let mut agent = Agent::builder("InMemoryAgent")
33        .config(config)
34        .system_prompt("You are a helpful assistant with in-memory RAG capabilities.")
35        .tool(Box::new(rag_tool))
36        .max_iterations(8)
37        .build()
38        .await?;
39
40    println!("✓ In-memory agent created\n");
41
42    // Add some documents
43    println!("Adding documents...");
44    agent.chat("Store: The capital of France is Paris.").await?;
45    agent
46        .chat("Store: The capital of Germany is Berlin.")
47        .await?;
48    agent.chat("Store: The capital of Italy is Rome.").await?;
49    println!("✓ Documents added\n");
50
51    // Search
52    println!("Searching...");
53    let response = agent.chat("What is the capital of Germany?").await?;
54    println!("Agent: {}\n", response);
55
56    println!("Advantages of in-memory:");
57    println!("  ✓ No external dependencies");
58    println!("  ✓ Fast and simple");
59    println!("  ✓ Perfect for development");
60    println!("  ✗ No persistence (data lost on restart)");
61    println!("  ✗ Limited scalability\n");
62
63    Ok(())
64}
65
66async fn demonstrate_qdrant() -> helios_engine::Result<()> {
67    println!("=== QDRANT RAG DEMONSTRATION ===\n");
68
69    let api_key = std::env::var("OPENAI_API_KEY").unwrap_or_else(|_| {
70        println!("⚠ Warning: OPENAI_API_KEY not set. Using placeholder.");
71        "your-api-key-here".to_string()
72    });
73
74    let config = Config::from_file("config.toml").unwrap_or_else(|_| Config::new_default());
75
76    // Create Qdrant RAG tool
77    let rag_tool = RAGTool::new_qdrant(
78        "http://localhost:6333",
79        "comparison_demo",
80        "https://api.openai.com/v1/embeddings",
81        &api_key,
82    );
83
84    let mut agent = Agent::builder("QdrantAgent")
85        .config(config)
86        .system_prompt("You are a helpful assistant with Qdrant RAG capabilities.")
87        .tool(Box::new(rag_tool))
88        .max_iterations(8)
89        .build()
90        .await?;
91
92    println!("✓ Qdrant agent created\n");
93
94    // Clear any existing data
95    println!("Clearing existing data...");
96    agent.chat("Clear all documents").await?;
97    println!("✓ Cleared\n");
98
99    // Add some documents
100    println!("Adding documents...");
101    agent
102        .chat("Store: The Eiffel Tower is located in Paris, France.")
103        .await?;
104    agent
105        .chat("Store: The Colosseum is located in Rome, Italy.")
106        .await?;
107    agent
108        .chat("Store: The Brandenburg Gate is located in Berlin, Germany.")
109        .await?;
110    println!("✓ Documents added\n");
111
112    // Search
113    println!("Searching...");
114    let response = agent.chat("What famous landmark is in Berlin?").await?;
115    println!("Agent: {}\n", response);
116
117    println!("Advantages of Qdrant:");
118    println!("  ✓ Persistent storage");
119    println!("  ✓ Highly scalable");
120    println!("  ✓ Production-ready");
121    println!("  ✓ Advanced features (filtering, etc.)");
122    println!("  ✗ Requires external service");
123    println!("  ✗ More complex setup\n");
124
125    Ok(())
126}
More examples
Hide additional examples
examples/agent_with_file_tools.rs (line 17)
10async fn main() -> helios_engine::Result<()> {
11    println!("🚀 Helios Engine - Agent with File Tools Example");
12    println!("=================================================\n");
13
14    // Load configuration
15    let config = Config::from_file("config.toml").unwrap_or_else(|_| {
16        println!("⚠ No config.toml found, using default configuration");
17        Config::new_default()
18    });
19
20    // Create an agent named "FileAssistant" and equip it with file tools.
21    let mut agent = Agent::builder("FileAssistant")
22        .config(config)
23        .system_prompt(
24            "You are a helpful file management assistant. You can search for files, \
25             read file contents, and edit files. Always confirm with the user before \
26             making changes to files. Keep track of important session information.",
27        )
28        .tool(Box::new(FileSearchTool))
29        .tool(Box::new(FileReadTool))
30        .tool(Box::new(FileEditTool))
31        .tool(Box::new(FileWriteTool))
32        .max_iterations(10)
33        .build()
34        .await?;
35
36    println!("✓ Agent created with file tools");
37    println!("✓ Available tools: file_search, file_read, file_edit, file_write\n");
38
39    // Set initial session memory for the agent.
40    agent.set_memory("session_start", chrono::Utc::now().to_rfc3339());
41    agent.set_memory(
42        "working_directory",
43        std::env::current_dir()?.display().to_string(),
44    );
45    agent.set_memory("tasks_completed", "0");
46
47    // --- Example 1: Search for Rust files ---
48    println!("Example 1: Searching for Rust files");
49    println!("====================================\n");
50
51    let response = agent
52        .chat("Find all Rust source files in the src directory")
53        .await?;
54    println!("Agent: {}\n", response);
55
56    // Update session memory after the task.
57    agent.increment_tasks_completed();
58    agent.set_memory("last_task", "file_search");
59
60    // --- Example 2: Read a specific file ---
61    println!("\nExample 2: Reading file contents");
62    println!("==================================\n");
63
64    let response = agent
65        .chat("Read the contents of src/lib.rs and give me a summary")
66        .await?;
67    println!("Agent: {}\n", response);
68
69    // Update session memory after the task.
70    agent.increment_tasks_completed();
71    agent.set_memory("last_task", "file_read");
72
73    // --- Example 3: Show session summary ---
74    println!("\nExample 3: Session Summary");
75    println!("==========================\n");
76
77    println!("{}", agent.get_session_summary());
78
79    // --- Example 4: Check session memory ---
80    println!("\nExample 4: Checking Session Memory");
81    println!("===================================\n");
82
83    println!(
84        "Working directory: {}",
85        agent
86            .get_memory("working_directory")
87            .unwrap_or(&"unknown".to_string())
88    );
89    println!(
90        "Tasks completed: {}",
91        agent
92            .get_memory("tasks_completed")
93            .unwrap_or(&"0".to_string())
94    );
95    println!(
96        "Last task: {}",
97        agent.get_memory("last_task").unwrap_or(&"none".to_string())
98    );
99
100    println!("\n✅ Example completed successfully!");
101    println!("\n💡 Key Features Demonstrated:");
102    println!("  • File search with pattern matching and content search");
103    println!("  • File reading with line range support");
104    println!("  • File editing with find/replace functionality");
105    println!("  • Session memory for tracking agent state");
106    println!("  • Streaming responses (works with both local and remote models)");
107
108    Ok(())
109}
examples/agent_with_memory_db.rs (line 17)
10async fn main() -> helios_engine::Result<()> {
11    println!("🚀 Helios Engine - Agent with Memory DB Example");
12    println!("================================================\n");
13
14    // Load configuration from `config.toml` or use default.
15    let config = Config::from_file("config.toml").unwrap_or_else(|_| {
16        println!("⚠ No config.toml found, using default configuration");
17        Config::new_default()
18    });
19
20    // Create an agent named "DataAgent" and equip it with the MemoryDBTool.
21    let mut agent = Agent::builder("DataAgent")
22        .config(config)
23        .system_prompt(
24            "You are a helpful assistant with access to an in-memory database. \
25             You can store and retrieve information using the memory_db tool. \
26             Operations available: set, get, delete, list, clear, exists. \
27             Use this to remember important information across our conversation.",
28        )
29        .tool(Box::new(MemoryDBTool::new()))
30        .max_iterations(10)
31        .build()
32        .await?;
33
34    println!("✓ Agent created with memory database tool\n");
35
36    // --- Example 1: Store user preferences ---
37    println!("Example 1: Storing User Preferences");
38    println!("====================================\n");
39
40    let response = agent
41        .chat("Store my name as 'Alice' and my favorite color as 'blue' in the database")
42        .await?;
43    println!("Agent: {}\n", response);
44
45    // --- Example 2: Retrieve stored data ---
46    println!("\nExample 2: Retrieving Stored Data");
47    println!("==================================\n");
48
49    let response = agent.chat("What's my name and favorite color?").await?;
50    println!("Agent: {}\n", response);
51
52    // --- Example 3: Store calculations ---
53    println!("\nExample 3: Caching Calculations");
54    println!("================================\n");
55
56    let response = agent
57        .chat("Calculate 123 * 456 and store the result in the database with key 'calculation_result'")
58        .await?;
59    println!("Agent: {}\n", response);
60
61    // --- Example 4: List all stored data ---
62    println!("\nExample 4: Listing All Data");
63    println!("===========================\n");
64
65    let response = agent
66        .chat("Show me everything stored in the database")
67        .await?;
68    println!("Agent: {}\n", response);
69
70    // --- Example 5: Check if key exists ---
71    println!("\nExample 5: Checking Key Existence");
72    println!("==================================\n");
73
74    let response = agent
75        .chat("Check if 'name' and 'age' exist in the database")
76        .await?;
77    println!("Agent: {}\n", response);
78
79    // --- Example 6: Delete specific data ---
80    println!("\nExample 6: Deleting Data");
81    println!("========================\n");
82
83    let response = agent
84        .chat("Delete the 'calculation_result' from the database")
85        .await?;
86    println!("Agent: {}\n", response);
87
88    // --- Example 7: Final state ---
89    println!("\nExample 7: Final Database State");
90    println!("================================\n");
91
92    let response = agent
93        .chat("List all remaining items in the database")
94        .await?;
95    println!("Agent: {}\n", response);
96
97    println!("\n✅ Example completed successfully!");
98    println!("\n💡 Key Features Demonstrated:");
99    println!("  • Setting key-value pairs in memory database");
100    println!("  • Retrieving stored values");
101    println!("  • Listing all database contents");
102    println!("  • Checking key existence");
103    println!("  • Deleting specific entries");
104    println!("  • Persistent data across multiple agent interactions");
105    println!("\n📝 Use Cases:");
106    println!("  • Caching expensive computations");
107    println!("  • Storing user preferences during conversation");
108    println!("  • Maintaining context across multiple queries");
109    println!("  • Temporary data storage for complex workflows");
110
111    Ok(())
112}
examples/rag_in_memory.rs (line 31)
18async fn main() -> helios_engine::Result<()> {
19    println!("🚀 Helios Engine - Agent with In-Memory RAG Example");
20    println!("===================================================\n");
21
22    // Check for the required OpenAI API key
23    let embedding_api_key = std::env::var("OPENAI_API_KEY").unwrap_or_else(|_| {
24        println!("⚠ Warning: OPENAI_API_KEY not set. Using placeholder.");
25        "your-api-key-here".to_string()
26    });
27
28    // Load configuration
29    let config = Config::from_file("config.toml").unwrap_or_else(|_| {
30        println!("⚠ No config.toml found, using default configuration");
31        Config::new_default()
32    });
33
34    // Create a new RAG tool with in-memory vector store
35    let rag_tool =
36        RAGTool::new_in_memory("https://api.openai.com/v1/embeddings", embedding_api_key);
37
38    // Create an agent with RAG capabilities
39    let mut agent = Agent::builder("KnowledgeAgent")
40        .config(config)
41        .system_prompt(
42            "You are a helpful assistant with access to an in-memory RAG (Retrieval-Augmented Generation) system. \
43             You can store documents and retrieve relevant information to answer questions. \
44             When answering questions, first search for relevant documents, then provide informed answers based on the retrieved context."
45        )
46        .tool(Box::new(rag_tool))
47        .max_iterations(10)
48        .build()
49        .await?;
50
51    println!("✓ Agent created with in-memory RAG capabilities\n");
52
53    // --- Example 1: Add knowledge about programming languages ---
54    println!("Example 1: Building a Knowledge Base");
55    println!("=====================================\n");
56
57    let documents = [
58        "Rust is a systems programming language that runs blazingly fast, prevents segfaults, \
59         and guarantees thread safety. It was created by Mozilla Research and first released in 2010.",
60        "Python is a high-level, interpreted programming language known for its clear syntax \
61         and readability. It was created by Guido van Rossum and first released in 1991.",
62        "JavaScript is a programming language commonly used for web development. It allows \
63         developers to create interactive web pages and runs in web browsers. It was created in 1995.",
64        "Go is a statically typed, compiled programming language designed at Google. It is \
65         syntactically similar to C, but with memory safety and garbage collection.",
66        "TypeScript is a strongly typed programming language that builds on JavaScript. It was \
67         developed and maintained by Microsoft and first released in 2012.",
68    ];
69
70    for (i, doc) in documents.iter().enumerate() {
71        println!("Adding document {}...", i + 1);
72        let response = agent
73            .chat(&format!("Store this information: {}", doc))
74            .await?;
75        println!("Agent: {}\n", response);
76    }
77
78    // --- Example 2: Semantic search with different queries ---
79    println!("\nExample 2: Semantic Search");
80    println!("==========================\n");
81
82    let queries = vec![
83        "What programming language prevents segfaults?",
84        "Tell me about the language created by Guido van Rossum",
85        "Which language is used for web development in browsers?",
86        "What language was developed by Google?",
87    ];
88
89    for query in queries {
90        println!("Query: {}", query);
91        let response = agent.chat(query).await?;
92        println!("Agent: {}\n", response);
93    }
94
95    // --- Example 3: Check document count ---
96    println!("\nExample 3: Document Count");
97    println!("=========================\n");
98
99    let response = agent.chat("How many documents are stored?").await?;
100    println!("Agent: {}\n", response);
101
102    // --- Example 4: Complex query requiring multiple documents ---
103    println!("\nExample 4: Complex Query");
104    println!("========================\n");
105
106    let response = agent
107        .chat("Compare the programming languages that were created in the 1990s")
108        .await?;
109    println!("Agent: {}\n", response);
110
111    println!("\n✅ Example completed successfully!");
112    println!("\n💡 Key Features Demonstrated:");
113    println!("  • In-memory vector storage (no external dependencies)");
114    println!("  • Document embedding with OpenAI embeddings");
115    println!("  • Semantic search with cosine similarity");
116    println!("  • RAG workflow for context-aware answers");
117    println!("  • Fast performance for development and testing");
118
119    println!("\n📝 Use Cases for In-Memory RAG:");
120    println!("  • Development and testing");
121    println!("  • Short-lived sessions");
122    println!("  • When persistence is not required");
123    println!("  • Rapid prototyping");
124
125    println!("\n🔧 Advantages:");
126    println!("  • No external dependencies (no database needed)");
127    println!("  • Fast setup and execution");
128    println!("  • Simple deployment");
129    println!("  • Perfect for demos and examples");
130
131    Ok(())
132}
examples/agent_with_rag.rs (line 36)
23async fn main() -> helios_engine::Result<()> {
24    println!("🚀 Helios Engine - Agent with RAG Example");
25    println!("==========================================\n");
26
27    // Check for the required OpenAI API key.
28    let embedding_api_key = std::env::var("OPENAI_API_KEY").unwrap_or_else(|_| {
29        println!("⚠ Warning: OPENAI_API_KEY not set. Using placeholder.");
30        "your-api-key-here".to_string()
31    });
32
33    // Load configuration from `config.toml` or use default.
34    let config = Config::from_file("config.toml").unwrap_or_else(|_| {
35        println!("⚠ No config.toml found, using default configuration");
36        Config::new_default()
37    });
38
39    // Create a new `QdrantRAGTool`.
40    let rag_tool = QdrantRAGTool::new(
41        "http://localhost:6333",                // Qdrant URL
42        "helios_knowledge",                     // Collection name
43        "https://api.openai.com/v1/embeddings", // Embedding API
44        embedding_api_key,                      // API key
45    );
46
47    // Create an agent named "KnowledgeAgent" and equip it with the RAG tool.
48    let mut agent = Agent::builder("KnowledgeAgent")
49        .config(config)
50        .system_prompt(
51            "You are a helpful assistant with access to a RAG (Retrieval-Augmented Generation) system. \
52             You can store documents and retrieve relevant information to answer questions. \
53             When answering questions, first search for relevant documents, then provide informed answers based on the retrieved context."
54        )
55        .tool(Box::new(rag_tool))
56        .max_iterations(10)
57        .build()
58        .await?;
59
60    println!("✓ Agent created with RAG capabilities\n");
61
62    // --- Example 1: Add knowledge to the database ---
63    println!("Example 1: Adding Documents to Knowledge Base");
64    println!("==============================================\n");
65
66    let response = agent
67        .chat(
68            "Store this information: Rust is a systems programming language that runs blazingly fast, \
69             prevents segfaults, and guarantees thread safety. It was created by Mozilla Research."
70        )
71        .await?;
72    println!("Agent: {}\n", response);
73
74    let response = agent
75        .chat(
76            "Store this: Python is a high-level, interpreted programming language known for its \
77             clear syntax and readability. It was created by Guido van Rossum in 1991.",
78        )
79        .await?;
80    println!("Agent: {}\n", response);
81
82    let response = agent
83        .chat(
84            "Store this: JavaScript is a programming language commonly used for web development. \
85             It allows developers to create interactive web pages and runs in web browsers.",
86        )
87        .await?;
88    println!("Agent: {}\n", response);
89
90    // --- Example 2: Semantic search - ask questions ---
91    println!("\nExample 2: Semantic Search and Q&A");
92    println!("===================================\n");
93
94    let response = agent
95        .chat("What programming language is known for preventing segfaults?")
96        .await?;
97    println!("Agent: {}\n", response);
98
99    let response = agent
100        .chat("Tell me about the programming language created in 1991")
101        .await?;
102    println!("Agent: {}\n", response);
103
104    // --- Example 3: Multi-document retrieval ---
105    println!("\nExample 3: Multi-Document Retrieval");
106    println!("====================================\n");
107
108    let response = agent
109        .chat("Search for information about programming languages and summarize what you find")
110        .await?;
111    println!("Agent: {}\n", response);
112
113    // --- Example 4: Adding documents with metadata ---
114    println!("\nExample 4: Documents with Metadata");
115    println!("===================================\n");
116
117    let response = agent
118        .chat(
119            "Store this with metadata: \
120             The Helios Engine is a Rust framework for building LLM agents. \
121             Metadata: category=framework, language=rust, year=2025",
122        )
123        .await?;
124    println!("Agent: {}\n", response);
125
126    println!("\n✅ Example completed successfully!");
127    println!("\n💡 Key Features Demonstrated:");
128    println!("  • Document embedding with OpenAI embeddings");
129    println!("  • Vector storage in Qdrant database");
130    println!("  • Semantic search with cosine similarity");
131    println!("  • RAG workflow for context-aware answers");
132    println!("  • Metadata support for document organization");
133
134    println!("\n📝 RAG Use Cases:");
135    println!("  • Question answering over custom knowledge bases");
136    println!("  • Document search and retrieval");
137    println!("  • Building chatbots with domain-specific knowledge");
138    println!("  • Information extraction from large document sets");
139
140    println!("\n🔧 Setup Instructions:");
141    println!("  1. Start Qdrant: docker run -p 6333:6333 qdrant/qdrant");
142    println!("  2. Set API key: export OPENAI_API_KEY=your-key");
143    println!("  3. Run example: cargo run --example agent_with_rag");
144
145    Ok(())
146}
examples/complete_demo.rs (line 19)
12async fn main() -> helios_engine::Result<()> {
13    println!("🚀 Helios Engine - Complete Feature Demo");
14    println!("=========================================\n");
15
16    // Load configuration from `config.toml` or use default.
17    let config = Config::from_file("config.toml").unwrap_or_else(|_| {
18        println!("⚠ No config.toml found, using default configuration");
19        Config::new_default()
20    });
21
22    // Create an agent named "SmartAssistant" and equip it with all file tools.
23    println!("📦 Creating agent with file tools...");
24    let mut agent = Agent::builder("SmartAssistant")
25        .config(config)
26        .system_prompt(
27            "You are an intelligent assistant with file management capabilities. \
28             You can search files, read them, and make edits. Always explain what \
29             you're doing and track important information in session memory.",
30        )
31        .tool(Box::new(FileSearchTool))
32        .tool(Box::new(FileReadTool))
33        .tool(Box::new(FileEditTool))
34        .tool(Box::new(FileWriteTool))
35        .max_iterations(10)
36        .build()
37        .await?;
38
39    println!("✓ Agent created successfully!\n");
40
41    // Initialize session memory with some starting values.
42    println!("🧠 Initializing session memory...");
43    agent.set_memory("session_start", chrono::Utc::now().to_rfc3339());
44    agent.set_memory(
45        "working_directory",
46        std::env::current_dir()?.display().to_string(),
47    );
48    agent.set_memory("files_accessed", "0");
49    agent.set_memory("edits_made", "0");
50    println!("✓ Session memory initialized\n");
51
52    // --- Demo 1: Search for files with streaming response ---
53    println!("Demo 1: File Search with Streaming");
54    println!("===================================");
55    println!("User: Find all Rust example files\n");
56
57    print!("Agent: ");
58    io::stdout().flush()?;
59
60    let response1 = agent
61        .chat("Find all Rust example files in the examples directory")
62        .await?;
63    println!("{}\n", response1);
64
65    // Update session memory after the task.
66    agent.increment_counter("files_accessed");
67    agent.set_memory("last_action", "file_search");
68
69    // --- Demo 2: Read a file ---
70    println!("\nDemo 2: Reading File Contents");
71    println!("==============================");
72    println!("User: Read the NEW_FEATURES.md file and summarize the key points\n");
73
74    print!("Agent: ");
75    io::stdout().flush()?;
76
77    let response2 = agent
78        .chat("Read the NEW_FEATURES.md file and give me a brief summary of what's new")
79        .await?;
80    println!("{}\n", response2);
81
82    // Update session memory after the task.
83    agent.increment_counter("files_accessed");
84    agent.set_memory("last_action", "file_read");
85
86    // --- Demo 3: Show session summary ---
87    println!("\nDemo 3: Session Summary");
88    println!("=======================\n");
89    println!("{}", agent.get_session_summary());
90
91    // --- Demo 4: Interactive mode ---
92    println!("\n\nDemo 4: Interactive Mode");
93    println!("========================");
94    println!("You can now interact with the agent. Type 'exit' to quit.\n");
95
96    loop {
97        print!("\nYou: ");
98        io::stdout().flush()?;
99
100        let mut input = String::new();
101        io::stdin().read_line(&mut input)?;
102        let input = input.trim();
103
104        if input.is_empty() {
105            continue;
106        }
107
108        match input.to_lowercase().as_str() {
109            "exit" | "quit" => {
110                println!("\n👋 Goodbye!");
111                break;
112            }
113            "summary" => {
114                println!("\n📊 Session Summary:");
115                println!("{}", agent.get_session_summary());
116                continue;
117            }
118            "memory" => {
119                println!("\n🧠 Session Memory:");
120                if let Some(start) = agent.get_memory("session_start") {
121                    println!("  Session started: {}", start);
122                }
123                if let Some(dir) = agent.get_memory("working_directory") {
124                    println!("  Working directory: {}", dir);
125                }
126                if let Some(files) = agent.get_memory("files_accessed") {
127                    println!("  Files accessed: {}", files);
128                }
129                if let Some(edits) = agent.get_memory("edits_made") {
130                    println!("  Edits made: {}", edits);
131                }
132                if let Some(action) = agent.get_memory("last_action") {
133                    println!("  Last action: {}", action);
134                }
135                continue;
136            }
137            "help" => {
138                println!("\n📖 Available Commands:");
139                println!("  exit, quit  - Exit the demo");
140                println!("  summary     - Show session summary");
141                println!("  memory      - Show session memory");
142                println!("  help        - Show this help");
143                println!("\n💡 Try asking the agent to:");
144                println!("  • Search for specific files");
145                println!("  • Read file contents");
146                println!("  • Summarize what it has done");
147                continue;
148            }
149            _ => {}
150        }
151
152        // Send message to agent with streaming.
153        print!("\nAgent: ");
154        io::stdout().flush()?;
155
156        match agent.chat(input).await {
157            Ok(response) => {
158                println!("{}", response);
159
160                // Update memory after each interaction.
161                agent.increment_counter("files_accessed");
162            }
163            Err(e) => {
164                eprintln!("\n❌ Error: {}", e);
165            }
166        }
167    }
168
169    // --- Final summary ---
170    println!("\n📊 Final Session Summary:");
171    println!("{}", agent.get_session_summary());
172
173    println!("\n✅ Demo completed successfully!");
174    println!("\n💡 Features Demonstrated:");
175    println!("  ✓ Streaming responses (local/remote models)");
176    println!("  ✓ File search with pattern matching");
177    println!("  ✓ File reading with summaries");
178    println!("  ✓ Session memory tracking");
179    println!("  ✓ Interactive conversation");
180    println!("  ✓ Real-time progress updates");
181
182    Ok(())
183}
Source

pub fn save<P: AsRef<Path>>(&self, path: P) -> Result<()>

Saves the configuration to a TOML file.

§Arguments
  • path - The path to the TOML file.
§Returns

A Result indicating success or failure.

Trait Implementations§

Source§

impl Clone for Config

Source§

fn clone(&self) -> Config

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Config

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for Config

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Serialize for Config

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl Freeze for Config

§

impl RefUnwindSafe for Config

§

impl Send for Config

§

impl Sync for Config

§

impl Unpin for Config

§

impl UnwindSafe for Config

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,