☝️ Уже сегодня: ИИ-агенты в продакшене — инженерный подход к интеграции LLM
Индустрия активно обсуждает потенциал нейросетей, способных автоматизировать бизнес-процессы и заменить целые отделы. Однако реальное внедрение агентов в
Сегодня в 19:00 МСК в рамках нашего курса «Разработка AI-агентов» мы проведём открытый вебинар «ИИ-агенты в продакшене: от хайпа к деньгам». Спикер — Полина Полунина, руководитель AI-направления в Альфа-Банке. Будем говорить о нейросетях с позиции жёсткой инженерии.
Разберём три реальных кейса из сурового банковского энтерпрайза, напишем и запустим агента прямо в эфире, честно обсудим грабли, на которые наступает бизнес при интеграции
Тем, кто придёт на эфир, дадим промокод AGENTS на скидку 10 000 ₽ на любой тариф курса.
👉 Занять место на вебинаре
Индустрия активно обсуждает потенциал нейросетей, способных автоматизировать бизнес-процессы и заменить целые отделы. Однако реальное внедрение агентов в
production вскрывает серьёзные проблемы: разработчикам приходится бороться с непредсказуемыми галлюцинациями моделей, нестабильными API и сложной интеграцией в существующую архитектуру.Сегодня в 19:00 МСК в рамках нашего курса «Разработка AI-агентов» мы проведём открытый вебинар «ИИ-агенты в продакшене: от хайпа к деньгам». Спикер — Полина Полунина, руководитель AI-направления в Альфа-Банке. Будем говорить о нейросетях с позиции жёсткой инженерии.
Разберём три реальных кейса из сурового банковского энтерпрайза, напишем и запустим агента прямо в эфире, честно обсудим грабли, на которые наступает бизнес при интеграции
LLM.Тем, кто придёт на эфир, дадим промокод AGENTS на скидку 10 000 ₽ на любой тариф курса.
👉 Занять место на вебинаре
❤1
⏳ Часовая готовность: создаём ИИ-агента в прямом эфире
В 19:00 МСК в рамках нашего курса «Разработка AI-агентов» стартует вебинар «ИИ-агенты в продакшене: от хайпа к деньгам». Спикер — Полина Полунина, руководитель AI-направления в Альфа-Банке.
Будет live-демо работающего агента, реальные метрики из корпоративной среды и честный разбор архитектурных граблей — без воды и «успешного успеха».
Всем зрителям эфира дадим эксклюзивный промокод AGENTS на скидку 10 000 ₽ на любой тариф курса.
👉 Занять место на вебинаре
В 19:00 МСК в рамках нашего курса «Разработка AI-агентов» стартует вебинар «ИИ-агенты в продакшене: от хайпа к деньгам». Спикер — Полина Полунина, руководитель AI-направления в Альфа-Банке.
Будет live-демо работающего агента, реальные метрики из корпоративной среды и честный разбор архитектурных граблей — без воды и «успешного успеха».
Всем зрителям эфира дадим эксклюзивный промокод AGENTS на скидку 10 000 ₽ на любой тариф курса.
👉 Занять место на вебинаре
Один из способов незаметно нагрузить хип — захватить локальную переменную внутри лямбды:
int threshold = 10;
var query = items.Where(x => x > threshold);
Код читается легко. Но когда лямбда захватывает threshold, компилятор может сгенерировать объект-замыкание для хранения этого состояния. Microsoft явно документирует static-лямбды как способ запретить захват и предотвратить лишние аллокации.
Почему это проблема
В обычном коде это, как правило, не критично. Но на горячем пути повторное создание замыканий превращается в постоянный трафик на куче. GC начинает работать чаще, а производительность становится непредсказуемой и всё это из-за одной строки, которая выглядит абсолютно безобидно.
Как исправить
Если захват не нужен, скажите об этом явно:
var query = items.Where(static x => x > 10);
Или вынесите логику в отдельный метод:
static bool IsAbove(int x, int threshold) => x > threshold;
Если лямбда находится на горячем пути, смотрите на неё глазами performance-инженера, а не просто читателя кода. Захват состояния это повод насторожиться.
📍 Навигация: Вакансии • Задачи • Собесы
#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍3
🔄 .NET 11 Preview 2
Вышел второй превью .NET 11. Пока это не финальный релиз, но уже есть что посмотреть.
Самое заметное в этом превью — работа над производительностью на нескольких уровнях одновременно.
• В рантайме появился Runtime Async V2.
Это переработанная реализация асинхронности на уровне самого рантайма, не на уровне компилятора. Цель — убрать лишние аллокации и сделать работу async/await дешевле по ресурсам.
• SDK стал немного меньше.
Установщики для Linux и macOS сократились в размере. Плюс обновили анализаторы кода и добавили новые предупреждения при сборке.
• F# в этом превью получил несколько практичных вещей.
Кэширование при разрешении перегрузок должно ускорить компиляцию в проектах с большим количеством overload-ов.
Упростили иерархии DIM-интерфейсов, добавили директиву #elif и функцию partitionWith для коллекций.
• В Entity Framework Core добавили поддержку LINQ операторов MaxBy и MinBy. Для SQL Server появилась поддержка DiskANN векторных индексов и
• MAUI тоже не обошли стороной. Улучшили работу карт, ускорили TypedBinding, добавили аннотации неизменяемости для Color и Font. Для Android теперь минимально требуется API 24.
➡️ Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#пульс_индустрии
Вышел второй превью .NET 11. Пока это не финальный релиз, но уже есть что посмотреть.
Самое заметное в этом превью — работа над производительностью на нескольких уровнях одновременно.
• В рантайме появился Runtime Async V2.
Это переработанная реализация асинхронности на уровне самого рантайма, не на уровне компилятора. Цель — убрать лишние аллокации и сделать работу async/await дешевле по ресурсам.
• SDK стал немного меньше.
Установщики для Linux и macOS сократились в размере. Плюс обновили анализаторы кода и добавили новые предупреждения при сборке.
• F# в этом превью получил несколько практичных вещей.
Кэширование при разрешении перегрузок должно ускорить компиляцию в проектах с большим количеством overload-ов.
Упростили иерархии DIM-интерфейсов, добавили директиву #elif и функцию partitionWith для коллекций.
• В Entity Framework Core добавили поддержку LINQ операторов MaxBy и MinBy. Для SQL Server появилась поддержка DiskANN векторных индексов и
VECTOR_SEARCH().• MAUI тоже не обошли стороной. Улучшили работу карт, ускорили TypedBinding, добавили аннотации неизменяемости для Color и Font. Для Android теперь минимально требуется API 24.
📍 Навигация: Вакансии • Задачи • Собесы
#пульс_индустрии
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4👍3❤2🤩1
Рабочие документы почти всегда содержат что-то личное. Имена, номера паспортов, банковские счета, налоговые идентификаторы — всё это регулярно оседает в PDF-файлах и других документах.
Cloudmersive предлагает DLP API с поддержкой .NET, который работает через AI-модель с наложением сетки на документ.
Вы сами указываете, какие типы данных считать недопустимыми, API находит их в документе и закрашивает или удаляет. При этом в ответе возвращается и сам отредактированный файл, и полный отчёт о том, что именно было найдено.
Установка:
Install-Package Cloudmersive.APIClient.NETCore.DLP -Version 1.1.0
Сам вызов выглядит так:
using Cloudmersive.APIClient.NETCore.DLP.Api;
using Cloudmersive.APIClient.NETCore.DLP.Client;
using Cloudmersive.APIClient.NETCore.DLP.Model;
Configuration.Default.AddApiKey("Apikey", "YOUR_API_KEY");
var apiInstance = new RedactApi();
var body = new DlpDocumentRedactionRequest();
DlpDocumentRedactionResponse result = apiInstance.RedactDocument(body);
В ответе приходит отредактированный документ и набор флагов Contains* — по одному на каждый тип данных. Это удобно, если нужно не просто скрыть данные, но и зафиксировать факт их присутствия в документе для аудита. Отдельно возвращается список страниц, на которых были внесены правки.
Для использования нужен API-ключ Cloudmersive — регистрация на их сайте, есть бесплатное использование.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9🌚3❤2
Fullstack .NET / C# Developer (Middle/Senior) — 3 000 — 4 500 $, удалёнка.
Middle Unity (С#) developer — от 1 500 до 2 700 $, удалёнка.
C# backend-разработчик в команду Security — офис или гибрид в Москве.
Please open Telegram to view this post
VIEW IN TELEGRAM
Если ваш дашборд каждый раз агрегирует данные из нескольких таблиц, а список сотрудников делает новый запрос к БД при каждой загрузке — с десятью пользователями это терпимо. Под реальной нагрузкой всё рассыпается.
EasyCaching решает эту проблему — чистый кэширующий слой, который встраивается в .NET.
Что даёт интеграция:
• Провайдер, TTL и ключи живут в appsettings.json.
Пример:
"PerEndpoint": {
"Dashboard:Metrics": { "AbsoluteTtlSeconds": 300 },
"Employees:GetAll": { "AbsoluteTtlSeconds": 300, "SlidingTtlSeconds": 120 }
}• MediatR Pipeline: кэш оборачивает query-хендлер прозрачно. Хэндлер вообще не знает, что его результаты кэшируются.
var cached = await _cache.GetAsync<TResponse>(cacheKey);
if (cached != null) return cached;
var result = await next(); // реальный запрос к БД
await _cache.SetAsync(cacheKey, result, CacheKeyPrefixes.EmployeesAll);
return result;
• Domain Events инвалидация: CacheInvalidationEventHandler автоматически сбрасывает кэш при любой записи. RemoveByPrefixAsync чистит все Employees:GetAll:* за раз, без перебора ключей.
• Диагностические заголовки X-Cache-Status: HIT/MISS в каждом ответе. Видно прямо в DevTools — кэш работает или нет.
• Админские эндпоинты:
POST /cache/invalidate и GET /cache/stats для ручного управленияКэширование — это инфраструктура, не бизнес-логика. Хендлеры не знают о кэше, команды не знают об инвалидации.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9
Вот код, который видел каждый в первый день знакомства с языком. Только здесь он немного другой:
using System;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Console.CursorVisible = false;
print('H', ConsoleColor.Red);
print('e', ConsoleColor.Yellow);
print('l', ConsoleColor.Magenta);
print('l', ConsoleColor.Green);
print('o', ConsoleColor.Blue);
print(',', ConsoleColor.Red);
print(' ', ConsoleColor.Red);
print('w', ConsoleColor.Magenta);
print('o', ConsoleColor.Cyan);
print('r', ConsoleColor.Yellow);
print('l', ConsoleColor.Green);
print('d', ConsoleColor.Blue);
print('!', ConsoleColor.Red);
}
static void print(char letter, ConsoleColor color)
{
Console.ForegroundColor = color;
Console.Write(letter);
}
}
Возьмите минутку перерыва и запустите.
📍 Навигация: Вакансии • Задачи • Собесы
#entry_point
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱12❤1
Разбираем превью .NET 11.
В .NET появятся два новых метода у
JsonSerializerOptions — GetTypeInfo<T>() и TryGetTypeInfo<T>(). Раньше, чтобы получить JsonTypeInfo<T>, приходилось вручную кастовать результат из не-дженерикового GetTypeInfo(Type).// Раньше
JsonTypeInfo<MyType> info = (JsonTypeInfo<MyType>)options.GetTypeInfo(typeof(MyType));
// Теперь
JsonTypeInfo<MyType> info = options.GetTypeInfo<MyType>();
Если тип может быть не зарегистрирован — есть вариант с
TryGetTypeInfo<T>(), который не бросает исключение, а возвращает bool.if (options.TryGetTypeInfo<MyType>(out JsonTypeInfo<MyType>? typeInfo))
{
// typeInfo готов к работе
}
Изменение небольшое, но устраняет одну из тех мелких раздражающих вещей, с которыми сталкиваешься в реальных проектах.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
Большинство health check'ов проверяют три вещи:
- Запущен ли процесс?
- Есть ли коннект к базе данных?
- Доступен ли Redis?
Это полезно. Но этого недостаточно для больших продуктивных систем.
Приложение может быть технически живым и при этом функционально сломанным. Процесс работает, эндпоинт возвращает 200, Kubernetes считает под здоровым, но первый же реальный запрос падает с ошибкой.
К примеру, кастомный health check для EF Core миграций:
public class DbContextMigrationsHealthCheck(DbContext dbContext) : IHealthCheck
{
public async Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context,
CancellationToken cancellationToken = default)
{
try
{
var applied = await dbContext.Database
.GetAppliedMigrationsAsync(cancellationToken: cancellationToken);
var pending = await dbContext.Database
.GetPendingMigrationsAsync(cancellationToken);
if (pending.Any())
{
return HealthCheckResult.Degraded(
"Есть неприменённые миграции.",
data: new Dictionary<string, object>
{
{ "PendingMigrations", pending },
{ "LatestAppliedMigration", applied.LastOrDefault() ?? "" }
});
}
return HealthCheckResult.Healthy(
data: new Dictionary<string, object>
{
{ "LatestAppliedMigration", applied.LastOrDefault() ?? "" }
});
}
catch (Exception ex)
{
return new HealthCheckResult(context.Registration.FailureStatus, exception: ex);
}
}
}
Идея не ограничивается EF Core. Любая зависимость, которая доступна, но ещё не готова к работе:
• CMS — нужно прогреть кэш перед началом работы
• Биллинг — зависит от загрузки актуальных правил ценообразования
• Search API — ждёт готовности текущей версии индекса
Сервис здоров не тогда, когда открывает SQL-коннекшн. Сервис здоров, когда готов выполнять ту работу, для которой задеплоен.
📍 Навигация: Вакансии • Задачи • Собесы
#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Самый востребованный навык в ИТ в 2026-м — навык создания ИИ-агентов
Мы полностью переработали курс «Разработка AI-агентов» под реалии 2026 года. Никакой долгой теории — с самого начала пишем код. Обучать и делиться набитыми шишками будут эксперты-практики из Газпромбанка, Альфа-Банка и других бигтехов.
В программе:
— архитектура автономных систем с тестированием, ReAct-циклами и контролем токенов;
— практическая работа с актуальными фреймворками
— настройка продвинутого RAG для парсинга документов и точного поиска;
— внедрение решений с учётом действующего законодательства (152-ФЗ);
— дипломная работа, за основу которой можно взять свой рабочий проект или задачу, которую предложим мы.
Эксперты поделятся инсайтами из реального продакшна — тем, о чём вам никогда не расскажет ни одна нейросеть.
Ах да, чуть не забыли! Дарим промокодAGENTSWEB на скидку 10 000 рублей и два курса сверху при покупке до 15 марта 🎁
→ Освоить разработку AI-агентов
Мы полностью переработали курс «Разработка AI-агентов» под реалии 2026 года. Никакой долгой теории — с самого начала пишем код. Обучать и делиться набитыми шишками будут эксперты-практики из Газпромбанка, Альфа-Банка и других бигтехов.
В программе:
— архитектура автономных систем с тестированием, ReAct-циклами и контролем токенов;
— практическая работа с актуальными фреймворками
LangGraph, AutoGen, MCP и CrewAI;— настройка продвинутого RAG для парсинга документов и точного поиска;
— внедрение решений с учётом действующего законодательства (152-ФЗ);
— дипломная работа, за основу которой можно взять свой рабочий проект или задачу, которую предложим мы.
Эксперты поделятся инсайтами из реального продакшна — тем, о чём вам никогда не расскажет ни одна нейросеть.
Запись первого открытого вебинара, на котором мы вместе с руководителем AI-направления в Альфа-Банке Полиной Полуниной пилили агента в прямом эфире.
Ах да, чуть не забыли! Дарим промокод
→ Освоить разработку AI-агентов
Предлагаем ответить на вопрос с собеседования:
Что делает оператор using в C#
Почти каждый C#-разработчик писал такой код сотни раз:
using (var connection = new SqlConnection(connectionString))
{
// работаем с ресурсом
}
На первый взгляд — просто синтаксический сахар.
Подсказка:
📍 Навигация: Вакансии • Задачи • Собесы
#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱15👍5
Продолжаем копаться в превью .NET 11.
До этого
TarFile.CreateFromDirectory всегда создавал архивы в формате Pax. Без вариантов. Если нужен был GNU или Ustar — приходилось обходными путями.Теперь у метода появятся новые перегрузки с параметром
TarEntryFormat. Поддерживаются все четыре формата: Pax, Ustar, GNU и V7.// GNU — для совместимости с Linux-окружениями
TarFile.CreateFromDirectory("/source/dir", "/dest/archive.tar",
includeBaseDirectory: true, TarEntryFormat.Gnu);
// Ustar — широкая совместимость с разными инструментами
TarFile.CreateFromDirectory("/source/dir", outputStream,
includeBaseDirectory: false, TarEntryFormat.Ustar);
// Асинхронный вариант тоже есть
await TarFile.CreateFromDirectoryAsync("/source/dir", "/dest/archive.tar",
includeBaseDirectory: true, TarEntryFormat.Pax, cancellationToken);
Формат имеет значение, когда архив передаётся в конкретный инструмент или среду со своими ожиданиями. GNU лучше воспринимается стандартным
tar в Linux. Ustar даёт максимальную совместимость там, где важна переносимость. V7 нужен в совсем редких легаси-сценариях.
Раньше под такие случаи приходилось либо писать обёртки вручную, либо тянуть сторонние библиотеки. Теперь это часть стандартного API.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
🔄 Microsoft выпустила внеплановый патч .NET 10.0.5.
В .NET 10.0.4 сломался отладчик на macOS — при попытке дебажить любое .NET-приложение через VS Code он падал.
Кому стоит обновится: macOS + VS Code + .NET SDK 10.0.104 или 10.0.200 или рантайм 10.0.4.
Windows и Linux не затронуты.
➡️ Блог разработчиков
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека шарписта
#async_news
В .NET 10.0.4 сломался отладчик на macOS — при попытке дебажить любое .NET-приложение через VS Code он падал.
Кому стоит обновится: macOS + VS Code + .NET SDK 10.0.104 или 10.0.200 или рантайм 10.0.4.
Windows и Linux не затронуты.
📍 Навигация: Вакансии • Задачи • Собесы
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9
Несколько тихих, но полезных улучшений в JIT-компиляторе, которые влияют на производительность без изменений в коде.
Устранение проверок границ для паттерна i + cns < len
JIT теперь убирает лишние bounds check в типичном сценарии, когда индекс плюс константа сравниваются с длиной массива. Такой паттерн встречается в парсерах, обработке буферов, посимвольном разборе строк. Раньше каждая такая проверка генерировала лишние инструкции в рантайме.
Удаление избыточных checked-контекстов
Если JIT может доказать, что значение уже находится в допустимом диапазоне, он теперь выбрасывает проверку переполнения как ненужную.
Это касается арифметики в checked-блоках, где компилятор раньше перестраховывался даже там, где переполнение было физически невозможно.
Девиртуализация generic-виртуальных методов в R2R
ReadyToRun-образы теперь умеют девиртуализировать несовместно используемые generic virtual method calls. Это означает, что AOT-скомпилированный код получает те же оптимизации прямых вызовов, которые раньше были доступны только в JIT-режиме.
SVE2-интринсики для ARM
Добавлены новые интринсики ShiftRightLogicalNarrowingSaturate(Even|Odd) для архитектур с поддержкой SVE2. Требуют и поддержки в JIT, и соответствующего API. Полезно для векторных вычислений на серверном ARM-железе вроде Graviton или Neoverse.
Все четыре изменения работают автоматически при обновлении рантайма. Ничего менять в коде не нужно.
📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍5❤1
Чуток материалов помимо второго превью .NET
— .NET 11 Preview 2
— Реферальный рекрутинг в IT
— Протокол против AI слопа в вебе
— MCP C# SDK v1.0
📍 Навигация: Вакансии • Задачи • Собесы
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Раньше при работе с C#-интерфейсами, где базовый слот закрыт через дефолтную реализацию интерфейсов, F# всё равно требовал явно реализовать оба интерфейса.
Теперь достаточно реализовать только производный интерфейс.
Допустим, есть такие C#-интерфейсы:
public interface IA { int M(); }
public interface IB : IA {
new int M();
int IA.M() => this.M() + 100; // DIM покрывает слот IA.M
}Раньше F# требовал реализовать и
IA, и IB. Теперь достаточно IB:type C() =
interface IB with member _.M() = 42
(C() :> IB).M() // 42
(C() :> IA).M() // 142 — DIM перенаправляет: this.M() + 100
Улучшение работает не только для простых случаев. Поддерживается ромбовидное наследование, дженерик-интерфейсы, свойства, события, структуры и объектные выражения.
Для включения нужен флаг
--langversion:preview.📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍2🌚1
Microsoft выпустила кастомный агент
modernize-dotnet для GitHub Copilot. Раньше автоматизированная миграция .NET работала только внутри Visual Studio. Теперь тот же процесс доступен в VS Code, терминале через Copilot CLI и прямо на GitHub.Агент работает по модели оценка → план → выполнение. На выходе — три артефакта прямо в репозитории: отчёт о текущем состоянии кода, план апгрейда с последовательностью шагов и набор задач с конкретными изменениями.
Как запустить в терминале:
/plugin marketplace add dotnet/modernize-dotnet
/plugin install modernize-dotnet@modernize-dotnet-plugins
/agent # выбрать modernize-dotnet
# затем: upgrade my solution to a new version of .NET
Поддерживаемые типы проектов: ASP.NET Core, Blazor, Azure Functions, WPF, консольные приложения и библиотеки. Миграция с .NET Framework тоже поддерживается — но только на Windows.
📍 Навигация: Вакансии • Задачи • Собесы
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
Когда компилятор F# встречает вызов метода, он каждый раз заново проверяет все доступные перегрузки и выбирает подходящую. В файлах с тысячами однотипных вызовов это превращается в заметную часть времени компиляции.
Новая preview-фича кэширует результат этой проверки. Если метод вызывается повторно с теми же типами аргументов, компилятор берёт готовый результат из кэша вместо повторного перебора.
Ключ кэша состоит из трёх частей: идентификатор группы методов, типы аргументов и тип возвращаемого значения. Кэш автоматически отключается там, где контекст влияет на выбор перегрузки: именованные аргументы, SRTP-ограничения и похожие сценарии.
.NET 10 уже сам по себе ускорил компиляцию в шесть раз по сравнению с девяткой. Кэш перегрузок даёт ещё двукратный прирост сверху и заметно снижает давление на GC.
Фича доступна в preview. Чтобы включить, нужно добавить
--langversion:preview в параметры компилятора.📍 Навигация: Вакансии • Задачи • Собесы
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
На новых ноутбуках с Copilot+ PC правый Ctrl заменили физической кнопкой Copilot. Microsoft продвигала её как часть сертификации устройств. Те, кто активно использовал правый Ctrl — в VirtualBox, в терминале, при выделении текста — внезапно обнаружили, что кнопки больше нет.
Перепривязать её стандартными средствами Windows нельзя нормально и без костылей.
Разработчик выпустил утилиту NoCopilotKey. Она перехватывает нажатие кнопки Copilot через low-level keyboard hook и подменяет его на Right Ctrl. Никаких настроек, никакого интерфейса.
Скачал, запустил, кнопка работает как Ctrl.
📍 Навигация: Вакансии • Задачи • Собесы
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩3😁1