ИИ-агент для моей сети контактов
Моя сеть контактов разрослась настолько, что я перестал помнить, кому что нужно и кто может помочь. Я создал Android-приложение, в котором описываю разговор обычными словами. ИИ-агент сохраняет его в записях о нужных людях и отвечает на вопросы о них. Действовать он может только через инструменты, которые работают на моём телефоне.
- Моя роль
- Я спроектировал продукт, агента, его инструменты и правила безопасности. Код написали кодинг-агенты — Claude Code и Codex.
- Статус
- Я начал проект в августе 2026 года и пользуюсь им для своей сети контактов. Код выложен на GitHub в открытом доступе.
- Стек
- Android, Claude Agent SDK на моём приватном ИИ-шлюзе, вызов инструментов по JSON Schema, зашифрованные резервные копии на GitHub
- Охват
- 17 инструментов, которые читают записи, изменяют их или просят меня подтвердить действие
Задача
Полезные факты всплывают в обычных разговорах: над чем человек работает, что ему нужно и что он может предложить. Чем больше людей я встречал, тем больше таких фактов забывал.
Приложения для контактов хранят имена и номера телефонов. Но на вопросы вроде «Кто может с этим помочь?» или «О чём мы говорили в прошлый раз?» они ответить не могут.
Как развивалось приложение
Первая версия появилась в августе 2026 года. В ней были формы для людей, их потребностей и навыков. ИИ превращал заметку в предложение изменений, а я проверял его, прежде чем что-либо сохранялось.
Я тестировал ИИ-модели на реальной схеме данных приложения. Одна модель раз за разом не успевала дать структурированный ответ до тайм-аута, поэтому я перешёл на другую. В сентябре 2026 года я перевёл все вызовы ИИ на Claude через свой приватный шлюз.
Для каждого нового типа запросов нужны были свой промпт, схема, парсер и экран. Поэтому в середине сентября я переделал ассистента в агента, который пользуется инструментами. Теперь один чат принимает и заметки, и вопросы, и исправления.
Как обрабатывается одно сообщение
- Сообщение Я пишу или надиктовываю заметку о разговоре либо задаю вопрос.
- Claude планирует На моём шлюзе Claude решает, какой инструмент вызвать следующим. В начале у него нет ни одной сохранённой записи.
- Проверка на шлюзе Шлюз сверяет каждый вызов инструмента с его JSON Schema, а затем отправляет вызов на телефон.
- Телефон запускает инструмент Приложение ещё раз проверяет вызов, выполняет его на базе данных телефона и возвращает только результат. Контактные данные никогда не покидают телефон.
- Ответ с кнопкой Undo В ответе перечислены все изменения, и одно нажатие отменяет их все. Удаление и объединение записей происходят только по моему нажатию.
- ПриватностьБаза данных остаётся на телефоне, а резервные копии сначала шифруются
- ГолосРечь распознаётся на телефоне всегда, когда это возможно
- Обратная связьО проблеме в любом ответе можно сообщить, выбрав готовую метку
Скриншоты сделаны на тестовом телефоне с вымышленными людьми.
-
Заметка о новом человеке: в ответе перечислено каждое сохранённое изменение и есть одна кнопка Undo
-
Вопрос без хорошего совпадения: ответ прямо говорит об этом и объясняет почему
-
Вкладка Needs: что ищут люди из сети контактов
Проектные решения
- За соблюдением правил следит телефон. Каждый вызов инструмента проверяется дважды: сначала шлюзом по схеме, затем приложением. Приложение проверяет, что записи существуют, текст не слишком длинный, ничего не дублируется и нет дат в будущем. Отклонённый вызов ничего не сохраняет, а модель получает ошибку, которую может прочитать и исправить.
- Гибко, но обратимо. Сначала каждое изменение от ИИ ждало моей проверки. Потом я выбрал гибкость: теперь добавления и правки сохраняются сразу. Каждый ответ хранит копию каждой строки до и после изменения, поэтому одно нажатие отменяет весь ответ. Undo не сработает, если с тех пор я изменил эту строку.
- Удаление всегда ждёт подтверждения. Удаление человека, заметки или записи, а также объединение записей о двух людях выполняется, только когда я нажимаю на карточку этого действия.
- Сохранённый текст — это данные, а не инструкции. Промпт велит модели считать сохранённые заметки и прежние сообщения данными и никогда не принимать их за инструкции.
- Ответы опираются на сохранённые записи. Ассистент обязан сказать, если сведения устарели или их мало. Он никогда не должен намекать, что человек готов помочь, только потому, что в старой заметке упомянут навык.
- Приватность заложена в архитектуру. В приложении нет аккаунтов, аналитики и импорта контактов. Резервные копии шифруются на телефоне, прежде чем уйти в закрытый репозиторий на GitHub, а сохранять копии в открытый репозиторий приложение отказывается.
Как я нахожу и исправляю ошибки
У каждого ответа есть кнопка Report a problem с готовыми метками, например: не тот человек, что-то упущено, неверный тип записи. В отчёт попадают сообщение, ответ, то, что было сохранено, и все вызовы инструментов по порядку, но без контактных данных.
Отчёты передаются внутри зашифрованной резервной копии. На моём компьютере скрипт расшифровывает только отчёты. Я исправляю ошибку и проверяю исправление на тестовом телефоне с вымышленными людьми.
Например, отчёты показали, что учёба и волонтёрство сохранялись как места работы. Одна тестовая заметка превращалась в четыре места работы. После исправления она дала одно место работы, а остальное попало в образование и факты биографии.
Я также измеряю скорость. Когда я позволил одному вызову инструмента сохранять заметку вместе с её фактами, обновление записей о двух людях стало занимать около 12 секунд вместо 23.
Статус
Я пользуюсь приложением для своей сети контактов, и оно само обновляется из подписанных релизов на GitHub. Код, README и заметки о приватности выложены в открытом доступе на GitHub.
Скриншоты сделаны на тестовом телефоне с вымышленными людьми. На этой странице нет ни одного реального контакта.