Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save chris1642/85cf3fbb723fe322b155d6ee0f28c331 to your computer and use it in GitHub Desktop.
Save chris1642/85cf3fbb723fe322b155d6ee0f28c331 to your computer and use it in GitHub Desktop.
Update Selected Tabular Model Descriptions from ChatGPT with rate limiting logic
#r "System.Net.Http"
using System.Net.Http;
using System.Text;
using Newtonsoft.Json.Linq;
// You need to signin to https://platform.openai.com/ and create an API key for your profile then paste that key
// into the apiKey constant below
const string apiKey = "YOUR API KEY HERE";
const string uri = "https://api.openai.com/v1/completions";
const string question = "Explain the following calculation in a few sentences in simple business terms without using DAX function names:\n\n";
const int oneMinute = 60000; // the number of milliseconds in a minute
const int apiLimit = 20; // a free account is limited to 20 calls per minute, change this if you have a paid account
const bool dontOverwrite = true; // this prevents existing descriptions from being overwritten
using (var client = new HttpClient()) {
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + apiKey);
int callCount = 0;
foreach (var m in Selected.Measures) //This calls out only selected measures and does not run through the entire model (helping prevent errors)
{
// if we are not overwriting existing descriptions then skip to the
// next measure if this one is not an empty string
if (dontOverwrite && !string.IsNullOrEmpty(m.Description)) {continue; }
// Only uncomment the following when running from the command line or the script will
// show a popup after each measure
//Info("Processing " + m.DaxObjectFullName)
//var body = new requestBody() { prompt = question + m.Expression };
var body =
"{ \"prompt\": " + JsonConvert.SerializeObject(question + m.Expression ) +
",\"model\": \"text-davinci-003\" " +
",\"temperature\": 1 " +
",\"max_tokens\": 2048 " +
",\"stop\": \".\" }";
var res = client.PostAsync(uri, new StringContent(body, Encoding.UTF8,"application/json"));
res.Result.EnsureSuccessStatusCode();
var result = res.Result.Content.ReadAsStringAsync().Result;
var obj = JObject.Parse(result);
var desc = obj["choices"][0]["text"].ToString().Trim();
m.Description = desc + "\n=====\n" + m.Expression;
callCount++; // increment the call count
if ( callCount % apiLimit == 0) System.Threading.Thread.Sleep( oneMinute );
}
}
@chris1642
Copy link
Author

chris1642 commented Mar 1, 2023

This updates the logic to have an option only do this on the selected measures compared to the entire model. I was getting errors and it not working at all for our model, regardless of the do not overwrite.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment