feat: Implement semantic search and smart note linking with embedding generation, vector storage, and link persistence.

This commit is contained in:
2025-12-25 23:59:11 +01:00
parent 4cb398869d
commit 178d59540e
19 changed files with 2501 additions and 49 deletions

View File

@@ -1,7 +1,11 @@
use notes_infra::factory::{EmbeddingProvider, VectorProvider};
#[derive(Debug, Clone)]
pub struct Config {
pub broker_url: String,
pub database_url: String,
pub embedding_provider: EmbeddingProvider,
pub vector_provider: VectorProvider,
}
impl Default for Config {
@@ -9,6 +13,11 @@ impl Default for Config {
Self {
broker_url: "nats://localhost:4222".to_string(),
database_url: "sqlite::memory:".to_string(),
embedding_provider: EmbeddingProvider::FastEmbed,
vector_provider: VectorProvider::Qdrant {
url: "http://localhost:6334".to_string(),
collection: "notes".to_string(),
},
}
}
}
@@ -17,9 +26,30 @@ impl Config {
pub fn from_env() -> Self {
let _ = dotenvy::dotenv();
let embedding_provider = match std::env::var("EMBEDDING_PROVIDER")
.unwrap_or_default()
.as_str()
{
_ => EmbeddingProvider::FastEmbed,
};
let vector_provider = match std::env::var("VECTOR_PROVIDER")
.unwrap_or_default()
.as_str()
{
_ => VectorProvider::Qdrant {
url: std::env::var("QDRANT_URL")
.unwrap_or_else(|_| "http://localhost:6334".to_string()),
collection: std::env::var("QDRANT_COLLECTION")
.unwrap_or_else(|_| "notes".to_string()),
},
};
Self {
broker_url: std::env::var("BROKER_URL").unwrap_or("nats://localhost:4222".to_string()),
database_url: std::env::var("DATABASE_URL").unwrap_or("sqlite::memory:".to_string()),
embedding_provider,
vector_provider,
}
}
}

View File

@@ -1,4 +1,10 @@
use notes_infra::{DatabaseConfig, create_pool};
use notes_domain::services::SmartNoteService;
use notes_infra::{
DatabaseConfig,
factory::{
build_database_pool, build_embedding_generator, build_link_repository, build_vector_store,
},
};
use crate::config::Config;
@@ -7,10 +13,24 @@ mod config;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let config = Config::from_env();
let nats_client = async_nats::connect(config.broker_url).await?;
let db_config = DatabaseConfig::new(config.database_url);
let db_pool = create_pool(&db_config).await?;
let nats_client = async_nats::connect(&config.broker_url).await?;
let db_config = DatabaseConfig::new(config.database_url.clone());
let db_pool = build_database_pool(&db_config).await?;
// Initialize smart feature adapters
let embedding_generator = build_embedding_generator(&config.embedding_provider).await?;
let vector_store = build_vector_store(&config.vector_provider).await?;
let link_repo = build_link_repository(&db_pool).await?;
// Create the service
let smart_service = SmartNoteService::new(embedding_generator, vector_store, link_repo);
tracing::info!(
"SmartNoteService initialized successfully with {:?}",
config.embedding_provider
);
// subscribe to jobs and process them
// (Future: consume NATS messages and call smart_service.process_note(&note))
Ok(())
}