3071
директор ИИ · инженер‑интегратор @eprogrammist | https://github.com/EvilFreelancer 20 лет в IT ∈ 10 лет в разработке ∈ 3 года в ML/AI ∈ 1 год - вайбмастер Бусти: https://boosty.to/evilfreelancer Пожертвования: https://pay.cloudtips.ru/p/937f48ac
Размышлял о памяти нейросетей и очень захотелось перечитать труд Марвина Мински про фреймы знаний.
Читать полностью…
NeuralDeep Skills: локальная база агентных навыков под ру-сервисы
Всем, кто пользуется агентами, 100% известна такая вещь, как skills.sh. Это огромная база скиллов агентов под любые сервисы. Ставишь – и агент уже умеет с ними работать из коробки.
Так вот, в российском сообществе давно напрашивался аналог под локальный стек. И его сделал наш друг и коллега по тг – Валерий @neuraldeep. Он в целом регулярно делает разные практичные штуки для разработчиков, и это как раз одна из них.
Итак, встречайте: neuraldeep.ru/
Это база, в которой будут собраны скиллы для работы с самими разными ру-сервисами. Туда уже залили интеграции под инструменты Яндекс, Битрикс24, 1С и другое, чем многие пользуются каждый день.
– Установка все так же происходит одной командой, все привычно и понятно
– Проект опенсорсный: туда можно просто прийти и залить свой скилл через GitHub (формат claude-skill)
– Есть модерация и базовые проверки безопасности
Из этого вполне может получиться что-то вроде стандартного слоя для агентных интеграций под рф-рынок. Если работаете с агентами – заходите попробовать или даже поучаствовать.
Проект -> neuraldeep.ru/
Гитхаб -> https://github.com/vakovalskii/neuraldeep
Следите за обновлениями в канале Валеры -> @neuraldeep
https://github.com/ggml-org/llama.cpp/pull/21011
Смерджили
Loading model from ruGPT3XL ...Читать полностью…
Device: cpu, dtype: float32
Loading weights: 100%|██████████| 389/389 [00:01<00:00, 213.86it/s]
Model loaded. Parameters: 1,418,678,272
Prompt: В далеком космосе
Generated: В далеком космосе, в одной из звездных систем галактики Млечный путь на орбите искусственного спутника Земли вращается небольшое космическое тело — искусственный спутник «К-2», по своим размерам и массе не уступающий самой планете. На борту этого космического тела находится база для исследовательских работ землян под названием Земля-3126/1А.
На Земле же все спокойно: ученые проводят исследования атмосферы планеты
Кстати, поскольку судьба Телеграм неизвестна, на всякий случай, чтобы не потерять связь, завёл страничку на Бусти:
https://boosty.to/evilfreelancer
Планирую там публиковать посты про внутрянку проектов, лонгриды, которые не попадают в формат телеги, размышления на разные темы, ну и анонсы проектов для тех кому будет интересно принять участие в тестировании новинок.
Пришли две новые штукенции, коммутатор на 2.5Гбит и райзер сплитер 16x на пару 8x. #server
Читать полностью…
ACPBox - Agent Client Protocol (ACP) в формате OpenAI API
В последнее время много занимаюсь интеграцией агентов и в какой-то момент устал каждый раз заново собирать ReAct лупу под задачу, пришла идея взять уже готового агента по Agent Client Protocol (stdio, JSON-RPC) и не городить свой HTTP-слой, а выставить наружу привычный OpenAI-совместимый API - один base URL, те же /v1/models, /v1/chat/completions (стейтлесс), /v1/responses (стейтфул), чтобы подключались обычные клиенты и SDK, типа Open WebUI и аналогов.
За пару вечеров собрать проект ACPBox, под капотом там uvicorn, на каждый worker один долгоживущий процесс агента, запросы с OpenAI-формата переводятся в ACP и обратно, стриминг и список моделей из режимов агента поддерживаются.
Установка изолированно через pipx:
pipx install acpbox
config.yaml для OpenCode агента:acp:
command:
- opencode
- acp
env: {}
workspace: "./workspace"
gateway:
host: "0.0.0.0"
port: 8080
workers: 1
threads: 1
opencode acp задаём agent acp, аналогичная фичу можно использовать и для джемини, и для клод кода и так далее.acpbox --config ./config.yaml
http://localhost:8080/docs появится OpenAPI/Swagger UI, можно будет потыкать агента.
Сегодня канал преодолел 3000 подписчиков, удивительно с какой скоростью это произошло, ведь 2000 было всего навсего в ноябре прошлого года, а с тех пор прошло чуть больше 4 месяцев.
Спасибо, что вы здесь, постараюсь и дальше радовать вас своим ворчанием, феласофией и забористым контентом :)
Принял VibeCode эстафету от Рината @llm_under_hood
Попросил Cursor проанализировать все репозитории на диске в которые я коммитал хотя бы один раз, репозитории без .git индекса попросил игнорировать, полученный отчёт агент собрал в Markdown файл, после чего сгенерировал из него лендос по шаблону, получилась такая вот красота.
На графике хорошо видно, что весь 2025 всё шло более менее как обычно, но в первом квартале этого года я начал уже вайбкодить по-взрослому, число уникальных репозиториев и количество коммитов увеличилось в разы.
Эстафета - передай другому вайбкодеру, прощу коллег @countwithsasha, @alexs_journal, @kdoronin_blog и @simple_agi
принять участие в этом маленьком мероприятии и поделиться своими результатами.
Openapi-to-cli
«openapi-to-cli» (ocli) — CLI-утилита на TypeScript, которая превращает любое OpenAPI/Swagger API в набор CLI-команд в рантайме, без кодогенерации. По сравнению с MCP+Search подходом, ocli даёт в 15 раз более компактные результаты поиска
Самый быстро растущий наш с Пашей проект за меньше чем 5 дней 100+ звезд
400 + Clones
2000 посещений репо
Что интересно в части рабочих чатиков видел обсуждение и тесты тулзы (и пока только положительные впечетления)
РЕПО: https://github.com/EvilFreelancer/openapi-to-cli
Поставил в сервер, загрузил, ничего настраивать не пришлось, система подхватила карточку сама, штатный драйвер её увидел, даже vllm зарезервировала память под кеш.
Читать полностью…
Забудь про MCP и tools — конвертируй 100 000 API методов в один CLI инструмент на лету
Все сейчас пишут MCP-серверы и tools для агентов
На каждый API endpoint — отдельный tool с описанием, параметрами, схемой
10 методов? Ок
100? Уже больно
845 (GitHub API)? Удачи (да да можно делать поиск и тулов и MCP) но какой же это зоопарк и как его поддерживать?
Но так же мы поняли новый тренд это cli обертки
От сюда мы с @evilfreelancer пошли другим путём: берём любой OpenAPI spec (JSON/YAML) и конвертируем его в CLI команды на лету Без кодогенерации.
Без компиляции
Один бинарник — любое API
Что это даёт:
→ ocli search --query "create pull request" --limit 5 — BM25-поиск по 845 эндпоинтам за 7мс
→ ocli search --regex "repos.*pulls" — regex по путям, именам, описаниям
→ Несколько профилей одного API с разными наборами эндпоинтов (include/exclude)
→ Несколько API серверов в одном инструменте
Почему CLI, а не MCP tools для агентов?
100 MCP tools → ~50 000 токенов на описания в контексте
100 CLI команд → 1 tool "execute_command" + поиск нужной команды
Объективно я счита что агентов больше таскают команды вызвать, нежели разбираться с тонне контекста tools
Агент вызывает ocli search, находит нужную команду, выполняет её
Один tool_exec вместо тысяч
Контекстное окно свободно для работы, а не для описаний инструментов.
Сделал быстрый тест на реальных API:
- GitHub API — 845 endpoints, 11MB spec, JSON
- Box API — 258 endpoints, YAML
BM25 поиск — порт из Go (picoclaw) на TypeScript с Robertson IDF smoothing.npm install -g git+https://github.com/EvilFreelancer/openapi-to-cli.git#feat/command-searchocli profile add githubocli search --query "upload file" --limit 5
GitHub: https://github.com/EvilFreelancer/openapi-to-cli
О чём молчат Антропики (про скилы, опять)
Концепция Skills, которую предложили Антропики не так давно, мне очень нравится, я несколько раз писал на эту тему (раз, два, три), часто пользуюсь готовыми скилами, а какие-то пишу сам, но есть у них один фатальный недостаток, о котором, к моему большому удивлению, мало кто задумывается, эту проблему можно описать как кроссплатформенность компилируемых бинарных файлов.
К примеру, у меня есть скил, который вызывает некий бинарник, скомпилированный под x86/64, и есть Raspberry Pi на процессоре ARM64, допустим, я хочу установить этот скил, он устанавливается, но по факту бесполезен, так как архитектура бинарника и моего процессора не совпадает, можно придумать и другой пример, скажем, бинарь собран под Linux, но пользователь хочет установить скил на Windows.
Из вероятных решений, которые приходят на ум, это процедура установки, когда агент сам скачивает бинарник через условный curl/wget под нужную архитектуру (в момент первого вызова), сам закидывает в папку с бинарниками и выполняет полезную работу, но что-то подобных скилов мне ещё пока не попадалось, все, что видел, предлагают отдельно выполнить установку бинаря и отдельно ставить скил на систему, в которой нужный бинарь уже есть.
А как вы решаете эту проблему?
Crab People
Последовал примеру Валерия @neuraldeep и поднял себе на домашней малинке PicoClaw, решил начать с простых задач, типа работы с github и поиска в сети, очень приятно и легко всё настраивается, хотя возможно людям без опыта работы с linux будет местами сложновато, так как надо будет прописывать allow list команд который можно выполнять, но это в любом случае в разы более качественный и удобный проект нежели OpenClaw.
Запустил всё ессно в docker-конейнере.
Чуть поразбирался с этим проектом, он состоит из 3х контейнеров:
- onboard - хитрый контейнер который генерит пустой конфиг
- gateway - контейнер который запускает ботов, без web-интерфейса
- launcher - контейнер который включает в себя все функции gateway, плюс имеет web-интерфейс
В админке (launcher) скажем так не очень много возможностей предусмотрено, хотя вполне достаточно и наверно больше и не требуется, однако, авторизации нет, так что его в формате сайтика за пределы сети выпускать не стоит, поэтому я пока еду на клиенте (gateway).
Ещё пока разбираюсь, но пользоваться приятно.
Выгрузить модель на HuggingFace не так-то просто
Конвертировал тут новинку chromadb/context-1 в mxfp4 формат и пытаюсь загрузить веса на HuggingFace, но по какой-то причине huggingface-cli перестал подхватывать переменные прокси, в результате чего из моего контура запросы не уходят, пришлось лезть в исходники и оказалось, что авторы HF добавили в свой тул хранилища типа Xet включенные по умолчанию, а эта штука не использует httpx и как следствие игнорирует настройки прокси.
Короче чтобы решить эту проблему и из рабочего контура подключиться к проксику надо вырубить Xet переменной HF_HUB_DISABLE_XET, а дальше передать проксики и команду:
HF_HUB_DISABLE_XET=1 \
ALL_PROXY=socks5://192.168.1.21:1080 \
HTTPS_PROXY=socks5://192.168.1.21:1080 \
HTTP_PROXY=socks5://192.168.1.21:1080 \
huggingface-cli upload evilfreelancer/context-1-mxfp4 ./context-1-mxfp4 . --repo-type model
Встречайте мой новый пост "Реставрация ruGPT-3 XL или как я вернул к жизни забытую русскую языковую модель" на Хабр, в нём я подробно рассказал о том как была реализована конвертация, как проводилось её тестирование, как запустить локально, как конвертировать в GGUF.
А вот ссылочки:
- evilfreelancer/ruGPT3XL - сконвертированная модель в формате HuggingFace (safetensors)
- evilfreelancer/ruGPT3XL-GGUF - квантизированные GGUF-веса для llama.cpp и Ollama
- evilfreelancer/rugpt3 - GGUF загруженные на Ollama
- EvilFreelancer/rugpt3xl-convert - исходники скриптов конвертации
Ловите мой новый пост на Бусти, в нём я рассказываю про модельку ruGPT3XL на 1.3B, которую мне удалось отреставрировать и заставить работать на современном железе.
upd. Пост на бусти так как ещё не всё готово, но всех кому интересно приглашаю принять участие в тестировании.
Проблема долговременной памяти чатов
Хоть я и считаю себя сторонником памяти агентных систем, даже большой пост на эту тему писал, но работая с чатами в которых есть память истории всех сообщений периодически ловлю себя на мысли, что надо напилить какой-нибудь пост на тему того, что память эта частенько работает плохо, вносит искажения в ответы модели и единственный годный режим её работы это "off", то есть отключена.
Пока ещё не придумал как сделать долговременную память хорошо, самое удачное решение на данный момент это кажется концепция которую я условно назвал "долговременная доменная память" (LDM), постараюсь кратко её описать, представим что мы создали Project в ChatGPT, это такая группа чатов, в которую мы закидываем файлы, промты, там же все чаты находятся, вот память в таком компактном домене была к месту.
Развивая эту мысль было бы удобно связать домены памяти, и скажем когда я работаю с доменом спецификаций некоего проекта я мог бы дать доступ к домену с нормативами от ИБ и или скажем домену оформления схем данных, при информационные потоки между доменами чтобы были однонаправленные, типа отсюда сюда я могу запросить память, а в другую сторону не могу.
Проще всего описать это в формате графа, где синие узлы это группы, а серые это чаты, чаты в пределах своего домена и в пределах доменов в которые есть доступ могут искать данные, но в других нет.
"What I cannot create I do not understand" (c) Richard Feynman
Решил провести небольшой эксперимент чтобы узнать:
может ли кодовый агент создать кодовый агент?
За вчера порядочно прокачал проект Coddy, переделал подсистему которая пишет код на ACP, так что теперь её можно использовать с любым кодовым агентом.
В планах реализовать хук автоматического переключения на новую версию Docker-контейнера после мерджа PR и автоматического бампа версии.
Эксперимент (день 1)
Первая проблема с которой столкнулись участники оказалась в сложности установки консольного тула Crush, на виндовс нужна утилита winget, на макоси brew, я кстати пробежался по всем консольным тулам (типа курсора, клод кода, джемини и так далее) и эта общая проблема, вместо создания MSI/EXE пакетов для виндовс и DMG для макоси авторы большинства консольных тулов делают непонятно что, какие-то скрипты для PowerShell, какие-то curl | bash, ладно бы на линуксе только, мы тут все привычные к такому.
Вторая проблема в том, что Crush оказывается не поддерживает ACP, на эту тему есть PR у них, который открыт с февраля, вообще это очень странно, ведь Crush это форк OpenCode, почему эту часть не портировали не очень понимаю.
Третья проблема с кодировками в конфигах, нельзя просто взять, прислать JSON-конфиг с линукса, вставить его в текстовый файл на виндовс и чтобы это работало, других способов настроить тул разработчики не предусмотрели, прямо как в старые добрые времена.
Вайбкод для неискушенных
Решил провести на работе один небольшой эксперимент, предложил коллегам у которых нет айтишного образования попробовать нейросети и инструменты вайбкодинга при решении своих повседневных задач.
Важное условие эксперимента в использовании self-hosted моделей и opensource агентов. Плюс поскольку участники эксперимента специализируются не на разработке, а на решении проблем бизнеса нужна модель которая пусть и не супер кодит, но зато имеет широкий кругозор.
Поэтому мною были выбраны:
- агент Crush (в девичестве OpenCode) в качестве базового TUI, но важной его особенностью является поддержка Agent Client Protocol (ACP), что позволяет встроить его в любой совместимый клиент (например obsidian, drawio или pycharm)
- модели gpt-oss 20b и 120b, потому что они в себе идеально сочетают широкий кругозор, размер, скорость и поддержку function calling, что позволяет использовать их в качестве базы для агента
Пока что только рабочую группу собираю, но на следующей неделе полагаю эксперимент пойдет в полную силу. Результатами промежуточными поделюсь в конце следующей недели, ну или раньше, ежели чего прикольного будет.
SGR Agent Core 0.7.0
Кратенько и по порядку, в этом релизе:
0️⃣ В документацию добавили страницу Highlights.
1️⃣ В ядро доехал долгострой RunCommandTool, причём не просто "запусти команду", а с разделением на safe и unsafe режимы, workspace-настройками и нормальной обвязкой под выполнение команд.
2️⃣ Переработали WebSearchTool, теперь помимо Tavily есть ещё поддержка Brave и Perplexity.
3️⃣ Ещё одна важная фича - поддержка stateless контекста пользователя, для интеграций, где нельзя или неудобно тащить полноценный stateful контекст, это очень полезная штука.
4️⃣ Переосмыслили ReasoningTool, сделали его более заменяемым, в агентов добавили возможность подсовывать свой кастомный тул через параметр, тем самым завезли поддержку ризонинг моделей.
5️⃣ Добавили новый агент IronAgent для работы с моделями у которых не предусмотрена поддержка function calling.
6️⃣ Из более прикладных историй ещё доехала пагинация для web_search_tool через limit/offset, добавили фикс пустого json_data для LLM-провайдеров с кривоватым поведением, добавили простой интерактивный шел sgrsh, а также логику фильтрации тулов по их названию/описанию (чтобы экономить контекст).
7️⃣ Добавили в example агента progressive_discovery, который может эффективно работать с 50+ тулами.
Параллельно в релизе заметно причесали внутрянку, проработали возможность передавать настройки в тулы через конфиг, вынесли преобразования и валидацию на уровень model validators, упростили factory-слой, привели всё к единой модели ToolDefinition, пофиксили работу стриминга и рендеринга диалоговых сообщений и много других приятных мелочей улучшающих качество жизни.
В 0.7.0 завезли много интересного, при этом наш проект продолжает активно развиваться, а в следующих итерациях мы планируем добавить поддержку Skills, LangFuse, SearXNG и Agent Client Protocol (ACP) в режиме агента.
Обновляйтесь, тестируйте новые возможности и делитесь обратной связью, а если встретите баги или проблемы - приносите их в issues на GitHub.
Репо: https://github.com/vamplabAI/sgr-agent-core/
С уважением, команда SGR Team.
Феномен предвзятости подтверждения и... нейросети
Сегодня предлагаю ещё один вопрос для рефлексии и философствования, на этот раз про одну из самых недооценённых проблем LLM, которая заключена не в галлюцинациях и даже не ошибках самих по себе, а в том как легко модели подыгрывают позиции пользователя.
Когда человек изучает некую тему, например про бег, он может спросить модельку "почему бег полезен" и получить вполне убедительный текст про сердце, кардиовыносливость, настроение и метаболизм. Но если другой человек спросит "почему бег вреден", модель с такой же уверенностью распишет про нагрузку на суставы, травмы, кортизол и износ организма.
Чуть иначе сформулировал запрос - и получил не просто другой акцент, а местами вообще противоположный вывод, в таких случаях мне вспоминается народная мудрость:
Вопрос содержит в себе 90% ответа.
Забрал RTX 4090 из сервиса Vik-on после модификации до 48гб, солидно она схуднула конечно. #server
Читать полностью…
Приехала коробочка Beelink ME mini на 16гб RAM и процессором N150 с AliExpress, повезло урвать себе версию с 1Тб nvme на борту.
Читать полностью…
OpenAPI to CLI это врапер между API и консолью
Не так давно я публиковал проект openapi-to-mcp, который позволяет любой API сервер с нормальной OpenAPI/Swagger спецификацией конвертировать в MCP сервер. Но теперь я развил эту идею в сторону консоли и сделал openapi-to-cli, который по OpenAPI/Swagger спецификации генерит удобную CLI над тем же самым API.
Как это работает
Допустим в спецификации API есть такие эндпоинты:
- GET /messages
- POST /messages
- GET /status
- GET /users
В момент добавления профиля openapi-to-cli конвертирует их в команды CLI примерно такого вида:
- npx openapi-to-cli messages_get
- npx openapi-to-cli messages_post
- npx openapi-to-cli status
- npx openapi-to-cli users
Каждая такая команда это по сути HTTP запрос к API серверу, параметры запроса попадают через опции CLI, а ответ API печатается обратно в терминал, подробную справку по каждой команде можно почитать добавив -h или --help на конце.
Быстрый старт через npx
Самый простой способ попробовать:
npx openapi-to-cli profiles add default \
--api-base-url http://127.0.0.1:8080 \
--openapi-spec https://raw.githubusercontent.com/readmeio/oas-examples/refs/heads/main/3.1/json/petstore-simple.json
openapi-to-cli, если его еще нет в кэшеdefault для вашего API.ocli/specs/default.json.ocli/profiles.ininpx openapi-to-cli commands
npx openapi-to-cli messages --limit 10
ocli, она заменяет npx openapi-to-cli, но нужно ставить глобально через через:npm -g openapi-to-cli
Обычно я редко пишу про релизы новых языковых моделей, но это случай выдающийся, вчера компания Nvidia зарелизила NVIDIA Nemotron v3, это линейка MoE моделей, на 120B параметров всего и 12B активных.
Нашему внимания представлены несколько вариантов сжатия, самый любопытный из них лично для меня nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-NVFP4, так как этот формат является почти полным аналогом MXFP4 (подробнее тут).
Позиционируется данная модель как решение для продвинутых on-prem агентов (циферки и правда впечатляют), а так же как конкурент:
- openai/gpt-oss-120b (MoE, у которой лишь 5B активных и только MXFP4)
- Qwen/Qwen3.5-122B-A10B (MoE у которой 10B активных, но нет MXFP4 версий, только BF16, F16 и FP8)
Ну и так вот, примечательно в новом Немотроне то, что у неё 12B активных, что почти является рубиконом эмерджентности (13B параметров), плюс нативная поддержка FP4, а это значит для её запуска на контексте в 128к (но продел до 1m) токенов хватит 86Гб VRAM, почти как gpt-oss-120b.
Прокачал за вчера coddy.
Запилил такие вот фичи:
- добавил в observer синхронизацию всех issues и pull_requests на старте системы
- переработал логику раскладывания issues и pull_requests по разным папкам (рис.2)
- добавил флоу автоматического тестирования PR
- флоу автоматической простановки git tag при мердже PR
- флоу, который запускает сборку docker-образа и пушит на docker hub
- и много других небольших правок и оптимизации.
Исходники тут::
https://github.com/EvilFreelancer/coddy
Готовые образы тут:
https://hub.docker.com/r/evilfreelancer/coddybot
Там же на Docker Hub будет подробная инструкция как запустить контейнер.