← Как я работаю
Используется Личный проект · код в открытом доступе · 2026

ИИ-агент для моей сети контактов

Моя сеть контактов разрослась настолько, что я перестал помнить, кому что нужно и кто может помочь. Я создал Android-приложение, в котором описываю разговор обычными словами. ИИ-агент сохраняет его в записях о нужных людях и отвечает на вопросы о них. Действовать он может только через инструменты, которые работают на моём телефоне.

Моя роль
Я спроектировал продукт, агента, его инструменты и правила безопасности. Код написали кодинг-агенты — Claude Code и Codex.
Статус
Я начал проект в августе 2026 года и пользуюсь им для своей сети контактов. Код выложен на GitHub в открытом доступе.
Стек
Android, Claude Agent SDK на моём приватном ИИ-шлюзе, вызов инструментов по JSON Schema, зашифрованные резервные копии на GitHub
Охват
17 инструментов, которые читают записи, изменяют их или просят меня подтвердить действие

Задача

Полезные факты всплывают в обычных разговорах: над чем человек работает, что ему нужно и что он может предложить. Чем больше людей я встречал, тем больше таких фактов забывал.

Приложения для контактов хранят имена и номера телефонов. Но на вопросы вроде «Кто может с этим помочь?» или «О чём мы говорили в прошлый раз?» они ответить не могут.

Как развивалось приложение

Первая версия появилась в августе 2026 года. В ней были формы для людей, их потребностей и навыков. ИИ превращал заметку в предложение изменений, а я проверял его, прежде чем что-либо сохранялось.

Я тестировал ИИ-модели на реальной схеме данных приложения. Одна модель раз за разом не успевала дать структурированный ответ до тайм-аута, поэтому я перешёл на другую. В сентябре 2026 года я перевёл все вызовы ИИ на Claude через свой приватный шлюз.

Для каждого нового типа запросов нужны были свой промпт, схема, парсер и экран. Поэтому в середине сентября я переделал ассистента в агента, который пользуется инструментами. Теперь один чат принимает и заметки, и вопросы, и исправления.

Как обрабатывается одно сообщение

  1. Сообщение Я пишу или надиктовываю заметку о разговоре либо задаю вопрос.
  2. Claude планирует На моём шлюзе Claude решает, какой инструмент вызвать следующим. В начале у него нет ни одной сохранённой записи.
  3. Проверка на шлюзе Шлюз сверяет каждый вызов инструмента с его JSON Schema, а затем отправляет вызов на телефон.
  4. Телефон запускает инструмент Приложение ещё раз проверяет вызов, выполняет его на базе данных телефона и возвращает только результат. Контактные данные никогда не покидают телефон.
  5. Ответ с кнопкой Undo В ответе перечислены все изменения, и одно нажатие отменяет их все. Удаление и объединение записей происходят только по моему нажатию.
  • ПриватностьБаза данных остаётся на телефоне, а резервные копии сначала шифруются
  • ГолосРечь распознаётся на телефоне всегда, когда это возможно
  • Обратная связьО проблеме в любом ответе можно сообщить, выбрав готовую метку
Один ход агента. Шаги 2–4 повторяются, пока Claude не получит всё, что ему нужно.

Скриншоты сделаны на тестовом телефоне с вымышленными людьми.

Проектные решения

  • За соблюдением правил следит телефон. Каждый вызов инструмента проверяется дважды: сначала шлюзом по схеме, затем приложением. Приложение проверяет, что записи существуют, текст не слишком длинный, ничего не дублируется и нет дат в будущем. Отклонённый вызов ничего не сохраняет, а модель получает ошибку, которую может прочитать и исправить.
  • Гибко, но обратимо. Сначала каждое изменение от ИИ ждало моей проверки. Потом я выбрал гибкость: теперь добавления и правки сохраняются сразу. Каждый ответ хранит копию каждой строки до и после изменения, поэтому одно нажатие отменяет весь ответ. Undo не сработает, если с тех пор я изменил эту строку.
  • Удаление всегда ждёт подтверждения. Удаление человека, заметки или записи, а также объединение записей о двух людях выполняется, только когда я нажимаю на карточку этого действия.
  • Сохранённый текст — это данные, а не инструкции. Промпт велит модели считать сохранённые заметки и прежние сообщения данными и никогда не принимать их за инструкции.
  • Ответы опираются на сохранённые записи. Ассистент обязан сказать, если сведения устарели или их мало. Он никогда не должен намекать, что человек готов помочь, только потому, что в старой заметке упомянут навык.
  • Приватность заложена в архитектуру. В приложении нет аккаунтов, аналитики и импорта контактов. Резервные копии шифруются на телефоне, прежде чем уйти в закрытый репозиторий на GitHub, а сохранять копии в открытый репозиторий приложение отказывается.

Как я нахожу и исправляю ошибки

У каждого ответа есть кнопка Report a problem с готовыми метками, например: не тот человек, что-то упущено, неверный тип записи. В отчёт попадают сообщение, ответ, то, что было сохранено, и все вызовы инструментов по порядку, но без контактных данных.

Отчёты передаются внутри зашифрованной резервной копии. На моём компьютере скрипт расшифровывает только отчёты. Я исправляю ошибку и проверяю исправление на тестовом телефоне с вымышленными людьми.

Например, отчёты показали, что учёба и волонтёрство сохранялись как места работы. Одна тестовая заметка превращалась в четыре места работы. После исправления она дала одно место работы, а остальное попало в образование и факты биографии.

Я также измеряю скорость. Когда я позволил одному вызову инструмента сохранять заметку вместе с её фактами, обновление записей о двух людях стало занимать около 12 секунд вместо 23.

Статус

Я пользуюсь приложением для своей сети контактов, и оно само обновляется из подписанных релизов на GitHub. Код, README и заметки о приватности выложены в открытом доступе на GitHub.

Скриншоты сделаны на тестовом телефоне с вымышленными людьми. На этой странице нет ни одного реального контакта.