ISearchService Documentation
The ISearchService provides AI-powered search, question-answering, and retrieval capabilities across Knowledge Boxes, including both synchronous and streaming responses.
Methods
AskAsync
Ask a question to the Knowledge Box and get a synchronous response with RAG (Retrieval-Augmented Generation).
Signature:
Task<ApiResponse<SyncAskResponse>> AskAsync(AskRequest request)
Parameters:
request(AskRequest, required): The ask request containing query and configuration
Returns: Complete response with answer, citations, and metadata
Example:
var askRequest = new AskRequest
{
Query = "What are the main benefits of using this system?"
};
var response = await searchService.AskAsync(askRequest);
if (response.IsSuccessful)
{
var result = response.Data;
Console.WriteLine($"Answer: {result.Answer}");
Console.WriteLine($"Citations: {result.Citations?.Count ?? 0}");
}
AskStreamAsync (with AskRequest)
Ask a question to the Knowledge Box and get a streaming response.
Signature:
IAsyncEnumerable<SyncAskResponseUpdate> AskStreamAsync(AskRequest request)
Parameters:
request(AskRequest, required): The ask request containing query and configuration
Returns: Streaming updates as they become available
Example:
var askRequest = new AskRequest(query) { Citations = new Citations(true) };
var result = client.Search.AskStreamAsync(askRequest);
string streamingResponse = string.Empty;
Dictionary<string, FindResource>? allResources;
IEnumerable<(int Number, KeyValuePair<string, int[][]> Item)>? citations;
await foreach (var response in result)
{
switch (response.Item)
{
case AnswerContent answer:
streamingResponse += answer.Text;
break;
case RetrievalContent retrieval:
allResources = retrieval.Results?.Resources;
break;
case CitationsContent c:
citations = c.Citations.Index(); // Index is optional, this adds an numeric index to the citations.
break;
}
}
AskStreamAsync (with query string)
Ask a question using default options and get a streaming response.
Signature:
IAsyncEnumerable<SyncAskResponseUpdate> AskStreamAsync(string query)
Parameters:
query(string, required): The question to ask
Returns: Streaming response updates
Example:
string streamingResponse = string.Empty;
await foreach (var update in searchService.AskStreamAsync("How do I configure authentication?"))
{
if (update.Item is AnswerContent answerContent)
{
streamingResponse += answerContent.Text;
}
}
FindAsync
Find resources in the Knowledge Box with detailed paragraph-level search results.
Signature:
Task<ApiResponse<KnowledgeboxFindResults>> FindAsync(FindRequest request)
Parameters:
request(FindRequest, required): The find request with search parameters
Returns: Detailed search results with paragraph-level information
Example:
var findRequest = new FindRequest
{
Query = "security implementation"
};
var response = await searchService.FindAsync(findRequest);
if (response.IsSuccessful)
{
var results = response.Data;
Console.WriteLine($"Found {results.Total} results");
foreach (var resource in results.Resources)
{
Console.WriteLine($"Resource: {resource.Title}");
}
}
CatalogAsync
List resources in the Knowledge Box using POST with JSON body.
Signature:
Task<ApiResponse<KnowledgeboxSearchResults>> CatalogAsync(CatalogRequest request)
Parameters:
request(CatalogRequest, required): The catalog request parameters
Returns: Resource catalog with filtering and pagination
Example:
var catalogRequest = new CatalogRequest
{
// Configure catalog parameters
};
var response = await searchService.CatalogAsync(catalogRequest);
if (response.IsSuccessful)
{
var catalog = response.Data;
Console.WriteLine($"Catalog contains {catalog.Total} resources");
}
SuggestAsync
Retrieve paragraph and entity suggestions for a query.
Signature:
Task<ApiResponse<KnowledgeboxSuggestResults>> SuggestAsync(string query)
Parameters:
query(string, required): The query to get suggestions for
Returns: Suggestions including paragraphs and entities
Example:
var response = await searchService.SuggestAsync("authentication");
if (response.IsSuccessful)
{
var suggestions = response.Data;
Console.WriteLine($"Found {suggestions.Paragraphs?.Count ?? 0} paragraph suggestions");
Console.WriteLine($"Found {suggestions.Entities?.Count ?? 0} entity suggestions");
}
SummarizeAsync
Summarize a set of resources using AI.
Signature:
Task<ApiResponse<SummarizedResponse>> SummarizeAsync(SummarizeRequest request)
Parameters:
request(SummarizeRequest, required): The summarization request with resources and options
Returns: AI-generated summary of the specified resources
Example:
var summarizeRequest = new SummarizeRequest
{
Resources = new[] { "resource-1", "resource-2" }
};
var response = await searchService.SummarizeAsync(summarizeRequest);
if (response.IsSuccessful)
{
var summary = response.Data;
Console.WriteLine($"Summary: {summary.Summary}");
}
GraphSearchAsync
Search Knowledge Box graph using triplets (vertex-edge-vertex).
Signature:
Task<ApiResponse<GraphSearchResponse>> GraphSearchAsync(GraphSearchRequest request)
Parameters:
request(GraphSearchRequest, required): Graph search parameters
Returns: Graph search results with relationships
Example:
var graphRequest = new GraphSearchRequest
{
Query = "security protocols"
};
var response = await searchService.GraphSearchAsync(graphRequest);
if (response.IsSuccessful)
{
var results = response.Data;
Console.WriteLine($"Found {results.Paths?.Count ?? 0} graph paths");
}
GraphNodesSearchAsync
Search Knowledge Box graph nodes (vertices).
Signature:
Task<ApiResponse<GraphNodesSearchResponse>> GraphNodesSearchAsync(GraphNodesSearchRequest request)
Parameters:
request(GraphNodesSearchRequest, required): Graph nodes search parameters
Returns: Graph nodes matching the search criteria
Example:
var nodesRequest = new GraphNodesSearchRequest
{
Query = "user authentication"
};
var response = await searchService.GraphNodesSearchAsync(nodesRequest);
if (response.IsSuccessful)
{
var nodes = response.Data;
Console.WriteLine($"Found {nodes.Nodes?.Count ?? 0} matching nodes");
}
GraphRelationsSearchAsync
Search Knowledge Box graph relations (edges).
Signature:
Task<ApiResponse<GraphRelationsSearchResponse>> GraphRelationsSearchAsync(GraphRelationsSearchRequest request)
Parameters:
request(GraphRelationsSearchRequest, required): Graph relations search parameters
Returns: Graph relations matching the search criteria
Example:
var relationsRequest = new GraphRelationsSearchRequest
{
Query = "implements"
};
var response = await searchService.GraphRelationsSearchAsync(relationsRequest);
if (response.IsSuccessful)
{
var relations = response.Data;
Console.WriteLine($"Found {relations.Relations?.Count ?? 0} matching relations");
}
SendFeedbackAsync
Send feedback for a search operation to improve future results.
Signature:
Task<ApiResponse<object>> SendFeedbackAsync(FeedbackRequest request)
Parameters:
request(FeedbackRequest, required): Feedback data including operation ID and rating
Returns: True if feedback was submitted successfully
Example:
var feedbackRequest = new FeedbackRequest
{
Ident = "operation-123",
Good = true,
Task = TaskType.Question
};
var response = await searchService.SendFeedbackAsync(feedbackRequest);
if (response.IsSuccessful)
{
Console.WriteLine("Feedback submitted successfully");
}
SearchAsync
Search Knowledge Box and retrieve separate results for documents, paragraphs, and sentences.
Signature:
Task<ApiResponse<KnowledgeboxSearchResults>> SearchAsync(SearchRequest request)
Parameters:
request(SearchRequest, required): Comprehensive search request parameters
Returns: Structured search results with multiple result types
Example:
var searchRequest = new SearchRequest
{
Query = "API documentation"
};
var response = await searchService.SearchAsync(searchRequest);
if (response.IsSuccessful)
{
var results = response.Data;
Console.WriteLine($"Documents: {results.Documents?.Count ?? 0}");
Console.WriteLine($"Paragraphs: {results.Paragraphs?.Count ?? 0}");
Console.WriteLine($"Sentences: {results.Sentences?.Count ?? 0}");
}
AskResourceAsync
Ask a question to a specific resource and get a synchronous response.
Signature:
Task<ApiResponse<SyncAskResponse>> AskResourceAsync(string resourceId, AskRequest request)
Parameters:
resourceId(string, required): The unique identifier of the resourcerequest(AskRequest, required): The ask request parameters
Returns: Answer specific to the resource
Example:
var askRequest = new AskRequest
{
Query = "What does this document explain?"
};
var response = await searchService.AskResourceAsync("my-resource-id", askRequest);
if (response.IsSuccessful)
{
var result = response.Data;
Console.WriteLine($"Resource-specific answer: {result.Answer}");
}
AskResourceStreamAsync (with AskRequest)
Ask a question to a specific resource and get a streaming response.
Signature:
IAsyncEnumerable<SyncAskResponseUpdate> AskResourceStreamAsync(string resourceId, AskRequest request)
Parameters:
resourceId(string, required): The unique identifier of the resourcerequest(AskRequest, required): The ask request parameters
Returns: Streaming response specific to the resource
Example:
var askRequest = new AskRequest
{
Query = "Summarize this document's main points"
};
await foreach (var update in searchService.AskResourceStreamAsync("my-resource-id", askRequest))
{
if (update.Item is AnswerContent answerContent && !string.IsNullOrEmpty(answerContent.Text))
{
Console.Write(answerContent.Text);
}
}
AskResourceStreamAsync (with query string)
Ask a question to a specific resource with simplified query.
Signature:
IAsyncEnumerable<SyncAskResponseUpdate> AskResourceStreamAsync(string resourceId, string query)
Parameters:
resourceId(string, required): The unique identifier of the resourcequery(string, required): The question to ask
Returns: Streaming response for the resource
Example:
await foreach (var update in searchService.AskResourceStreamAsync("my-resource-id", "What are the key features?"))
{
if (update.Item is AnswerContent answerContent && !string.IsNullOrEmpty(answerContent.Text))
{
Console.Write(answerContent.Text);
}
}
AskResourceBySlugAsync
Ask a question about a specific resource by slug synchronously.
Signature:
Task<ApiResponse<SyncAskResponse>> AskResourceBySlugAsync(string slug, AskRequest request)
Parameters:
slug(string, required): The slug identifier of the resourcerequest(AskRequest, required): The ask request parameters
Returns: Answer specific to the resource identified by slug
Example:
var askRequest = new AskRequest
{
Query = "What is the purpose of this document?"
};
var response = await searchService.AskResourceBySlugAsync("my-document-slug", askRequest);
if (response.IsSuccessful)
{
var result = response.Data;
Console.WriteLine($"Answer: {result.Answer}");
}
PredictProxyAsync
Proxy endpoint that forwards requests to the Predict API with Knowledge Box configuration.
Signature:
Task<ApiResponse<JsonElement>> PredictProxyAsync(PredictProxiedEndpoints endpoint)
Parameters:
endpoint(PredictProxiedEndpoints, required): The predict endpoint to call
Returns: Response from the predict API
Example:
var response = await searchService.PredictProxyAsync(PredictProxiedEndpoints.Tokens);
if (response.IsSuccessful)
{
var result = response.Data;
Console.WriteLine($"Predict API response: {result}");
}
SearchResourceAsync
Search within a specific resource by ID.
Signature:
Task<ApiResponse<ResourceSearchResults>> SearchResourceAsync(string resourceId, string query)
Parameters:
resourceId(string, required): The unique identifier of the resourcequery(string, required): The search query
Returns: Search results within the specified resource
Example:
var response = await searchService.SearchResourceAsync("my-resource-id", "configuration settings");
if (response.IsSuccessful)
{
var results = response.Data;
Console.WriteLine($"Found {results.Total} matches in resource");
foreach (var paragraph in results.Paragraphs ?? [])
{
Console.WriteLine($"Match: {paragraph.Text}");
}
}
Usage Notes
- All methods are asynchronous and return
ApiResponse<T>wrappers - Check
response.IsSuccessfulbefore accessingresponse.Data - Streaming methods return
IAsyncEnumerablefor real-time response processing - For streaming examples, add
using Progress.Nuclia.Model.Streaming;to accessAnswerContent - Ask methods provide RAG capabilities with citations and source information
- Graph search methods enable relationship-based queries
- Resource-specific methods limit scope to individual documents
- Feedback helps improve AI model performance over time