Als kleine Fingerübung dachte ich mir, dass eine Visual Studio Extension gut wäre die Code erklärt – dank OpenAI sollte das ja kein Problem sein.
War es auch nicht.
Zuerst installierte ich das Extensibilty Template Pack 2022 für Visual Studio 2022.
Danach konnte es beginnen:
Als erstes fügte ich ein Tool Window hinzu. Ein Toolwindow ist im Prinzip nichts anderes als eine XAML User control und eine Klasse die von BaseToolWindow ableitet
public class ExplicareToolWindow : BaseToolWindow<ExplicareToolWindow>
{
public override string GetTitle(int toolWindowId) => "Explicare";
public override Type PaneType => typeof(Pane);
public override async Task<FrameworkElement> CreateAsync(int toolWindowId, CancellationToken cancellationToken)
{
var dte = await Package.GetServiceAsync(typeof(EnvDTE.DTE)) as EnvDTE80.DTE2;
return new ExplicareToolWindowControl(dte,Package);
}
[Guid("b8381bcb-59d1-4b5c-9951-fdbfb44990c9")]
internal class Pane : ToolWindowPane
{
public Pane()
{
BitmapImageMoniker = KnownMonikers.ToolWindow;
}
}
}
ExplicareToolWindowControl(dte,Package); ist die eigentliche UserControl – in der wir beliebige UI Elemente einbauen können.
Ich habe jetzt nur einen Button eingebaut den ich „Explain to me“ genannt habe.
Schnell und Schmutzig im Code-Behind ein Button Click Event gemacht.
Nun den Text aus dem Visual Studio Editor auslesen dies geschieht mit:
var textSelection = (TextSelection)MyDTE.ActiveDocument.Selection;
if (String.IsNullOrEmpty(textSelection.Text))
{
TextDocument doc = (TextDocument)(MyDTE.ActiveDocument.Object("TextDocument"));
var p = doc.StartPoint.CreateEditPoint();
TextToExplain = p.GetText(doc.EndPoint);
}
else
{
TextToExplain = textSelection.Text;
}
So das schwierigste habe ich hinter mir nun noch einen Aufruf des OpenAI API aufrufen. Das geht eigentlich ganz einfach
var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");
var response = client.PostAsync("https://api.openai.com/v1/completions", content).Result;
if (response.IsSuccessStatusCode)
{
string responseStr = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<OpenAIResponse>(responseStr);
explained = result.choices[0].text;
}
else
{
throw new BadRequestExecption();
}
Den ganzen Source ist auf Git Hub gpiwonka/Explicare: A small extension for Visual Studio to better understand code using OpenAI. (github.com)
Gibt es auch als Extension: Explicare – Visual Studio Marketplace
Schreibe einen Kommentar