Loading...
Loading...
Use SqlClient for raw SQL against mapped dataset aliases and parse columnar SQL responses safely.
npx skill4agent add stahura/domo-ai-vibe-rules cap-apps-sql-queryAIClient.text_to_sqlSqlClient@domoinc/toolkitdomo.post('/sql/v1/')SqlClientmanifest.jsonimport { SqlClient } from '@domoinc/toolkit';
const sqlClient = new SqlClient();get(alias, query)const result = await sqlClient.get('datasetAlias', 'SELECT * FROM datasetAlias');aliasstringmanifest.jsonquerystringPromise<Response<SqlResponse>>parsePageFilters(datasets, produceClauses?)// Get predicates as objects
const predicates = sqlClient.parsePageFilters(['datasetAlias']);
// Get predicates as WHERE/HAVING clause strings
const clauses = sqlClient.parsePageFilters(['datasetAlias'], true);// Response shape:
{
columns: ['vendor', 'Total Spend'],
rows: [
['Sysco Utah', 1880794.74],
['Intermountain Meats', 809389.15]
],
metadata: [...],
numRows: 8,
numColumns: 2,
datasource: 'dataset-uuid',
fromcache: true
}columnsrowsconst result = await sqlClient.get('myAlias', sql);
const res = result?.body || result?.data || result;
const colNames: string[] = res?.columns || [];
const rawRows: unknown[][] = res?.rows || [];
const rows = rawRows.map((row) => {
const obj: Record<string, unknown> = {};
colNames.forEach((col, i) => {
obj[col] = row[i];
});
return obj;
});
// rows => [{ vendor: 'Sysco Utah', 'Total Spend': 1880794.74 }, ...]AIClientSqlClientimport { AIClient, SqlClient } from '@domoinc/toolkit';
// 1) Generate SQL from natural language
const aiResponse = await AIClient.text_to_sql(question, [
{
dataSourceName: 'myAlias',
description: 'Description of the dataset',
columns: [
{ name: 'vendor', type: 'string' },
{ name: 'amount', type: 'number' }
]
}
]);
const responseBody = aiResponse.data || aiResponse.body || aiResponse;
const sql = responseBody.output || responseBody.choices?.[0]?.output;
// 2) Execute SQL
const sqlClient = new SqlClient();
const result = await sqlClient.get('myAlias', sql);
// 3) Parse columnar response into row objects
const res = result?.body || result?.data || result;
const colNames: string[] = res?.columns || [];
const rawRows: unknown[][] = res?.rows || [];
const rows = rawRows.map((row) => {
const obj: Record<string, unknown> = {};
colNames.forEach((col, i) => {
obj[col] = row[i];
});
return obj;
});SqlClientdomo.post('/sql/v1/')parsePageFilters()FROMSELECT * FROM vendorPaymentscolumnsrows.body.data