This guide will walk you through setting up the Reveal AI Add-On in your existing Reveal SDK application.
Time to Complete: 30-45 minutes
| Platform | Package | Minimum Reveal Version |
|---|---|---|
| ASP.NET Core (C#) | Reveal.Sdk.AI.AspNetCore (NuGet) |
2.1.0+ |
| Node.js | reveal-sdk-node-ai (npm) |
2.1.0+ |
| Java | io.revealbi:reveal-sdk-ai (Maven) |
2.1.0+ |
- ✅ Reveal SDK v2.1.0+ installed and working in your ASP.NET Core app
- ✅ .NET 8.0 SDK installed
- ✅ LLM Provider account (OpenAI or Anthropic recommended)
- ✅ At least one datasource configured in Reveal SDK
Using .NET CLI:
cd YourProject
dotnet add package Reveal.Sdk.AI.AspNetCore
dotnet buildUsing Visual Studio:
- Right-click on your project in Solution Explorer
- Select "Manage NuGet Packages"
- Select the "Browse" tab
- Search for
Reveal.Sdk.AI.AspNetCore - Click "Install"
If using the JavaScript API:
npm install @revealbi/apiSee the @revealbi/api npm package README for client-side usage.
Update your Program.cs:
using Reveal.Sdk.AI;
var builder = WebApplication.CreateBuilder(args);
// Your existing Reveal SDK setup
builder.Services.AddControllers()
.AddReveal(revealBuilder =>
{
revealBuilder
.AddAuthenticationProvider<AuthenticationProvider>()
.AddDataSourceProvider<DataSourceProvider>()
.AddUserContextProvider<UserContextProvider>();
});
// Add Reveal AI services
builder.Services.AddRevealAI()
.AddOpenAI()
.UseMetadataCatalogFile("config/catalog.json");
var app = builder.Build();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();The AI needs metadata about your datasources. Add to appsettings.json:
{
"RevealAI": {
"MetadataService": {
"GenerateOnStartup": true
}
}
}Then list your configured datasources in your metadata catalog file (e.g. config/catalog.json):
{
"Datasources": [
{
"id": "my-datasource-id",
"provider": "SQLServer"
}
]
}Supported Providers: AmazonAthena, MySQL, Oracle, OracleSID, PostgreSQL, SSAS, SSASHTTP, Snowflake, SQLServer, WebService
Choose OpenAI (recommended for quick setup) or Anthropic Claude.
Get API Key:
- Visit OpenAI Platform
- Create an API key (starts with
sk-)
Configure in appsettings.json:
{
"RevealAI": {
"DefaultClient": "openai",
"OpenAI": {
"ApiKey": "sk-your-api-key-here",
"Model": "gpt-4.1"
}
}
}Get API Key:
- Visit Anthropic Console
- Create an API key (starts with
sk-ant-)
Configure in appsettings.json:
{
"RevealAI": {
"DefaultClient": "anthropic",
"Anthropic": {
"ApiKey": "sk-ant-your-api-key-here",
"Model": "claude-sonnet-4-5"
}
}
}Tip: Store your API key in User Secrets rather than committing it to source control.
Start your application:
dotnet runWatch console output for metadata generation:
MetadataGenerationHostedService starting
Triggering metadata initialization on startup
...
Generating metadata for datasource my-datasource-id
Enriching metadata for datasource my-datasource-id
...
Metadata initialization completed. Metadata is now ready.
Startup metadata initialization completed
Verify metadata files were created:
# Windows
dir %localappdata%\reveal\ai\metadata\
# Linux
ls ~/.local/share/reveal/ai/metadata/
# Mac
ls ~/Library/Application\ Support/reveal/ai/metadataYou should see files like:
my-datasource-id_index.jsonmy-datasource-id_MyDB_Orders.json- etc.
curl -X GET http://localhost:5112/api/reveal/ai/metadata/statusExpected Response (once system is ready):
{
"status": "Completed",
"isInitialized": true
}- ✅ Reveal 2.1.0+ (
reveal-sdk-node) installed and working - ✅ Node.js 16+
- ✅ LLM Provider account (OpenAI or Anthropic recommended)
- ✅ At least one datasource configured in Reveal SDK
npm install reveal-sdk-node-ainpm install @revealbi/apiAdd the AI plugin to your RevealOptions, passing the settings object and a defaultProvider. The metadata catalog referenced here is configured in Step 3, and provider settings are described in Step 4.
const reveal = require('reveal-sdk-node');
const revealAI = require('reveal-sdk-node-ai');
const path = require('path');
const os = require('os');
// Load your AI provider settings from your preferred config source
const aiSettings = {
openai: { apiKey: process.env.OPENAI_API_KEY, model: 'gpt-4.1' }
};
const revealOptions = {
// ... your existing Reveal options
plugins: [
revealAI.withOptions({
defaultProvider: 'openai',
settings: aiSettings,
metadataCatalogFile: path.resolve(__dirname, 'Reveal', 'Metadata', 'catalog.json'),
metadataManager: {
outputPath: path.resolve(os.homedir(), 'AImetadata'),
},
callbacks: {
contextManagerProvider: async (userContext, message) => {
return '';
},
aiProvider: async (userContext, message) => {
return '';
}
}
})
]
};Create a metadata catalog JSON file listing your datasources (same format as C#):
{
"Datasources": [
{
"Id": "my-datasource-id",
"Provider": "SQLServer"
}
]
}Supported Providers: AmazonAthena, MySQL, Oracle, OracleSID, PostgreSQL, SSAS, SSASHTTP, Snowflake, SQLServer, WebService
Pass your LLM provider settings via the settings option when registering the plugin. The settings object uses lowercase provider keys:
{
"openai": {
"apiKey": "sk-your-api-key-here",
"model": "gpt-4.1"
}
}{
"anthropic": {
"apiKey": "sk-ant-your-api-key-here",
"model": "claude-sonnet-4-5"
}
}Tip: Load these settings from a secure source (environment variables, a secrets manager, or a local config file) and pass them at startup.
node server.jsOnce running, verify the AI endpoint:
curl -X GET http://localhost:5112/api/reveal/ai/metadata/statusExpected Response:
{
"status": "Completed",
"isInitialized": true
}- ✅ Reveal 2.1.0+ (
io.revealbi:reveal-sdk-servletor Spring equivalent) installed and working - ✅ Java 17+
- ✅ Maven 3.6+
- ✅ LLM Provider account (OpenAI or Anthropic recommended)
- ✅ At least one datasource configured in Reveal SDK
Add the Reveal Maven repository and dependency to your pom.xml:
<repositories>
<repository>
<id>reveal.snapshots</id>
<url>https://maven.revealbi.io/repository/snapshots</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>io.revealbi</groupId>
<artifactId>reveal-sdk-ai</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>Then run:
mvn installAdd the AI plugin when building your RevealServer. The RevealAIPluginOptions constructor takes:
defaultProvider– the provider name (e.g."openai"or"anthropic")metadataCatalogFile– path to your catalog JSON, configured in Step 3MetadataManagerOptions– output directory for generated metadataContextManagerOptions– (nullable) context manager configadditionalOptions– map containing"settings"with your provider config, described in Step 4
The plugin also accepts an optional callbacks map as a second argument to withOptions():
import io.revealbi.ai.RevealAIPlugin;
import io.revealbi.ai.RevealAIPluginOptions;
import io.revealbi.core.IRevealServer;
import io.revealbi.core.RevealPluginCallback;
import io.revealbi.core.RevealServerBuilder;
import java.nio.file.Path;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
// Load your AI provider settings from your preferred config source
Map<String, Object> aiSettings = Map.of(
"openai", Map.of("apiKey", System.getenv("OPENAI_API_KEY"), "model", "gpt-4.1")
);
RevealAIPluginOptions aiPluginOptions = new RevealAIPluginOptions(
"openai",
Path.of("src", "main", "resources", "Reveal", "Metadata", "catalog.json")
.toAbsolutePath().normalize().toString(),
new RevealAIPluginOptions.MetadataManagerOptions(
Path.of(System.getProperty("user.home"), "AImetadata").toString()),
null,
Map.of("settings", aiSettings));
// Optional callbacks
Map<String, RevealPluginCallback> callbacks = Map.of(
"contextManagerProvider", (userContext, message) ->
CompletableFuture.completedFuture(""),
"aiProvider", (userContext, message) ->
CompletableFuture.completedFuture("")
);
IRevealServer revealServer = new RevealServerBuilder()
.setDataSourceProvider(dataSourceProvider)
.addPlugin(RevealAIPlugin.withOptions(aiPluginOptions, callbacks))
.build();Create a metadata catalog JSON file listing your datasources (same format as C#):
{
"Datasources": [
{
"Id": "my-datasource-id",
"Provider": "SQLServer"
}
]
}Supported Providers: AmazonAthena, MySQL, Oracle, OracleSID, PostgreSQL, SSAS, SSASHTTP, Snowflake, SQLServer, WebService
Pass your LLM provider settings via the additionalOptions map when creating RevealAIPluginOptions. The settings map uses lowercase provider keys:
{
"openai": {
"apiKey": "sk-your-api-key-here",
"model": "gpt-4.1"
}
}{
"anthropic": {
"apiKey": "sk-ant-your-api-key-here",
"model": "claude-sonnet-4-5"
}
}Tip: Load these settings from a secure source (environment variables, a secrets manager, or a local config file) and pass them at startup.
mvn spring-boot:runOnce running, verify the AI endpoint:
curl -X GET http://localhost:5112/api/reveal/ai/metadata/statusExpected Response:
{
"status": "Completed",
"isInitialized": true
}If you want to use the JavaScript/TypeScript API for insights and chat in your web application:
npm install @revealbi/apiOr use the CDN:
<script src="https://cdn.jsdelivr.net/npm/@revealbi/api/dist/index.umd.js"></script>import { RevealSdkClient } from '@revealbi/api';
// Initialize once at app startup
RevealSdkClient.initialize({
hostUrl: 'http://localhost:5112'
});
const client = RevealSdkClient.getInstance();// Non-streaming: send a message and wait for the complete response
const response = await client.ai.chat.sendMessage({
message: 'Show me total sales by region',
datasourceId: 'my-datasource-id',
});
console.log('AI Response:', response.explanation);
if (response.dashboard) {
// Load the generated/modified dashboard
loadDashboard(response.dashboard);
}
// Streaming: get real-time text chunks
const stream = await client.ai.chat.sendMessage({
message: 'Create a dashboard showing revenue trends',
datasourceId: 'my-datasource-id',
stream: true,
});
stream.on('progress', (message) => console.log('Status:', message));
stream.on('text', (content) => appendToUI(content));
stream.on('error', (error) => console.error(error));
const result = await stream.finalResponse();
if (result.dashboard) {
loadDashboard(result.dashboard);
}
// Editing an existing dashboard
const editResponse = await client.ai.chat.sendMessage({
message: 'Add a date filter to this dashboard',
datasourceId: 'my-datasource-id',
dashboard: revealView.dashboard,
});
// Reset conversation context
await client.ai.chat.resetContext();// Non-streaming: get a summary for a dashboard
const insight = await client.ai.insights.get({
dashboardId: 'my-dashboard',
type: 'summary', // 'summary' | 'analysis' | 'forecast'
});
console.log('Insight:', insight.explanation);
// Streaming: get real-time text chunks
const stream = await client.ai.insights.get({
dashboard: revealView.dashboard,
type: 'analysis',
stream: true,
});
stream.on('text', (content) => appendToUI(content));
const result = await stream.finalResponse();
console.log('Complete:', result.explanation);
// Visualization-level insight
const vizInsight = await client.ai.insights.get({
dashboard: revealView.dashboard,
visualizationId: 'sales-chart',
type: 'analysis',
});
// Forecast with custom periods
const forecast = await client.ai.insights.get({
dashboardId: 'my-dashboard',
type: 'forecast',
forecastPeriods: 12,
});For complete API documentation and advanced usage, see the @revealbi/api npm package README.
- NuGet package
Reveal.Sdk.AI.AspNetCoreinstalled -
AddRevealAI()registered inProgram.cs - Metadata catalog configured (datasource list)
- LLM provider configured in
appsettings.json(OpenAI or Anthropic) - Application builds without errors
- Metadata files generated in
reveal/ai/metadata/ -
GET /api/reveal/ai/metadata/statusreturnsisInitialized: true
-
reveal-sdk-node-ainpm package installed -
revealAI.withOptions(...)added toRevealOptions.plugins - Metadata catalog JSON file configured with datasource list
- LLM provider settings passed via
settingsoption inwithOptions()(lowercase provider keys) -
defaultProviderset inwithOptions()(e.g.'openai'or'anthropic') - Application starts without errors
-
GET /api/reveal/ai/metadata/statusreturnsisInitialized: true
-
io.revealbi:reveal-sdk-aiMaven dependency added (with Reveal Maven repositories) -
RevealAIPlugin.withOptions(aiPluginOptions, callbacks)added viaRevealServerBuilder.addPlugin() - Metadata catalog JSON file configured with datasource list
- LLM provider settings passed via
additionalOptionsinRevealAIPluginOptions(lowercase provider keys) -
defaultProviderset as first argument toRevealAIPluginOptionsconstructor - Application builds and starts without errors
-
GET /api/reveal/ai/metadata/statusreturnsisInitialized: true