Files
agentik-desktop/REQUIREMENTS.md
T

11 KiB

Требования к десктопному клиенту agentik

Статус: накидываем. Ни один пункт не обязателен к исполнению в том виде, как записан. Позже пересматриваем.

Основа дизайна: вариант 1 (sketches/001-sidebar-utility) — выбран.

Сейчас описываем только поведение. Кода не пишем, пока требования не устоятся.


1. Общее

  • R1. Стиль — тёмная тема, уже принятая в клиентах пользователя (фон #121218, панели #17212B, текст #EBEBEB).
  • R2. Что видно на экране в любой момент: список диалогов, выбранный диалог и поле ввода. Больше ничего обязательного нет.

2. Раскладка и адаптивность

  • R3. Широкое окно — две части: список диалогов слева, открытый диалог справа.
  • R4. Узкое окно — на экране что-то одно: либо список диалогов, либо конкретный диалог. Переключение — как в Телеграме.
  • R5. В узком окне у открытого диалога сверху слева — кнопка «Назад». Нажатие возвращает к списку диалогов на всю ширину.
  • R6. Порог «широкое/узкое» — по ширине окна, одна величина. Какой именно размер считать порогом — решим позже.

3. Список диалогов

  • R7. Группировка диалогов со временем появится — «Работа», «Дом» и подобное. Сейчас это накидка, состав групп ещё не определён.
  • R8. В строке диалога: название, последнее сообщение, время, счётчик непрочитанных.
  • R9. Есть поиск по диалогам.

4. Открытый диалог

  • R10. Показ сообщений: мои и ассистента, с временем.
  • R11. Ответ ассистента можно прервать — на видном месте кнопка «Стоп».
  • R12. Сообщения приходят вживую, по мере генерации: текст дотекает куском за куском, а не появляется целиком в конце. Отображать именно так.
  • R13. Разметка (markdown). Если я или агент пишем текст, похожий на разметку, показывать его разметкой, а не сырыми символами: списки, выделение, код, таблицы, ссылки. Код для этого писать не надо — готовая библиотека уже используется в клиенте assistent.

5. Панель ввода

  • R14. Поле ввода, кнопка «Отправить» и отдельная кнопка записи микрофона.
  • R15. Подсказка о горячих клавишах под полем убирается — её не должно быть.
  • R16. Пока идёт запись, должно быть понятно, что сейчас пишется голос.
  • R17. Отмена записи — явная.
  • R18. Голос: кнопка включает микрофон и останавливает его. Точная механика (по нажатию или на удержание) — решим позже.
  • R19. Распознавание речи — отдельная тема, здесь не решается. Важно только: где кнопка, что видно во время записи, что происходит после.

6. Несколько агентов

  • R20. Предусмотреть возможность подключать несколько агентов и видеть их в одном клиенте. Не «много людей», а один клиент — несколько агентов.
  • R21. Возможный способ различения — по аватару: у каждого агента свой аватар, по нему и отличаем. Тема аватаров не продумана, это накидка.
  • R22. Другие возможные способы (на выбор, обсудить):
    • Цветовой акцент — у каждого агента свой цвет: полоса у пузыря ответа, цвет имени в шапке;
    • Группировка в списке — диалоги сгруппированы по агентам, с заголовком группы (как секции каналов);
    • Переключатель агента — как выбор аккаунта в Телеграме: все диалоги одного агента разом;
    • Метка в строке диалога — маленький значок/буква агента рядом с названием.
  • R23. У библиотеки уже есть всё для этого: агент создаётся вызовом с двумя значениями — имя и адрес. Имя клиент знает сам, сервер его не хранит. Каждому агенту — своё имя и адрес.

7. Состояние агента: сколько израсходовано

Здесь свериться с исходниками оказалось важнее всего. Ниже — по факту из кода, не по догадкам.

7.1. Что есть в самой библиотеке client (что клиент реально получает)

  • У каждого события и каждого сообщения есть дата. Значит доступно: длительность хода, сколько времени агент думал, когда пришёл ответ.
  • Есть события: начало ответа, рассуждение, текст по мере генерации, картинка, вызов инструмента (имя, аргументы, заголовок), результат инструмента, конец хода, прерывание, ошибка.
  • Есть события о диалогах: создан, удалён, переименован.
  • По диалогу: название, время последнего изменения, умеет ли принимать и отдавать картинки, временный он или постоянный.
  • Токенов, модели, цены, предела контекста — в библиотеке НЕТ. Ни одного числа. Проверено сплошным поиском: числовых полей в протоколе не существует вообще.

7.2. Что при этом ЕСТЬ внутри самого агента (но до клиента не доходит)

  • Токены по каждому ходу: сколько отправлено, сколько получено. Хранятся вместе с ответом ассистента.
  • Сумма по диалогу: число ходов, всего отправлено, всего получено.
  • Предел контекста — агент его знает из своих настроек.
  • Порог сжатия — при заполнении агент сокращает историю (по умолчанию на 80 %).

То есть цифры существуют, но лежат в агенте и в протокол не выведены.

7.3. Что из этого следует для интерфейса

  • R24. В макете сейчас нарисованы три поля, которых в библиотеке нет: «модель», «отправлено в модель», «получено от модели». Это заглушки. Либо выкидываем, либо доводим агент так, чтобы он их отдавал.
  • R25. Показывать надо только то, что есть. Остальное либо честно помечаем как отсутствующее, либо не рисуем вовсе.
  • R26. Кольцо заполнения имеет смысл, когда агент начнёт отдавать два числа: занято сейчас и предел. Тогда видно долю. Что именно считать «занятым» (последний ход или вся история) — уточнить.
  • R27. Всё, что показываем по цифрам, должно быть сверено с исходниками до отрисовки. Правило: нет данных — нет цифры.

8. Ход работы агента

  • R28. Показывать не только ответы ассистента, но и происходящее вокруг них: вызовы инструментов, рассуждения, ошибки.
  • R29. Свёрнутый вид — одна строка: кратко, что происходит (например, «вызов инструмента: такой-то»).
  • R30. Развёрнутый вид — подробности шага: аргументы, результат, время.
  • R31. Сворачивание и разворачивание — по нажатию на строку.

9. Решения, которые ещё не приняты

  • Запись: по нажатию или на удержание.
  • Нужны ли вложения (картинки) в этом клиенте.
  • Как именно различать агентов (см. R21–R22).
  • Доводим ли агент, чтобы он отдавал цифры по токенам.
  • Как выглядит кольцо и где живёт.

10. Как проверяем

Проверка — живой прогон, а не «собралось». Правило пользователя: перед показом гонять сценарий руками; на экран смотреть, а не верить описанию.