Урок 07 · память

Состояние записывается на диск, выдерживая сжатие.

「State that survives compression — because it's outside the conversation.」

⏱ ~10 мин · 📝 3 интерактивных компонента · 🧑‍💻 На основе shareAI-lab · s07_task_system.py

В чем разница между TodoWrite и Task?

TodoManager

s03 также может отображать список задач, но он хранится в памяти. Как только срабатывает auto_compact, упомянутый в s06, messages[] заменяются сводкой, а статус TodoManager исчезает (поскольку он находится в памяти).

s07 Task отличается: каждая задача представляет собой файл .tasks/task_42.json. Независимо от того, сжат ли контекст, перезапущен процесс или заменен агент — пока файл на диске существует, задача все еще существует.

# .tasks/task_12.json
{
  "id": 12,
  "subject": "Рефакторинг промежуточного программного обеспечения аутентификации",
  "description": "Извлечь логику JWT в общий модуль",
  "статус": "ожидание",
  "blockedBy": [8, 11], # Необходимо выполнить №8 и №11
  "владелец": ""
Правила выбора: используйте todo для временных задач (забудьте об этом, как только закончите); используйте task для постоянных задач (сохраняющихся между сеансами и зависимых).

BlockedBy · Характер графика зависимостей

blockedBy — это список идентификаторов задач. Они должны быть завершены, прежде чем текущая задача станет «исполняемой».

Реализация s07 имеет изящную деталь: Когда задача завершена, она автоматически удаляется из списка заблокированных всех остальных задач.

def _clear_dependentency(self, Completed_id: int):
    # Сканировать каждую задачу, удалять завершенные_id из их заблокированных
    for f in self.dir.glob("task_*.json"):
        задача = json.loads(f.read_text())
        ifcomplete_id in Task.get("blockedBy", []):
            задача["blockedBy"].remove(completed_id)
            self._save(task)

Таким образом, агенту не нужно вести отдельную таблицу «какие задачи разблокированы» — просто пройдите по .tasks/ и найдите status=="pending" и notblockBy, которые теперь являются исполняемыми.

Взаимодействие с графом зависимостей

В виджете ниже представлен график зависимостей из 5 задач. Нажмите «Завершить», чтобы увидеть, какие задачи заблокированы автоматически обновляются и какие задачи становятся «исполняемыми» (выделены зеленым).

Может ли он выжить после сжатия?

s06 упомянул, что auto_compact заменит messages[] сводкой. Но на задачу это не влияет, поскольку она находится на диске. Протестируйте. Позвольте агенту выполнить 5 задач. После сжатия диалога он сканирует .tasks/ и может продолжить работу с того места, где был.

Интерактив

Виджет 1 · График зависимостей · Нажмите «Завершить», чтобы просмотреть обновления зависимостей.

Топологическая связь 5 задач. Нажмите кнопку на любой ожидающей задаче, чтобы изменить ее статус и наблюдать за изменениями в массиве «blockBy» и списке «следующий исполняемый файл».

Task 列表(.tasks/ 目录)
当前可执行(status=pending, blockedBy=[])
依赖关系图
Интерактив

Виджет 2 · Выживание при сжатии · выживание задачи auto_compact

Пусть агент создаст 3 задачи, потом сработает auto_compact (сообщения очистятся), а потом восстановится - посмотрим, остались ли задачи.

.tasks/ 目录
messages[]
Интерактив

Виджет 3 · Цепочка зависимостей · Дайте вам картинку, чтобы ответить, какие задачи можно активировать сейчас.

Зависимости 5 задач. Ответ: Какие следующие шаги можно предпринять в данной ситуации (возможны несколько вариантов ответа).

答对 0 / 4