Просто для сравнения:
Без SK:
var messages = new List<ChatMessage> { new("user", prompt) };
while (true)
{
var response = await openAiClient.Chat.CreateAsync(
new() { Model = "gpt-4o", Messages = messages, Tools = tools });
if (response.FinishReason == "stop") break; // задача решена
// достаём все запрошенные тул-вызовы
foreach (var toolCall in response.ToolCalls)
{
var result = toolCall.Name switch
{
"CreatePullRequest" => await github.CreatePR(toolCall.Args),
"ReadFile" => await github.ReadFile(toolCall.Args),
"CreateBranch" => await github.CreateBranch(toolCall.Args),
_ => throw new Exception($"Unknown tool: {toolCall.Name}")
};
messages.Add(new("tool", result, toolCall.Id));
}
// и снова идём в LLM — пока он не скажет stop
}
С SK:
kernel.Plugins.AddFromObject(new GitHubPlugin(token), "GitHub");
var settings = new OpenAIPromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};
await chat.GetChatMessageContentAsync(prompt, settings, kernel);
Весь этот while-loop, switch по именам тулов и склейка результатов обратно в messages — это и есть то что SK делает за тебя. И это просто капец как удобно!