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) |
1.8.4+ |
| Node.js | reveal-sdk-node-ai (npm) |
2.0.0+ |
| Java | io.revealbi:reveal-sdk-ai (Maven) |
2.0.0+ |
- ✅ Reveal SDK v1.8.4+ 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.
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",
"ModelId": "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",
"ModelId": "claude-sonnet-4-5"
}
}
}Tip: Store your API key in User Secrets rather than committing it to source control.
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": {
"OpenAI": {
"ApiKey": "OPENAI_API_KEY",
"ModelId": "gpt-4-turbo"
},
"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
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:5000/api/reveal/ai/metadata/statusExpected Response (once system is ready):
{
"status": "Completed",
"isInitialized": true
}- ✅ Reveal 2.0.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/apiPass your LLM provider settings via the settings option when registering the plugin (see Step 3). 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.
Add the AI plugin to your RevealOptions, passing the settings object and a defaultProvider:
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
node server.jsOnce running, verify the AI endpoint:
curl -X GET http://localhost:5111/api/reveal/ai/metadata/statusExpected Response:
{
"status": "Completed",
"isInitialized": true
}- ✅ Reveal 2.0.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.0.6-SNAPSHOT</version>
</dependency>
</dependencies>Then run:
mvn installPass your LLM provider settings via the additionalOptions map when creating RevealAIPluginOptions (see Step 3). 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.
Add 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 JSONMetadataManagerOptions– output directory for generated metadataContextManagerOptions– (nullable) context manager configadditionalOptions– map containing"settings"with your provider config
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
mvn spring-boot:runOnce running, verify the AI endpoint:
curl -X GET http://localhost:5111/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:5000'
});
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 - LLM provider configured in
appsettings.json(OpenAI or Anthropic) - Metadata catalog configured (datasource list)
-
AddRevealAI()registered inProgram.cs - Application builds without errors
- Metadata files generated in
reveal/ai/metadata/ -
GET /api/reveal/ai/metadata/statusreturnsisInitialized: true
-
reveal-sdk-node-ainpm package installed - LLM provider settings passed via
settingsoption inwithOptions()(lowercase provider keys) -
defaultProviderset inwithOptions()(e.g.'openai'or'anthropic') - Metadata catalog JSON file configured with datasource list
-
revealAI.withOptions(...)added toRevealOptions.plugins - Application starts without errors
-
GET /api/reveal/ai/metadata/statusreturnsisInitialized: true
-
io.revealbi:reveal-sdk-aiMaven dependency added (with Reveal Maven repositories) - LLM provider settings passed via
additionalOptionsinRevealAIPluginOptions(lowercase provider keys) -
defaultProviderset as first argument toRevealAIPluginOptionsconstructor - Metadata catalog JSON file configured with datasource list
-
RevealAIPlugin.withOptions(aiPluginOptions, callbacks)added viaRevealServerBuilder.addPlugin() - Application builds and starts without errors
-
GET /api/reveal/ai/metadata/statusreturnsisInitialized: true