TGViewer
C# Short Posts 🔞 C# Short Posts 🔞 @dimasshortposts · 306 subscribers
Post #377 543
🤖 Semantic Kernel, часть 1: если ты хочешь написать мини-агента за две строчки кода.

У нас сейчас есть задачка — при открытии стран надо модифицировать несколько проектов: добавить свитч-кейсы, прописать новые значения в нужных местах и сделать ПРы.

Идея – эту задачку выпнуть как-то на LLM. Звучит просто, но как представляешь себе реализацию — сразу ощущение надвигающейся геморройной жести с ифчиками и парсингом ответов от LLM.

А хочется, чтобы LLM сам решал, что делать: прочитать файл, создать ветку, закоммитить изменения, открыть PR. Но в голове сразу картинка: парсишь ответ от LLM, руками вызываешь нужную библиотеку, обрабатываешь результат, снова что-то парсишь. Руки опускались ещё на этапе проектирования.

А потом я наткнулся на Semantic Kernel. Про который много слышал, но не понимал что это.

Так вот! Фактически – это мини-агент который можно дергать через бэк. Типа мини-курсор или мини-копайлот.

Идея простая:

1️⃣ Ты описываешь инструменты — обычные C# методы, которые дергают апишки (к примеру гитхабовские) с атрибутом [KernelFunction] и Description.

2️⃣ SK подпихивает эти методы LLMке. Через рефлексию и вот это все.

3️⃣ Дальше запускается маленький агентный цикл: SK делает вызов, возвращает результат обратно в контекст — и так по кругу пока задача не решена.

И все это за вас! Написать агентный цикл в целом тот еще гемор, а тут все готово.

Вот так регаем инструмент:

[KernelFunction, Description("Создаёт pull request в репозитории")]
public async Task<string> CreatePullRequest(
[Description("Владелец репозитория")] string owner,
[Description("Название репозитория")] string repo,
[Description("Заголовок pull request")] string title,
[Description("Описание pull request")] string body,
[Description("Ветка с изменениями")] string headBranch,
[Description("Целевая ветка")] string baseBranch = "main")
{
var pr = await _client.PullRequest.Create(owner, repo,
new NewPullRequest(title, headBranch, baseBranch) { Body = body });
return $"PR создан: {pr.HtmlUrl}";
}


Вот так вызываем промпт:

var kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion("gpt-4o", openAiKey)
.Build();

kernel.Plugins.AddFromObject(new GitHubPlugin(githubToken), "GitHub");

var settings = new OpenAIPromptExecutionSettings
{
FunctionChoiceBehavior = FunctionChoiceBehavior.Auto()
};


Дальше говоришь агенту: «отредактируй README.md в owner/repo, добавь раздел Installation, создай PR» — и он сам читает файл, создаёт ветку, коммитит изменения и открывает PR. Без единого ифчика с твоей стороны.

Вот тут можете посмотреть как это все работает: https://github.com/Undermove/csharpshortpostsexamples/tree/main/SemanticKernelExample.

🅰️ Итого: Если у вас есть ощущение, что вы хотите на бэке иметь под некоторые задачи мини-агента, который бы взаимодействовал с апишками, то попробуйте Semantic Kernel в качестве обертки.
GitHub csharpshortpostsexamples/SemanticKernelExample at main · Undermove/csharpshortpostsexamples Code examples for C# Short Posts Channel. Contribute to Undermove/csharpshortpostsexamples development by creating an account on GitHub.
More from @dimasshortposts
  1. Sep 26, 2026🧵 Тредик для вопросов по докладу про MAF на дотнексте В докладе многие подробности опусти…
  2. Sep 23, 2026Даже самым хардкорным ребятам надо отдыхать, так что отдыхаем, мои чюваки 🕺 🧑‍💻dp🥁 #he…
  3. Sep 16, 2026🎯 Instrumented Tier0: профилирование кода В прошлый раз мы разобрали два уровня компиляци…
  4. Sep 15, 2026🔜 Готовлюсь к DOTNEXT 2026 В прошлом году за две недели до выступления я зачитывал свой д…
  5. Sep 9, 2026C# Short Posts 🔞 pinned «🐸 О чём этот канал? Кажется, я уже достаточно давно веду этот к…
  6. Sep 9, 2026🐸 О чём этот канал? Кажется, я уже достаточно давно веду этот канальчик, и пора бы описат…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →