API Reference
Complete API documentation for SmartRAG interfaces, methods, and models
This page has been moved. Please visit the API Reference Index.
IDocumentSearchService
Purpose: AI-powered intelligent query processing with RAG pipeline and conversation management
Namespace: SmartRAG.Interfaces.Document
Methods
QueryIntelligenceAsync
Unified intelligent query processing with RAG and automatic session management. Searches across databases, documents, images (OCR), and audio (transcription) in a single query using Smart Hybrid routing.
Smart Hybrid Routing:
- High Confidence (>0.7) + Database Queries: Executes database query only
- High Confidence (>0.7) + No Database Queries: Executes document query only
- Medium Confidence (0.3-0.7): Executes both database and document queries, merges results
- Low Confidence (<0.3): Executes document query only (fallback)
Task<RagResponse> QueryIntelligenceAsync(
string query,
int maxResults = 5,
bool startNewConversation = false,
SearchOptions? options = null
)
Parameters:
query(string): The user’s question or querymaxResults(int): Maximum number of document chunks to retrieve (default: 5)startNewConversation(bool): Start a new conversation session (default: false)options(SearchOptions?): Optional search options to override global configuration (default: null)
Returns: RagResponse with AI answer, sources from all available data sources (databases, documents, images, audio), and metadata
Example:
// Unified query across all data sources
var response = await _searchService.QueryIntelligenceAsync(
"Show me top customers and their recent feedback",
maxResults: 5
);
Console.WriteLine(response.Answer);
// Sources include both database and document sources
foreach (var source in response.Sources)
{
Console.WriteLine($"Source: {source.FileName}");
}
SearchOptions Usage:
// Enable only database search
var dbOptions = new SearchOptions
{
EnableDatabaseSearch = true,
EnableDocumentSearch = false,
EnableAudioSearch = false,
EnableImageSearch = false
};
var dbResponse = await _searchService.QueryIntelligenceAsync(
"Show top customers",
maxResults: 5,
options: dbOptions
);
// Enable only audio search
var audioOptions = new SearchOptions
{
EnableDatabaseSearch = false,
EnableDocumentSearch = false,
EnableAudioSearch = true,
EnableImageSearch = false,
PreferredLanguage = "en"
};
var audioResponse = await _searchService.QueryIntelligenceAsync(
"What was discussed in the meeting?",
maxResults: 5,
options: audioOptions
);
// Use global configuration
var globalOptions = SearchOptions.FromConfig(_smartRagOptions);
var response = await _searchService.QueryIntelligenceAsync(
"Search everything",
maxResults: 5,
options: globalOptions
);
Flag-Based Filtering (Query String Parsing):
You can parse flags from query strings for quick search type selection:
// Parse flags from query string
string userQuery = "-db Show top customers";
var searchOptions = ParseSearchOptions(userQuery, out string cleanQuery);
// cleanQuery = "Show top customers"
// searchOptions.EnableDatabaseSearch = true
// searchOptions.EnableDocumentSearch = false
// searchOptions.EnableAudioSearch = false
// searchOptions.EnableImageSearch = false
var response = await _searchService.QueryIntelligenceAsync(
cleanQuery,
maxResults: 5,
options: searchOptions
);
Available Flags:
-db: Enable database search only-d: Enable document (text) search only-a: Enable audio search only-i: Enable image search only- Flags can be combined (e.g.,
-db -afor database + audio search)
Note: If database coordinator is not configured, the method automatically falls back to document-only search, maintaining backward compatibility.
SearchDocumentsAsync
Search documents semantically without generating an AI answer.
Task<List<DocumentChunk>> SearchDocumentsAsync(
string query,
int maxResults = 5,
SearchOptions? options = null,
List<string>? queryTokens = null
)
Parameters:
query(string): Search querymaxResults(int): Maximum chunks to return (default: 5)options(SearchOptions?, optional): Optional search options to override global configuration (default: null)queryTokens(List?, optional): Pre-computed query tokens for performance optimization (default: null)
Returns: List<DocumentChunk> with relevant document chunks
Example:
// Basic usage
var chunks = await _searchService.SearchDocumentsAsync("machine learning", maxResults: 10);
foreach (var chunk in chunks)
{
Console.WriteLine($"Score: {chunk.RelevanceScore}, Content: {chunk.Content}");
}
// With search options
var options = new SearchOptions
{
EnableDocumentSearch = true,
EnableAudioSearch = false,
EnableImageSearch = false
};
var filteredChunks = await _searchService.SearchDocumentsAsync(
"machine learning",
maxResults: 10,
options: options
);
// With pre-computed tokens (performance optimization)
var tokens = new List<string> { "machine", "learning", "algorithms" };
var optimizedChunks = await _searchService.SearchDocumentsAsync(
"machine learning",
maxResults: 10,
queryTokens: tokens
);
GenerateRagAnswerAsync (Deprecated)
Deprecated in v3.0.0
Use QueryIntelligenceAsync instead. This method will be removed in v4.0.0.
Legacy method provided for backward compatibility.
[Obsolete("Use QueryIntelligenceAsync instead")]
Task<RagResponse> GenerateRagAnswerAsync(
string query,
int maxResults = 5,
bool startNewConversation = false
)
IDocumentService
Purpose: Document CRUD operations and management
Namespace: SmartRAG.Interfaces.Document
Methods
UploadDocumentAsync
Upload and process a single document.
Task<Document> UploadDocumentAsync(
Stream fileStream,
string fileName,
string contentType,
string uploadedBy,
string language = null
)
Parameters:
fileStream(Stream): Document file streamfileName(string): Name of the filecontentType(string): MIME content typeuploadedBy(string): User identifierlanguage(string, optional): Language code for OCR (e.g., “eng”, “tur”)
Supported Formats:
- PDF:
application/pdf - Word:
application/vnd.openxmlformats-officedocument.wordprocessingml.document - Excel:
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet - Images:
image/jpeg,image/png,image/webp, etc. - Audio:
audio/mpeg,audio/wav, etc. - Databases:
application/x-sqlite3
Example:
using var fileStream = File.OpenRead("contract.pdf");
var document = await _documentService.UploadDocumentAsync(
fileStream,
"contract.pdf",
"application/pdf",
"user-123"
);
Console.WriteLine($"Uploaded: {document.FileName}, Chunks: {document.Chunks.Count}");
UploadDocumentsAsync
Upload and process multiple documents in batch.
Task<List<Document>> UploadDocumentsAsync(
IEnumerable<Stream> fileStreams,
IEnumerable<string> fileNames,
IEnumerable<string> contentTypes,
string uploadedBy
)
GetDocumentAsync
Get a document by its ID.
Task<Document> GetDocumentAsync(Guid id)
GetAllDocumentsAsync
Get all uploaded documents.
Task<List<Document>> GetAllDocumentsAsync()
DeleteDocumentAsync
Delete a document and its chunks.
Task<bool> DeleteDocumentAsync(Guid id)
GetStorageStatisticsAsync
Get storage statistics and metrics.
Task<Dictionary<string, object>> GetStorageStatisticsAsync()
Example:
var stats = await _documentService.GetStorageStatisticsAsync();
Console.WriteLine($"Total Documents: {stats["TotalDocuments"]}");
Console.WriteLine($"Total Chunks: {stats["TotalChunks"]}");
RegenerateAllEmbeddingsAsync
Regenerate embeddings for all documents (useful after changing AI provider).
Task<bool> RegenerateAllEmbeddingsAsync()
ClearAllEmbeddingsAsync
Clear all embeddings while keeping document content.
Task<bool> ClearAllEmbeddingsAsync()
ClearAllDocumentsAsync
Clear all documents and their embeddings.
Task<bool> ClearAllDocumentsAsync()
IConversationManagerService
Purpose: Conversation session management and history tracking
Namespace: SmartRAG.Interfaces.Support
This interface provides dedicated conversation management, separated from document operations for better separation of concerns.
Methods
StartNewConversationAsync
Start a new conversation session.
Task<string> StartNewConversationAsync()
Returns: New session ID (string)
Example:
var sessionId = await _conversationManager.StartNewConversationAsync();
Console.WriteLine($"Started session: {sessionId}");
GetOrCreateSessionIdAsync
Get existing session ID or create a new one automatically.
Task<string> GetOrCreateSessionIdAsync()
Returns: Session ID (string)
Use Case: Automatic session continuity without manual session management
Example:
// Automatically manages session - creates new if none exists
var sessionId = await _conversationManager.GetOrCreateSessionIdAsync();
AddToConversationAsync
Add a conversation turn (question + answer) to the session history.
Task AddToConversationAsync(
string sessionId,
string question,
string answer
)
Parameters:
sessionId(string): Session identifierquestion(string): User’s questionanswer(string): AI’s answer
Example:
await _conversationManager.AddToConversationAsync(
sessionId,
"What is machine learning?",
"Machine learning is a subset of AI that enables systems to learn..."
);
GetConversationHistoryAsync
Retrieve full conversation history for a session.
Task<string> GetConversationHistoryAsync(string sessionId)
Parameters:
sessionId(string): Session identifier
Returns: Formatted conversation history as string
Format:
User: [question]
Assistant: [answer]
User: [next question]
Assistant: [next answer]
Example:
var history = await _conversationManager.GetConversationHistoryAsync(sessionId);
Console.WriteLine(history);
TruncateConversationHistory
Truncate conversation history to keep only recent turns (memory management).
string TruncateConversationHistory(
string history,
int maxTurns = 3
)
Parameters:
history(string): Full conversation historymaxTurns(int): Maximum number of conversation turns to keep (default: 3)
Returns: Truncated conversation history
Use Case: Prevent context window overflow in AI prompts
Example:
var fullHistory = await _conversationManager.GetConversationHistoryAsync(sessionId);
var recentHistory = _conversationManager.TruncateConversationHistory(fullHistory, maxTurns: 5);
Complete Usage Example
public class ChatService
{
private readonly IConversationManagerService _conversationManager;
private readonly IDocumentSearchService _searchService;
public ChatService(
IConversationManagerService conversationManager,
IDocumentSearchService searchService)
{
_conversationManager = conversationManager;
_searchService = searchService;
}
public async Task<string> HandleChatAsync(string userMessage)
{
// Get or create session
var sessionId = await _conversationManager.GetOrCreateSessionIdAsync();
// Get conversation history for context
var history = await _conversationManager.GetConversationHistoryAsync(sessionId);
// Query with context
var response = await _searchService.QueryIntelligenceAsync(userMessage);
// Save to conversation history
await _conversationManager.AddToConversationAsync(
sessionId,
userMessage,
response.Answer
);
return response.Answer;
}
public async Task<string> StartNewChatAsync()
{
var newSessionId = await _conversationManager.StartNewConversationAsync();
return $"Started new conversation: {newSessionId}";
}
}
Storage Backends
Conversation history is stored using the configured IConversationRepository:
- SQLite:
SqliteConversationRepository- Persistent file-based storage - InMemory:
InMemoryConversationRepository- Fast, non-persistent (development) - FileSystem:
FileSystemConversationRepository- JSON file-based storage - Redis:
RedisConversationRepository- High-performance distributed storage
Storage backend is automatically selected based on your StorageProvider configuration.
IDocumentParserService
Purpose: Multi-format document parsing and text extraction
Namespace: SmartRAG.Interfaces.Document
Methods
ParseDocumentAsync
Parse a document and create document entity.
Task<Document> ParseDocumentAsync(
Stream fileStream,
string fileName,
string contentType,
string uploadedBy,
string language = null
)
GetSupportedFileTypes
Get list of supported file extensions.
IEnumerable<string> GetSupportedFileTypes()
Returns:
.pdf,.docx,.doc.xlsx,.xls.txt,.md,.json,.xml,.csv.jpg,.jpeg,.png,.gif,.bmp,.tiff,.webp.mp3,.wav,.m4a,.aac,.ogg,.flac,.wma.db,.sqlite,.sqlite3
GetSupportedContentTypes
Get list of supported MIME content types.
IEnumerable<string> GetSupportedContentTypes()
IDatabaseParserService
Purpose: Universal database support with live connections
Namespace: SmartRAG.Interfaces.Database
Methods
ParseDatabaseFileAsync
Parse a database file (SQLite).
Task<string> ParseDatabaseFileAsync(Stream dbStream, string fileName)
Example:
using var dbStream = File.OpenRead("catalog.db");
var content = await _databaseService.ParseDatabaseFileAsync(dbStream, "catalog.db");
Console.WriteLine(content); // Extracted table data as text
ParseDatabaseConnectionAsync
Connect to live database and extract content.
Task<string> ParseDatabaseConnectionAsync(
string connectionString,
DatabaseConfig config
)
Example:
var config = new DatabaseConfig
{
Type = DatabaseType.SqlServer,
ConnectionString = "Server=localhost;Database=Northwind;Trusted_Connection=true;",
IncludedTables = new List<string> { "Customers", "Orders", "Products" },
MaxRowsPerTable = 1000,
SanitizeSensitiveData = true
};
var content = await _databaseService.ParseDatabaseConnectionAsync(
config.ConnectionString,
config
);
ExtractTableDataAsync
Extract data from a specific table.
Task<string> ExtractTableDataAsync(
string connectionString,
string tableName,
DatabaseType databaseType,
int maxRows = 1000
)
ExecuteQueryAsync
Execute custom SQL query.
Task<string> ExecuteQueryAsync(
string connectionString,
string query,
DatabaseType databaseType,
int maxRows = 1000
)
Example:
var result = await _databaseService.ExecuteQueryAsync(
"Server=localhost;Database=Sales;Trusted_Connection=true;",
"SELECT TOP 10 CustomerID, CompanyName FROM Customers WHERE Country = 'USA'",
DatabaseType.SqlServer,
maxRows: 10
);
GetTableNamesAsync
Get list of table names from database.
Task<List<string>> GetTableNamesAsync(
string connectionString,
DatabaseType databaseType
)
GetTableSchemaAsync
Get schema information for a specific table.
Task<string> GetTableSchemaAsync(
string connectionString,
string tableName,
DatabaseType databaseType
)
ValidateConnectionAsync
Validate database connection.
Task<bool> ValidateConnectionAsync(
string connectionString,
DatabaseType databaseType
)
Example:
bool isValid = await _databaseService.ValidateConnectionAsync(
"Server=localhost;Database=MyDb;Trusted_Connection=true;",
DatabaseType.SqlServer
);
if (isValid)
{
Console.WriteLine("Connection successful!");
}
GetSupportedDatabaseTypes
Get list of supported database types.
IEnumerable<DatabaseType> GetSupportedDatabaseTypes()
Returns:
DatabaseType.SQLiteDatabaseType.SqlServerDatabaseType.MySQLDatabaseType.PostgreSQL
GetSupportedDatabaseFileExtensions
Get supported file extensions for database files.
IEnumerable<string> GetSupportedDatabaseFileExtensions()
Returns: .db, .sqlite, .sqlite3
ClearMemoryCache
Clear memory cache and dispose resources.
void ClearMemoryCache()
ISemanticSearchService
Purpose: Advanced semantic search with hybrid scoring
Namespace: SmartRAG.Interfaces.Search
Methods
CalculateEnhancedSemanticSimilarityAsync
Calculate enhanced semantic similarity using advanced text analysis.
Task<double> CalculateEnhancedSemanticSimilarityAsync(
string query,
string content
)
Algorithm: Hybrid scoring (80% semantic + 20% keyword)
Returns: Similarity score between 0.0 and 1.0
Example:
double similarity = await _semanticSearch.CalculateEnhancedSemanticSimilarityAsync(
"machine learning algorithms",
"This document discusses various ML algorithms including neural networks..."
);
Console.WriteLine($"Similarity: {similarity:P}"); // e.g., "Similarity: 85%"
IContextExpansionService
Purpose: Expand document chunk context by including adjacent chunks from the same document
Namespace: SmartRAG.Interfaces.Search
Methods
ExpandContextAsync
Expands context by including adjacent chunks from the same document. This ensures that if a heading is in one chunk and content is in the next, both are included in the search results.
Task<List<DocumentChunk>> ExpandContextAsync(
List<DocumentChunk> chunks,
int contextWindow = 2
)
Parameters:
chunks(List): Initial chunks found by search contextWindow(int): Number of adjacent chunks to include before and after each found chunk (default: 2, max: 5)
Returns: Expanded list of chunks with context, sorted by document ID and chunk index
Example:
// Search for relevant chunks
var chunks = await _searchService.SearchDocumentsAsync("SRS maintenance", maxResults: 5);
// Expand context to include adjacent chunks
var expandedChunks = await _contextExpansion.ExpandContextAsync(chunks, contextWindow: 2);
// Now expandedChunks includes the heading chunk AND its content chunks
foreach (var chunk in expandedChunks)
{
Console.WriteLine($"Chunk {chunk.ChunkIndex}: {chunk.Content.Substring(0, 100)}...");
}
Note: This service is automatically used by DocumentSearchService when generating RAG answers. It helps prevent situations where only headings are found without their corresponding content.
IAIService
Purpose: AI provider communication for text generation and embeddings
Namespace: SmartRAG.Interfaces.AI
Methods
GenerateResponseAsync
Generate AI response based on query and context.
Task<string> GenerateResponseAsync(
string query,
IEnumerable<string> context
)
Example:
var contextChunks = new List<string>
{
"Document chunk 1...",
"Document chunk 2...",
"Document chunk 3..."
};
var response = await _aiService.GenerateResponseAsync(
"What are the main topics?",
contextChunks
);
Console.WriteLine(response);
GenerateEmbeddingsAsync
Generate embedding vector for text.
Task<List<float>> GenerateEmbeddingsAsync(string text)
Returns: Embedding vector (typically 768 or 1536 dimensions)
GenerateEmbeddingsBatchAsync
Generate embeddings for multiple texts in batch.
Task<List<List<float>>> GenerateEmbeddingsBatchAsync(
IEnumerable<string> texts
)
Example:
var texts = new List<string> { "Text 1", "Text 2", "Text 3" };
var embeddings = await _aiService.GenerateEmbeddingsBatchAsync(texts);
Console.WriteLine($"Generated {embeddings.Count} embeddings");
Data Models
RagResponse
AI-generated response with sources.
public class RagResponse
{
public string Query { get; set; } // Original query
public string Answer { get; set; } // AI-generated answer
public List<SearchSource> Sources { get; set; } // Source documents
public DateTime SearchedAt { get; set; } // Timestamp
public Configuration Configuration { get; set; } // Provider config
}
Example Response:
{
"query": "What is RAG?",
"answer": "RAG (Retrieval-Augmented Generation) is...",
"sources": [
{
"documentId": "abc-123",
"fileName": "ml-guide.pdf",
"chunkContent": "RAG combines retrieval...",
"relevanceScore": 0.92
}
],
"searchedAt": "2025-10-18T14:30:00Z"
}
DocumentChunk
Document chunk with relevance score.
public class DocumentChunk
{
public string Id { get; set; } // Chunk ID
public string DocumentId { get; set; } // Parent document ID
public string Content { get; set; } // Chunk text content
public List<float> Embedding { get; set; } // Vector embedding
public double RelevanceScore { get; set; } // Similarity score (0-1)
public int ChunkIndex { get; set; } // Position in document
}
Document
Document entity with metadata.
public class Document
{
public Guid Id { get; set; } // Document ID
public string FileName { get; set; } // Original file name
public string ContentType { get; set; } // MIME type
public long FileSize { get; set; } // File size in bytes
public DateTime UploadedAt { get; set; } // Upload timestamp
public string UploadedBy { get; set; } // User identifier
public string Content { get; set; } // Extracted text content
public List<DocumentChunk> Chunks { get; set; } // Document chunks
}
DatabaseConfig
Database connection configuration.
public class DatabaseConfig
{
public DatabaseType Type { get; set; } // Database type
public string ConnectionString { get; set; } // Connection string
public List<string> IncludedTables { get; set; } // Tables to include
public List<string> ExcludedTables { get; set; } // Tables to exclude
public int MaxRowsPerTable { get; set; } = 1000; // Row limit
public bool SanitizeSensitiveData { get; set; } = true; // Sanitize sensitive columns
public List<string> SensitiveColumns { get; set; } // Columns to sanitize
}
Enumerations
AIProvider
Supported AI providers.
public enum AIProvider
{
OpenAI, // OpenAI GPT models
Anthropic, // Anthropic Claude models
Gemini, // Google Gemini models
AzureOpenAI, // Azure OpenAI service
Custom // Custom/Ollama/LM Studio/OpenRouter
}
StorageProvider
Supported storage backends for document and vector data persistence.
public enum StorageProvider
{
InMemory, // RAM storage (non-persistent, for testing and development)
Redis, // High-performance cache and storage
Qdrant // Vector database for advanced vector search capabilities
}
Note: SQLite and FileSystem are not available as StorageProvider options. They are only available as ConversationStorageProvider options for conversation history storage.
DatabaseType
Supported database types.
public enum DatabaseType
{
SQLite, // SQLite embedded database
SqlServer, // Microsoft SQL Server
MySQL, // MySQL / MariaDB
PostgreSQL // PostgreSQL
}
RetryPolicy
Retry policies for failed requests.
public enum RetryPolicy
{
None, // No retries
FixedDelay, // Fixed delay between retries
LinearBackoff, // Linearly increasing delay
ExponentialBackoff // Exponentially increasing delay (recommended)
}
Advanced Interfaces
IMultiDatabaseQueryCoordinator
Purpose: Coordinates intelligent multi-database queries using AI
Namespace: SmartRAG.Interfaces.Database
This interface enables querying across multiple databases simultaneously using natural language. The AI analyzes the query, determines which databases and tables to access, generates optimized SQL queries, and merges results into a coherent response.
Methods
QueryMultipleDatabasesAsync
Executes a full intelligent query: analyze intent + execute + merge results.
Overload 1: Full query with automatic intent analysis
Task<RagResponse> QueryMultipleDatabasesAsync(
string userQuery,
int maxResults = 5
)
Overload 2: Query with pre-analyzed intent (avoids redundant AI calls)
Task<RagResponse> QueryMultipleDatabasesAsync(
string userQuery,
QueryIntent preAnalyzedIntent,
int maxResults = 5
)
Parameters:
userQuery(string): Natural language user querypreAnalyzedIntent(QueryIntent, optional): Pre-analyzed query intent to avoid redundant AI callsmaxResults(int): Maximum number of results to return (default: 5)
Returns: RagResponse with AI-generated answer and data from multiple databases
Example 1 - Automatic Intent Analysis:
var response = await _coordinator.QueryMultipleDatabasesAsync(
"Show records from TableA with their corresponding TableB details"
);
Console.WriteLine(response.Answer);
// AI answer combining data from multiple databases
Example 2 - Pre-analyzed Intent (Performance Optimization):
// Analyze intent once
var intent = await _queryIntentAnalyzer.AnalyzeQueryIntentAsync(
"Show records from TableA with their corresponding TableB details"
);
// Use pre-analyzed intent to avoid redundant AI calls
var response = await _coordinator.QueryMultipleDatabasesAsync(
"Show records from TableA with their corresponding TableB details",
intent,
maxResults: 10
);
Console.WriteLine(response.Answer);
AnalyzeQueryIntentAsync (Deprecated)
Deprecated in
Use IQueryIntentAnalyzer.AnalyzeQueryIntentAsync instead. This method will be removed in v4.0.0.
Legacy method for analyzing user query and determining which databases/tables to query.
[Obsolete("Use IQueryIntentAnalyzer.AnalyzeQueryIntentAsync instead. Will be removed in v4.0.0")]
Task<QueryIntent> AnalyzeQueryIntentAsync(string userQuery)
Parameters:
userQuery(string): Natural language user query
Returns: QueryIntent with database routing information
Recommended Usage:
// Use IQueryIntentAnalyzer instead
var intent = await _queryIntentAnalyzer.AnalyzeQueryIntentAsync(
"Compare data between Database1 and Database2"
);
Console.WriteLine($"Confidence: {intent.Confidence}");
Console.WriteLine($"Requires Cross-DB Join: {intent.RequiresCrossDatabaseJoin}");
foreach (var dbQuery in intent.DatabaseQueries)
{
Console.WriteLine($"Database: {dbQuery.DatabaseName}");
Console.WriteLine($"Tables: {string.Join(", ", dbQuery.RequiredTables)}");
}
ExecuteMultiDatabaseQueryAsync
Executes queries across multiple databases based on query intent.
Task<MultiDatabaseQueryResult> ExecuteMultiDatabaseQueryAsync(
QueryIntent queryIntent
)
Parameters:
queryIntent(QueryIntent): Analyzed query intent
Returns: MultiDatabaseQueryResult with combined results from all databases
GenerateDatabaseQueriesAsync
Generates optimized SQL queries for each database based on intent.
Task<QueryIntent> GenerateDatabaseQueriesAsync(QueryIntent queryIntent)
Parameters:
queryIntent(QueryIntent): Query intent to generate SQL for
Returns: Updated QueryIntent with generated SQL queries
Note: MergeResultsAsync is available in IResultMerger interface, not in IMultiDatabaseQueryCoordinator. The coordinator automatically uses the result merger internally.
IDatabaseConnectionManager
Purpose: Manages database connections from configuration
Namespace: SmartRAG.Interfaces.Database
Handles database connection lifecycle, validation, and runtime management.
Methods
InitializeAsync
Initializes all database connections from configuration.
Task InitializeAsync()
Example:
await _connectionManager.InitializeAsync();
Console.WriteLine("All database connections initialized");
GetAllConnectionsAsync
Gets all configured database connections.
Task<List<DatabaseConnectionConfig>> GetAllConnectionsAsync()
Returns: List of all database connection configurations
GetConnectionAsync
Gets a specific connection by ID.
Task<DatabaseConnectionConfig> GetConnectionAsync(string databaseId)
Parameters:
databaseId(string): Database identifier
Returns: Connection configuration or null if not found
ValidateConnectionAsync
Validates a specific connection.
Task<bool> ValidateConnectionAsync(string databaseId)
Parameters:
databaseId(string): Database identifier
Returns: True if connection is valid, false otherwise
Example:
bool isValid = await _connectionManager.ValidateConnectionAsync("database-1");
if (isValid)
{
Console.WriteLine("Connection is valid");
}
GetDatabaseIdAsync
Gets database identifier from connection (auto-generates if Name not provided).
Task<string> GetDatabaseIdAsync(DatabaseConnectionConfig connectionConfig)
Parameters:
connectionConfig(DatabaseConnectionConfig): Connection configuration
Returns: Unique database identifier
Example:
var config = new DatabaseConnectionConfig
{
Name = "SalesDB",
ConnectionString = "Server=localhost;Database=Sales;Trusted_Connection=true;",
DatabaseType = DatabaseType.SqlServer
};
var databaseId = await _connectionManager.GetDatabaseIdAsync(config);
Console.WriteLine($"Database ID: {databaseId}");
IDatabaseSchemaAnalyzer
Purpose: Analyzes database schemas and generates intelligent metadata
Namespace: SmartRAG.Interfaces.Database
Extracts comprehensive schema information including tables, columns, relationships, and generates AI-powered summaries.
Methods
AnalyzeDatabaseSchemaAsync
Analyzes a database connection and extracts comprehensive schema information.
Task<DatabaseSchemaInfo> AnalyzeDatabaseSchemaAsync(
DatabaseConnectionConfig connectionConfig
)
Parameters:
connectionConfig(DatabaseConnectionConfig): Database connection configuration
Returns: Complete DatabaseSchemaInfo including tables, columns, foreign keys, and AI-generated summaries
Example:
var config = new DatabaseConnectionConfig
{
ConnectionString = "Server=localhost;Database=Northwind;Trusted_Connection=true;",
DatabaseType = DatabaseType.SqlServer
};
var schemaInfo = await _schemaAnalyzer.AnalyzeDatabaseSchemaAsync(config);
Console.WriteLine($"Database: {schemaInfo.DatabaseName}");
Console.WriteLine($"Tables: {schemaInfo.Tables.Count}");
Console.WriteLine($"Total Rows: {schemaInfo.TotalRowCount:N0}");
Console.WriteLine($"AI Summary: {schemaInfo.AISummary}");
GetAllSchemasAsync
Gets all analyzed database schemas.
Task<List<DatabaseSchemaInfo>> GetAllSchemasAsync()
Returns: List of all database schemas currently in memory
GetSchemaAsync
Gets schema for a specific database.
Task<DatabaseSchemaInfo> GetSchemaAsync(string databaseId)
Parameters:
databaseId(string): Database identifier
Returns: Database schema information or null if not found
GenerateAISummaryAsync
Generates AI-powered summary of database content.
Task<string> GenerateAISummaryAsync(DatabaseSchemaInfo schemaInfo)
Parameters:
schemaInfo(DatabaseSchemaInfo): Schema information to summarize
Returns: AI-generated summary describing the database purpose and content
IAudioParserService
Purpose: Audio transcription with Whisper.net (100% local processing)
Namespace: SmartRAG.Interfaces.Parser
Provides local audio-to-text transcription using Whisper.net. All processing is done on-premise - no data is sent to external services.
Privacy Note
Audio transcription uses Whisper.net for 100% local processing. No audio data is ever sent to external services. GDPR/KVKK/HIPAA compliant.
Methods
TranscribeAudioAsync
Transcribes audio content from a stream to text.
Task<AudioTranscriptionResult> TranscribeAudioAsync(
Stream audioStream,
string fileName,
string language = null
)
Parameters:
audioStream(Stream): The audio stream to transcribefileName(string): The name of the audio file for format detectionlanguage(string, optional): Language code for transcription (e.g., “tr-TR”, “en-US”, “auto”)
Returns: AudioTranscriptionResult containing transcribed text, confidence score, and metadata
Example:
using var audioStream = File.OpenRead("meeting.mp3");
var result = await _audioParser.TranscribeAudioAsync(
audioStream,
"meeting.mp3",
language: "en"
);
Console.WriteLine($"Transcription: {result.Text}");
Console.WriteLine($"Confidence: {result.Confidence:P}");
Console.WriteLine($"Language: {result.Language}");
Supported Audio Formats:
- MP3, WAV, M4A, AAC, OGG, FLAC, WMA
Whisper Models:
tiny(75MB) - Fastest, lowest accuracybase(142MB) - Good balance (recommended)small(466MB) - Better accuracymedium(1.5GB) - High accuracylarge-v3(2.9GB) - Highest accuracy
IImageParserService
Purpose: OCR text extraction from images using Tesseract
Namespace: SmartRAG.Interfaces.Parser
Provides optical character recognition (OCR) for extracting text from images. All processing is local using Tesseract.
Methods
ExtractTextFromImageAsync
Extracts text from an image using OCR.
Task<string> ExtractTextFromImageAsync(
Stream imageStream,
string language = "eng"
)
Parameters:
imageStream(Stream): The image stream to processlanguage(string, optional): Language code for OCR (default: “eng”)- English: “eng”
- Turkish: “tur”
- German: “deu”
- Multiple: “eng+tur”
Returns: Extracted text as string
Example:
using var imageStream = File.OpenRead("document.png");
var text = await _imageParser.ExtractTextFromImageAsync(
imageStream,
language: "eng"
);
Console.WriteLine($"Extracted Text: {text}");
ExtractTextWithConfidenceAsync
Extracts text from an image with confidence scores.
Task<OcrResult> ExtractTextWithConfidenceAsync(
Stream imageStream,
string language = null
)
Parameters:
imageStream(Stream): The image stream to processlanguage(string, optional): Language code for OCR (e.g., “eng”, “tur”). If null, uses system locale automatically
Returns: OcrResult with extracted text, confidence scores, and text blocks
Example:
using var imageStream = File.OpenRead("invoice.jpg");
var result = await _imageParser.ExtractTextWithConfidenceAsync(
imageStream,
language: "eng"
);
Console.WriteLine($"Text: {result.ExtractedText}");
Console.WriteLine($"Confidence: {result.Confidence:P}");
foreach (var block in result.TextBlocks)
{
Console.WriteLine($"Block: {block.Text} (Confidence: {block.Confidence:P})");
}
PreprocessImageAsync
Preprocesses an image for better OCR results.
Task<Stream> PreprocessImageAsync(Stream imageStream)
Parameters:
imageStream(Stream): The input image stream
Returns: Preprocessed image stream
Preprocessing Steps:
- Grayscale conversion
- Contrast enhancement
- Noise reduction
- Binarization
Example:
using var originalStream = File.OpenRead("low-quality.jpg");
using var preprocessedStream = await _imageParser.PreprocessImageAsync(originalStream);
var text = await _imageParser.ExtractTextFromImageAsync(
preprocessedStream,
language: "eng"
);
Console.WriteLine($"Text from preprocessed image: {text}");
CorrectCurrencySymbols
Corrects currency symbol misreads in text (e.g., % → ₺, $, €). This method applies the same currency correction logic used in OCR results to any text.
string CorrectCurrencySymbols(string text, string language = null)
Parameters:
text(string): Text to correctlanguage(string, optional): Language code for context (used for logging)
Returns: Text with corrected currency symbols
Example:
var correctedText = _imageParser.CorrectCurrencySymbols("Price: 100%", "tr");
Console.WriteLine(correctedText); // "Price: 100₺"
Supported Image Formats:
- JPEG, PNG, GIF, BMP, TIFF, WEBP
Usage Patterns
Dependency Injection
Inject interfaces in your services/controllers:
public class MyService
{
private readonly IDocumentSearchService _searchService;
private readonly IDocumentService _documentService;
private readonly IDatabaseParserService _databaseService;
public MyService(
IDocumentSearchService searchService,
IDocumentService documentService,
IDatabaseParserService databaseService)
{
_searchService = searchService;
_documentService = documentService;
_databaseService = databaseService;
}
public async Task<string> ProcessQuery(string query)
{
var response = await _searchService.QueryIntelligenceAsync(query);
return response.Answer;
}
}
Error Handling
try
{
var response = await _searchService.QueryIntelligenceAsync(query);
return Ok(response);
}
catch (SmartRagException ex)
{
// SmartRAG-specific exceptions
_logger.LogError(ex, "SmartRAG error: {Message}", ex.Message);
return BadRequest(new { error = ex.Message });
}
catch (Exception ex)
{
// General exceptions
_logger.LogError(ex, "Unexpected error");
return StatusCode(500, "Internal server error");
}
Async/Await Best Practices
// ✅ GOOD - Await properly
var result = await _searchService.QueryIntelligenceAsync(query);
// ❌ BAD - Blocking call (can cause deadlocks)
var result = _searchService.QueryIntelligenceAsync(query).Result;
// ✅ GOOD - ConfigureAwait in library code
var result = await _searchService.QueryIntelligenceAsync(query).ConfigureAwait(false);
Strategy Pattern Interfaces
SmartRAG provides Strategy Pattern for extensibility and customization.
ISqlDialectStrategy
Purpose: Database-specific SQL generation and validation
Namespace: SmartRAG.Interfaces.Database.Strategies
Enables database-specific SQL optimization and custom database support.
Properties
DatabaseType DatabaseType { get; }
Methods
BuildSystemPrompt
Build AI system prompt for SQL generation specific to this database dialect.
string BuildSystemPrompt(DatabaseSchemaInfo schema, string userQuery)
ValidateSyntax
Validate SQL syntax for this specific dialect.
bool ValidateSyntax(string sql, out string errorMessage)
FormatSql
Format SQL query according to dialect-specific rules.
string FormatSql(string sql)
GetLimitClause
Get the LIMIT clause format for this dialect.
string GetLimitClause(int limit)
Returns:
- SQLite/MySQL:
LIMIT {limit} - SQL Server:
TOP {limit} - PostgreSQL:
LIMIT {limit}
Built-in Implementations
SqliteDialectStrategy- SQLite-optimized SQLPostgreSqlDialectStrategy- PostgreSQL-optimized SQLMySqlDialectStrategy- MySQL/MariaDB-optimized SQLSqlServerDialectStrategy- SQL Server-optimized SQL
Custom Implementation Example
Note: This is a conceptual example. To add support for a new database type, you would need to:
- Add the database type to the
DatabaseTypeenum - Implement
ISqlDialectStrategyfor that database - Register the strategy in dependency injection
// Example: Custom database dialect strategy
public class CustomDialectStrategy : BaseSqlDialectStrategy
{
public override DatabaseType DatabaseType => DatabaseType.Custom; // Assuming Custom is added to enum
public override string BuildSystemPrompt(DatabaseSchemaInfo schema, string userQuery)
{
return $"Generate SQL for: {userQuery}\\nSchema: {schema}";
}
public override bool ValidateSyntax(string sql, out string errorMessage)
{
// Database-specific validation
errorMessage = null;
return true;
}
public override string FormatSql(string sql)
{
// Database-specific formatting
return sql;
}
public override string GetLimitClause(int limit)
{
// Database-specific LIMIT clause format
return $"LIMIT {limit}";
}
}
IScoringStrategy
Purpose: Customizable document relevance scoring
Namespace: SmartRAG.Interfaces.Search.Strategies
Enables custom scoring algorithms for search results.
Methods
CalculateScoreAsync
Calculate relevance score for a document chunk.
Task<double> CalculateScoreAsync(
string query,
DocumentChunk chunk,
List<float> queryEmbedding
)
Parameters:
query(string): Search querychunk(DocumentChunk): Document chunk to scorequeryEmbedding(List): Query embedding vector
Returns: Score between 0.0 and 1.0
Built-in Implementation
HybridScoringStrategy (default):
- 80% semantic similarity (cosine similarity of embeddings)
- 20% keyword matching (BM25-like scoring)
Custom Implementation Example
public class SemanticOnlyScoringStrategy : IScoringStrategy
{
public async Task<double> CalculateScoreAsync(
string query,
DocumentChunk chunk,
List<float> queryEmbedding)
{
// Pure semantic similarity (100% embedding-based)
return CosineSimilarity(queryEmbedding, chunk.Embedding);
}
private double CosineSimilarity(List<float> a, List<float> b)
{
double dotProduct = 0, normA = 0, normB = 0;
for (int i = 0; i < a.Count; i++)
{
dotProduct += a[i] * b[i];
normA += a[i] * a[i];
normB += b[i] * b[i];
}
return dotProduct / (Math.Sqrt(normA) * Math.Sqrt(normB));
}
}
IFileParser
Purpose: Strategy for parsing specific file formats
Namespace: SmartRAG.Interfaces.Parser.Strategies
Enables custom file format parsers.
Methods
ParseAsync
Parse a file and extract content.
Task<FileParserResult> ParseAsync(Stream fileStream, string fileName)
CanParse
Check if this parser can handle the given file.
bool CanParse(string fileName, string contentType)
Built-in Implementations
PdfFileParser- PDF documentsWordFileParser- Word documents (.docx)ExcelFileParser- Excel spreadsheets (.xlsx)TextFileParser- Plain text filesImageFileParser- Images with OCRAudioFileParser- Audio transcriptionDatabaseFileParser- SQLite databases
Custom Implementation Example
public class MarkdownFileParser : IFileParser
{
public bool CanParse(string fileName, string contentType)
{
return fileName.EndsWith(".md", StringComparison.OrdinalIgnoreCase) ||
contentType == "text/markdown";
}
public async Task<FileParserResult> ParseAsync(Stream fileStream, string fileName)
{
using var reader = new StreamReader(fileStream);
var content = await reader.ReadToEndAsync();
// Strip markdown syntax for plain text
var plainText = StripMarkdownSyntax(content);
return new FileParserResult
{
Content = plainText,
Success = true
};
}
private string StripMarkdownSyntax(string markdown)
{
// Remove markdown formatting
return Regex.Replace(markdown, @"[#*`\[\]()]", "");
}
}
Additional Service Interfaces
IConversationRepository
Purpose: Data access layer for conversation storage
Namespace: SmartRAG.Interfaces.Storage
Separated from IDocumentRepository for better SRP compliance.
Methods
Task<string> GetConversationHistoryAsync(string sessionId);
Task SaveConversationAsync(string sessionId, string history);
Task DeleteConversationAsync(string sessionId);
Task<bool> ConversationExistsAsync(string sessionId);
Implementations
SqliteConversationRepositoryInMemoryConversationRepositoryFileSystemConversationRepositoryRedisConversationRepository
IAIConfigurationService
Purpose: AI provider configuration management
Namespace: SmartRAG.Interfaces.AI
Separated configuration from execution for better SRP.
Methods
AIProvider GetProvider();
string GetModel();
string GetEmbeddingModel();
int GetMaxTokens();
double GetTemperature();
IAIRequestExecutor
Purpose: AI request execution with retry/fallback
Namespace: SmartRAG.Interfaces.AI
Handles AI requests with automatic retry and fallback logic.
Methods
Task<string> ExecuteRequestAsync(string prompt, CancellationToken cancellationToken = default);
Task<List<float>> ExecuteEmbeddingRequestAsync(string text, CancellationToken cancellationToken = default);
IQueryIntentAnalyzer
Purpose: Query intent analysis for database routing
Namespace: SmartRAG.Interfaces.Database
Analyzes queries to determine database routing strategy.
Methods
Task<QueryIntent> AnalyzeQueryIntentAsync(string userQuery);
IDatabaseQueryExecutor
Purpose: Execute queries across multiple databases
Namespace: SmartRAG.Interfaces.Database
Parallel query execution across databases.
Methods
Task<MultiDatabaseQueryResult> ExecuteMultiDatabaseQueryAsync(QueryIntent queryIntent);
IResultMerger
Purpose: Merge results from multiple databases
Namespace: SmartRAG.Interfaces.Database
AI-powered result merging.
Methods
MergeResultsAsync
Merges results from multiple databases into a coherent response.
Task<string> MergeResultsAsync(MultiDatabaseQueryResult queryResults, string originalQuery)
Parameters:
queryResults(MultiDatabaseQueryResult): Results from multiple databasesoriginalQuery(string): Original user query
Returns: Merged and formatted results as string
GenerateFinalAnswerAsync
Generates final AI answer from merged database results.
Task<RagResponse> GenerateFinalAnswerAsync(
string userQuery,
string mergedData,
MultiDatabaseQueryResult queryResults
)
Parameters:
userQuery(string): Original user querymergedData(string): Merged data from databasesqueryResults(MultiDatabaseQueryResult): Query results
Returns: RagResponse with AI-generated answer
ISQLQueryGenerator
Purpose: Generate and validate SQL queries
Namespace: SmartRAG.Interfaces.Database
Uses ISqlDialectStrategy for database-specific SQL.
Methods
Task<string> GenerateSqlAsync(string userQuery, DatabaseSchemaInfo schema, DatabaseType databaseType);
bool ValidateSql(string sql, DatabaseSchemaInfo schema, out string errorMessage);
IEmbeddingSearchService
Purpose: Embedding-based semantic search
Namespace: SmartRAG.Interfaces.Search
Core embedding search functionality.
Methods
Task<List<DocumentChunk>> SearchByEmbeddingAsync(List<float> queryEmbedding, int maxResults = 5);
ISourceBuilderService
Purpose: Build search result sources
Namespace: SmartRAG.Interfaces.Search
Constructs SearchSource objects from chunks.
Methods
List<SearchSource> BuildSources(List<DocumentChunk> chunks);
IAudioParserService
Purpose: Audio file parsing and transcription
Namespace: SmartRAG.Interfaces.Parser
Methods
Task<AudioTranscriptionResult> TranscribeAudioAsync(Stream audioStream, string fileName, string language = null);
Parameters:
audioStream(Stream): The audio stream to transcribefileName(string): The name of the audio file for format detectionlanguage(string, optional): Language code for transcription (e.g., “tr-TR”, “en-US”, “auto”)
Returns: AudioTranscriptionResult containing transcribed text, confidence score, and metadata
IImageParserService
Purpose: Image OCR processing
Namespace: SmartRAG.Interfaces.Parser
Methods
Task<string> ExtractTextFromImageAsync(Stream imageStream, string language = null);
Task<OcrResult> ExtractTextWithConfidenceAsync(Stream imageStream, string language = null);
Task<Stream> PreprocessImageAsync(Stream imageStream);
string CorrectCurrencySymbols(string text, string language = null);
Parameters:
imageStream(Stream): The image stream to processlanguage(string, optional): Language code for OCR (e.g., “eng”, “tur”). If null, uses system locale automaticallytext(string): Text to correct currency symbols in
Returns:
ExtractTextFromImageAsync: Extracted text as stringExtractTextWithConfidenceAsync:OcrResultwith text, confidence scores, and text blocksPreprocessImageAsync: Preprocessed image streamCorrectCurrencySymbols: Text with corrected currency symbols (e.g., % → ₺, $, €)
IAIProvider
Purpose: Low-level AI provider interface for text generation and embeddings
Namespace: SmartRAG.Interfaces.AI
Provider abstraction for multiple AI backends.
Methods
Task<string> GenerateTextAsync(string prompt, AIProviderConfig config);
Task<List<float>> GenerateEmbeddingAsync(string text, AIProviderConfig config);
Task<List<List<float>>> GenerateEmbeddingsBatchAsync(IEnumerable<string> texts, AIProviderConfig config);
Task<List<string>> ChunkTextAsync(string text, int maxChunkSize = 1000);
IAIProviderFactory
Purpose: Factory for creating AI provider instances
Namespace: SmartRAG.Interfaces.AI
Factory pattern for AI provider creation.
Methods
IAIProvider CreateProvider(AIProvider providerType);
IPromptBuilderService
Purpose: Service for building AI prompts for different scenarios
Namespace: SmartRAG.Interfaces.AI
Centralized prompt construction with conversation history support.
Methods
string BuildDocumentRagPrompt(string query, string context, string? conversationHistory = null, string? preferredLanguage = null);
string BuildHybridMergePrompt(string query, string? databaseContext, string? documentContext, string? conversationHistory = null, string? preferredLanguage = null);
string BuildConversationPrompt(string query, string? conversationHistory = null, string? preferredLanguage = null);
Parameters:
query(string): User querycontext(string): Document context (for BuildDocumentRagPrompt)databaseContext(string?, optional): Database query results (for BuildHybridMergePrompt)documentContext(string?, optional): Document search results (for BuildHybridMergePrompt)conversationHistory(string?, optional): Previous conversation turnspreferredLanguage(string?, optional): Preferred language code (e.g., “tr”, “en”) for explicit AI response language
IDocumentRepository
Purpose: Repository interface for document storage operations
Namespace: SmartRAG.Interfaces.Document
Separated repository layer from business logic.
Methods
AddAsync
Adds a new document to storage.
Task<Document> AddAsync(Document document)
GetByIdAsync
Retrieves document by unique identifier.
Task<Document> GetByIdAsync(Guid id)
GetAllAsync
Retrieves all documents from storage.
Task<List<Document>> GetAllAsync()
DeleteAsync
Removes document from storage by ID.
Task<bool> DeleteAsync(Guid id)
GetCountAsync
Gets total count of documents in storage.
Task<int> GetCountAsync()
SearchAsync
Searches documents using query string.
Task<List<DocumentChunk>> SearchAsync(string query, int maxResults = 5)
Parameters:
query(string): Search query stringmaxResults(int): Maximum number of results to return (default: 5)
Returns: List of relevant document chunks
ClearAllAsync
Clear all documents from storage (efficient bulk delete).
Task<bool> ClearAllAsync()
Returns: True if all documents were cleared successfully
IDocumentScoringService
Purpose: Service for scoring document chunks based on query relevance
Namespace: SmartRAG.Interfaces.Document
Hybrid scoring strategy with keyword and semantic relevance.
Methods
List<DocumentChunk> ScoreChunks(List<DocumentChunk> chunks, string query, List<string> queryWords, List<string> potentialNames);
double CalculateKeywordRelevanceScore(string query, string content);
IAudioParserFactory
Purpose: Factory for creating audio parser service instances
Namespace: SmartRAG.Interfaces.Parser
Factory pattern for audio parser creation.
Methods
IAudioParserService CreateAudioParser(AudioProvider provider);
IStorageFactory
Purpose: Factory for creating document and conversation storage repositories
Namespace: SmartRAG.Interfaces.Storage
Unified factory for all storage operations.
Methods
IDocumentRepository CreateRepository(StorageConfig config);
IDocumentRepository CreateRepository(StorageProvider provider);
StorageProvider GetCurrentProvider();
IDocumentRepository GetCurrentRepository();
IConversationRepository CreateConversationRepository(StorageConfig config);
IConversationRepository CreateConversationRepository(StorageProvider provider);
IConversationRepository GetCurrentConversationRepository();
IQdrantCacheManager
Purpose: Interface for managing search result caching in Qdrant operations
Namespace: SmartRAG.Interfaces.Storage.Qdrant
Search result caching for performance optimization.
Methods
List<DocumentChunk> GetCachedResults(string queryHash);
void CacheResults(string queryHash, List<DocumentChunk> results);
void CleanupExpiredCache();
IQdrantCollectionManager
Purpose: Interface for managing Qdrant collections and document storage
Namespace: SmartRAG.Interfaces.Storage.Qdrant
Collection lifecycle management for Qdrant vector database.
Methods
Task EnsureCollectionExistsAsync();
Task CreateCollectionAsync(string collectionName, int vectorDimension);
Task EnsureDocumentCollectionExistsAsync(string collectionName, Document document);
Task<int> GetVectorDimensionAsync();
IQdrantEmbeddingService
Purpose: Interface for generating embeddings for text content
Namespace: SmartRAG.Interfaces.Storage.Qdrant
Embedding generation for Qdrant vector storage.
Methods
Task<List<float>> GenerateEmbeddingAsync(string text);
Task<int> GetVectorDimensionAsync();
IQdrantSearchService
Purpose: Interface for performing searches in Qdrant vector database
Namespace: SmartRAG.Interfaces.Storage.Qdrant
Vector, text, and hybrid search capabilities for Qdrant.
Methods
Task<List<DocumentChunk>> SearchAsync(List<float> queryEmbedding, int maxResults);
Task<List<DocumentChunk>> FallbackTextSearchAsync(string query, int maxResults);
Task<List<DocumentChunk>> HybridSearchAsync(string query, int maxResults);
IQueryIntentClassifierService
Purpose: Service for classifying query intent (conversation vs information)
Namespace: SmartRAG.Interfaces.Support
AI-based query intent classification for hybrid routing.
Methods
Task<bool> IsGeneralConversationAsync(string query, string? conversationHistory = null);
bool TryParseCommand(string input, out QueryCommandType commandType, out string payload);
Command Types:
QueryCommandType.None: No command detectedQueryCommandType.NewConversation:/newor/resetcommandQueryCommandType.ForceConversation:/convcommand
ITextNormalizationService
Purpose: Text normalization and cleaning
Namespace: SmartRAG.Interfaces.Support
Methods
string NormalizeText(string text);
string RemoveExtraWhitespace(string text);
Performance Tips
Performance Optimization
- Chunk Size: 500-1000 characters for optimal balance
- MaxResults: 5-10 chunks typically sufficient
- Batch Operations: Use
UploadDocumentsAsyncfor multiple files - Storage: Use Qdrant or Redis for production (not InMemory)
- Caching: Enable conversation storage for better performance
- Database Limits: Set reasonable MaxRowsPerTable (1000-5000)
Next Steps
Changelog
Track new features, improvements, and breaking changes across all versions.
View Changelog