Управление контекстом и состоянием Skills

Каждый вызов Claude API не сохраняет состояние; он не запоминает автоматически содержимое предыдущей сессии.

Но в непрерывной беседе все исторические сообщения находятся в пределах контекстного окна. Понимание этого помогает писать Skills, которые стабильно работают в беседах.


Где хранится состояние Skills?

Тип состояния Место хранения Область действия
История диалогов Контекстное окно Текущий сеанс, исчезает при закрытии
Промежуточные файлы /home/claude/ Текущий сеанс, может быть очищен после завершения задачи
Выходные файлы /mnt/user-data/outputs/ Постоянные, доступные для скачивания пользователем
Установленный навык /mnt/skills/ Персистентность между сессиями

Сами навыки не имеют возможностей базы данных или постоянного хранилища. Данные, которые нужно сохранять между сеансами, должны сохраняться пользователем (например, скачанные файлы) или записываться в постоянный каталог вывода.


Управление состоянием многоходового диалога в SKILL.md

Для навыков, требующих многоходового взаимодействия, логика потока состояния диалога должна быть чётко определена в SKILL.md.

Пример

## Процесс многоходового взаимодействия

Этот навык выполняется в три этапа:

### Этап 1: Сбор информации
Попросите пользователя предоставить следующую информацию:
1. Путь к файлу данных
2. Цель анализа

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

### Этап 2: Подтверждение и выполнение
После завершения сбора отобразите план выполнения и дождитесь подтверждения пользователя:
>Я буду{имя файла}выполнять{цель анализа}, ориентировочно это займет около{время}секунд. Подтвердите, чтобы продолжить?

### Этап 3: Выполнение и вывод
Выполните после подтверждения пользователя, сообщайте о ходе выполнения в реальном времени и выведите результат по завершении.

Если пользователь на любом этапе скажет"Restart", очистите текущую собранную информацию и вернитесь к этапу 1.

Используйте файлы для сохранения промежуточного состояния

Для сложных многошаговых задач промежуточное состояние можно записать в JSON-файл, чтобы реализовать передачу состояния между шагами.

Пример

# Путь к файлу: scripts/state_manager.py
import json
import os
from datetime import datetime

# Путь хранения файла состояния (рабочий каталог текущей сессии)
STATE_FILE = "/home/claude/skill_state.json"

def save_state(state: dict) -> None:
    """Сохранить текущее состояние выполнения в файл"""
    state["updated_at"] = datetime.now().isoformat()
    with open(STATE_FILE, "w", encoding="utf-8") as f:
        json.dump(state, f, ensure_ascii=False, indent=2)
    print(f"Состояние сохранено: {STATE_FILE}")

def load_state() -> dict:
    """Загрузить последнее сохраненное состояние; вернуть начальное состояние, если оно не существует"""
    if not os.path.exists(STATE_FILE):
        return {
            "phase":      "collecting",  # Текущая фаза: collecting / confirming / executing / done
            "file_path":  None,
            "target":     None,
            "result":     None,
            "created_at": datetime.now().isoformat()
        }
    with open(STATE_FILE, "r", encoding="utf-8") as f:
        return json.load(f)

def clear_state() -> None:
    """Очистить состояние (для сценария "Restart")"""
    if os.path.exists(STATE_FILE):
        os.remove(STATE_FILE)
    print("Состояние очищено, перезапуск")

# Пример использования
if __name__ == "__main__":
    # Загрузить или инициализировать состояние
    state = load_state()
    print(f"Текущая фаза: {state['phase']}")

    # Обновить состояние: собранный путь к файлу
    state["file_path"] = "/mnt/user-data/uploads/example_data.csv"
    state["phase"]     = "confirming"
    save_state(state)
状态已保存:/home/claude/skill_state.json
当前阶段:collecting
状态已保存:/home/claude/skill_state.json

Предотвратить загрязнение контекста

Когда пользователь запускает Skill несколько раз в одном и том же разговоре, старые параметры в истории разговора могут "загрязнить" новое выполнение.

Чёткое указание приоритета в SKILL.md может помочь избежать таких проблем.

Пример

## Правила приоритета параметров

Если в одном и том же разговоре существует несколько наборов параметров, обрабатывайте их в соответствии со следующим приоритетом:

1. **Параметры, явно указанные в последнем сообщении пользователя**→ Наивысший приоритет, всегда использовать
2. **Файлы, загруженные в этом запросе**→ Высокий приоритет
3. **Параметры, упомянутые в истории диалога**→ Низкий приоритет, использовать только если не указаны в текущем сообщении
4. **Значения по умолчанию, определённые навыком**→ Резервный вариант

Если есть сомнения относительно источника параметров, подтвердите у пользователя перед выполнением:«Я буду использовать example_v2.csv (файл, который вы только что загрузили) вместо предыдущего example_v1.csv, верно?»

Связь между длиной контекста и производительностью

По мере увеличения длины диалога содержимое контекстного окна растёт, и затраты Claude на его обработку также увеличиваются.

Для длительно работающих многоходовых навыков следует учитывать следующие стратегии оптимизации:

Стратегия Метод Эффект
Избегайте повторного вывода больших фрагментов содержимого Ссылайтесь на ранее выведенные пути к файлам вместо повторного вывода содержимого Сократите использование контекста
Используйте файлы для передачи промежуточных данных Записывайте большие наборы данных в файлы и передавайте в разговоре только пути Не допускайте, чтобы большие данные заполняли контекст
Своевременно сообщайте пользователю о завершении этапа После каждого этапа явно говорите "Первый шаг завершён" Сообщайте пользователю о прогрессе и сокращайте количество уточняющих вопросов

Окно контекста — ограниченный ресурс. Чем больше объём данных, передаваемых в Skill, тем меньше остаётся места для рассуждений и генерации, и качество ответов может снижаться. Для больших файлов всегда передавайте через пути к файлам, а не содержимое.

Другие расширения