Коли ШІ-агенти приєднуються до Yjs-кімнат, три припущення руйнуються
Додавання LLM як повноцінного піра (first-class peer) у Yjs — це розумний архітектурний хід. Однак це руйнує приховані припущення вашого стека для спільної роботи щодо симетрії пірів.
Більшість систем припускають, що всі піри працюють із людською швидкістю. Коли ШІ-агент генерує 3000 слів за хвилину, це порушує три основні аспекти: пропускну здатність, право власності на undo та темп присутності (presence cadence).
Ось як це виправити.
- Усуньте голодування записів (Write Starvation)
У моделі CRDT немає центрального сервера для обмеження швидкості (throttling) клієнтів. Агент може заповнити цикл синхронізації постійними записами. Це позбавляє користувачів-людей їхньої частки вікна збіжності (convergence window), що призводить до затримок курсора та втрати оновлень.
Виправлення має бути на рівні додатка, а не на транспортному рівні. Використовуйте алгоритм token bucket між потоком LLM та записом у Yjs, щоб обмежити швидкість агента.
• Встановіть ліміт (capacity) для черги операцій. • Встановіть швидкість поповнення (refill rate), щоб тримати агента нижче порогу, який спричиняє «голодування» людей.
- Ізолюйте історію Undo
Якщо агент має спільне походження (origin) з користувачем, Ctrl+Z перетворюється на хаос. Ви не зможете відрізнити людську помилку від пропозиції ШІ.
Надайте агенту його власне походження. Використовуйте окремий UndoManager для агента.
• UndoManager користувача відстежує лише дії людини. • UndoManager агента обробляє дії, специфічні для ШІ. • Винесіть «Відхилити пропозицію ШІ» як окрему кнопку в інтерфейсі, замість того щоб прив'язувати її до стандартного Ctrl+Z.
- Об'єднуйте оновлення присутності (Presence Updates)
ШІ-агент створює зміни позиції швидше, ніж людина може їх побачити. Трансляція кожної окремої зміни створює шум у циклі рендерингу.
Ви повинні по-іншому керувати присутністю агента:
• Об'єднуйте оновлення awareness через фіксований інтервал, а не для кожної окремої операції.
• Додайте поле type до стану awareness (наприклад, type: 'agent').
• Використовуйте цей тип, щоб наказати рівню рендерингу по-іншому обробляти курсор.
Патерн agent-as-peer — це правильний шлях розробки. Виклик полягає в тому, щоб зробити ваші припущення явними. Не ставте обмеження швидкості (rate limiting), ізоляцію undo та об'єднання присутності (presence coalescing) у розряд пограничних випадків. Ставте їх у розряд основних вимог.
Source: https://dev.to/norfolkd/when-an-ai-agent-joins-your-yjs-room-three-assumptions-break-50h8