use graphrag_core::embeddings::config::EmbeddingProviderConfig;
use graphrag_core::embeddings::EmbeddingProvider;
#[cfg(feature = "ureq")]
use graphrag_core::embeddings::api_providers::HttpEmbeddingProvider;
#[cfg(feature = "huggingface-hub")]
use graphrag_core::embeddings::huggingface::HuggingFaceEmbeddings;
#[tokio::main]
async fn main() -> graphrag_core::core::error::Result<()> {
println!("đ GraphRAG - Load Embeddings from TOML Config\n");
println!("1ī¸âŖ Loading config from embeddings.toml...");
let config_path = "examples/embeddings.toml";
let config = match EmbeddingProviderConfig::from_toml_file(config_path) {
Ok(cfg) => {
println!(" â
Config loaded successfully");
println!(" Provider: {}", cfg.provider);
println!(" Model: {}", cfg.model);
println!(" Batch size: {}", cfg.batch_size);
cfg
},
Err(e) => {
println!(" â ī¸ Failed to load config: {}", e);
println!(" Using default configuration instead\n");
EmbeddingProviderConfig::default()
},
};
let embedding_config = config.to_embedding_config()?;
println!(" Provider type: {:?}\n", embedding_config.provider);
println!("2ī¸âŖ Creating provider from config...");
match embedding_config.provider {
graphrag_core::embeddings::EmbeddingProviderType::HuggingFace => {
#[cfg(feature = "huggingface-hub")]
{
println!(" Creating HuggingFace provider");
let mut hf = HuggingFaceEmbeddings::from_config(&embedding_config);
if std::env::var("ENABLE_DOWNLOAD_TESTS").is_ok() {
println!(" Initializing (downloading model if needed)...");
match hf.initialize().await {
Ok(_) => {
println!(" â
Provider initialized");
println!(" Dimensions: {}", hf.dimensions());
let text = "GraphRAG combines knowledge graphs with RAG.";
match hf.embed(text).await {
Ok(embedding) => {
println!(
" â
Generated embedding: {} dimensions",
embedding.len()
);
},
Err(e) => println!(" â ī¸ Embedding failed: {}", e),
}
},
Err(e) => println!(" â ī¸ Initialization failed: {}", e),
}
} else {
println!(" âšī¸ Set ENABLE_DOWNLOAD_TESTS=1 to test downloads");
}
}
#[cfg(not(feature = "huggingface-hub"))]
{
println!(" â ī¸ HuggingFace feature not enabled");
println!(" Enable with: --features huggingface-hub");
}
},
_ => {
#[cfg(feature = "ureq")]
{
println!(" Creating HTTP API provider");
match HttpEmbeddingProvider::from_config(&embedding_config) {
Ok(provider) => {
println!(" â
Provider created: {}", provider.provider_name());
println!(" Dimensions: {}", provider.dimensions());
if provider.is_available() {
let text = "GraphRAG combines knowledge graphs with RAG.";
match provider.embed(text).await {
Ok(embedding) => {
println!(
" â
Generated embedding: {} dimensions",
embedding.len()
);
},
Err(e) => println!(" â ī¸ API call failed: {}", e),
}
} else {
println!(" â ī¸ API key not set");
println!(" Set api_key in config or use environment variable");
}
},
Err(e) => println!(" â ī¸ Failed to create provider: {}", e),
}
}
#[cfg(not(feature = "ureq"))]
{
println!(" â ī¸ HTTP features not enabled");
println!(" Enable with: --features ureq");
}
},
}
println!("\n3ī¸âŖ Example configurations:");
for (name, example_config) in EmbeddingProviderConfig::examples() {
println!("\n đ {}", name);
println!(" Provider: {}", example_config.provider);
println!(" Model: {}", example_config.model);
println!(" Batch size: {}", example_config.batch_size);
if let Some(dims) = example_config.dimensions {
println!(" Dimensions: {}", dims);
}
}
println!("\n4ī¸âŖ Generating example TOML configs:");
let examples_to_generate = vec![
(
"config-huggingface.toml",
EmbeddingProviderConfig {
provider: "huggingface".to_string(),
model: "sentence-transformers/all-MiniLM-L6-v2".to_string(),
api_key: None,
cache_dir: Some("~/.cache/huggingface".to_string()),
batch_size: 32,
dimensions: Some(384),
},
),
(
"config-openai.toml",
EmbeddingProviderConfig {
provider: "openai".to_string(),
model: "text-embedding-3-small".to_string(),
api_key: Some("sk-...".to_string()),
cache_dir: None,
batch_size: 100,
dimensions: Some(1536),
},
),
(
"config-voyage.toml",
EmbeddingProviderConfig {
provider: "voyage".to_string(),
model: "voyage-3-large".to_string(),
api_key: Some("pa-...".to_string()),
cache_dir: None,
batch_size: 128,
dimensions: Some(1024),
},
),
];
for (filename, config) in examples_to_generate {
match config.to_toml_file(filename) {
Ok(_) => println!(" â
Generated {}", filename),
Err(e) => println!(" â ī¸ Failed to generate {}: {}", filename, e),
}
}
println!("\n⨠Demo complete!");
println!("\nđĄ Tips:");
println!(" - Edit examples/embeddings.toml to configure your provider");
println!(" - Set API keys via environment variables (recommended)");
println!(" - Use HuggingFace for free, offline embeddings");
println!(" - Use API providers for production deployments");
Ok(())
}