Навыки Проектирование спецификации ввода/вывода

Отличный навык не только выполняет задачи, но и чётко определяет, «что он принимает» и «что он выдаёт».

Хорошие спецификации ввода/вывода — основа надёжной работы навыка.


Зачем определять спецификации ввода/вывода

Навыки работают с реальными запросами пользователей, и форматы ввода бесконечно разнообразны.

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

Спецификации — это не ограничения, а чёткие границы действий для Claude, снижающие неоднозначность и повышающие согласованность вывода.


Четыре элемента спецификаций ввода

Элемент Описание Пример
Тип ввода Файлы, текст, URL, параметры и т. д. PDF-файл, загруженный пользователем
Требования к формату Расширение файла, кодировка, структура .csv, кодировка UTF-8, первая строка — заголовок
Обязательный/Необязательный Какие входные данные обязательны Путь к файлу обязателен, имена столбцов необязательны
Поведение по умолчанию Как обрабатывать, когда необязательные параметры не указаны Анализировать все столбцы, если имена столбцов не указаны

Определение спецификаций входных данных в SKILL.md

Пример

## Спецификации входных данных

### Обязательные входные данные

- **Файл данных**: загруженный пользователем`.csv`или`.xlsx`файл
- Кодировка: UTF-8(CSV) или стандартный формат Excel
- Первая строка должна содержать заголовки столбцов
- Размер файла не должен превышать 50MB

### Необязательные входные данные

- **Целевые столбцы**: Укажите, какие столбцы анализировать; по умолчанию анализируются все числовые столбцы
- **Формат вывода**:`table`(таблица) или`text`(текстовая сводка), по умолчанию`table`
- **Точность**: Количество сохраняемых десятичных знаков, по умолчанию2bits

### Обработка отсутствующих входных данных

Если файл не загружен, сообщите пользователю:"Пожалуйста, загрузите CSV или Excel файл для анализа."
Если формат файла не поддерживается, сообщите пользователю и перечислите поддерживаемые форматы.

Три измерения спецификаций вывода

Измерение 1: Содержание вывода

Чётко указывайте, какое содержимое нужно выводить, избегая пропусков или избыточного вывода.

Пример

## Содержимое вывода

После завершения анализа предоставьте следующее:

1. **Сводная статистическая таблица**: Количество строк, среднее, максимум для каждого столбца/Минимальное значение, количество null-значений
2. **Отчёт о качестве данных**: Перечислите обнаруженные проблемы (например, слишком много null-значений, смешанные типы данных)
3. **Путь к файлу**: Если создаются выходные файлы, укажите пути для скачивания

Измерение 2: Формат вывода

Укажите формат, в котором представляется вывод, и где он хранится.

Место вывода Формат Путь хранения
Отображение в диалоге Таблицы Markdown, блоки кода Хранение не требуется
Файл для скачивания .xlsx、.pdf、.html /mnt/user-data/outputs/
Промежуточный результат JSON、CSV /home/claude/(временный)

Измерение 3: Момент вывода

Укажите, когда выводить данные, выводить ли всё сразу или отображать постепенно по шагам.

Пример

## Момент вывода

1. **После чтения файла**: Немедленно сообщите пользователю базовую информацию о файле (количество строк, количество столбцов, размер)
2. **Во время анализа**: Если анализ занимает больше10секунд, сначала выведите уведомление о ходе выполнения
3. **После завершения анализа**: Выведите полную статистическую сводку
4. **После создания файла**: Отобразите путь к файлу и вызовите инструмент present_files

Пример полной спецификации ввода/вывода

Ниже приведена полная спецификация ввода/вывода для навыка суммирования документов:

Пример

---
имя: doc-summarizer
описание: >
Извлекайте краткие содержания из загруженных пользователем документов, поддерживая PDF, Word (.docx) и обычный текст.
Используйте, когда пользователям нужно быстро понять содержимое документа, извлечь ключевую информацию или создать краткое содержание документа.
---

# Суммаризатор документов

## Спецификации входных данных

### Обязательно
- Файл документа (.pdf, .docx или .txt)

### Необязательно
- **Длина резюме**:`короткая`(3предложения)/ `средняя`(1абзац(ы))/ `длинная`(3абзацев), по умолчанию`средний`
- **Язык**: Язык вывода, по умолчанию совпадает с языком исходного текста
- **Направление фокусировки**: Например"Сосредоточьтесь на разделе с выводами"、"Извлеките числовые данные"

### Обработка исключений
- Файл превышает 10MB: сообщите пользователю, что файл слишком большой, и предложите загрузить его после разделения
- Неподдерживаемый формат: перечислите поддерживаемые форматы и попросите пользователя загрузить файл повторно
- Документ является отсканированным изображением, и текст не может быть распознан: сообщите пользователю, что его нельзя обработать, и рекомендуйте предварительную обработку с помощью OCR-инструмента

## Спецификации вывода

### Содержание вывода (по порядку)
1. Базовая информация о документе: заголовок (если есть), количество страниц, примерное количество слов
2. Основная сводка: выводите в соответствии с указанной пользователем длиной
3. Ключевые слова:5-8ключевые слова темы

### Формат вывода
- Отображайте всё в диалоге, используя формат Markdown
- Не создавайте дополнительные файлы, если пользователь явно не запросит их сохранение

### Пример вывода
---
**Документ**:example-annual-report.pdf(24страниц, примерно12,000 слов)

**Резюме**: В этом отчёте рассматриваются годовые бизнес-показатели example, при этом число пользователей растёт год к году35%,
Покрытие технической документации выросло до98%. Структура выручки становится более диверсифицированной, при этом доли выручки от рекламы и членства примерно равны.

**Ключевые слова**: Годовой отчёт, рост пользователей, техническая документация, структура выручки, диверсификация
---

Соглашения по вводу/выводу на уровне скрипта

Если Skill поставляется со скриптами, рекомендуется использовать JSON в качестве структурированного формата ввода/вывода, чтобы Claude мог легко разбирать результаты.

Пример

# Путь к файлу: scripts/summarize.py
# Стандартизированный шаблон ввода/вывода JSON

import json
import sys

def summarize(file_path: str, length: str = "medium") -> dict:
    """
Суммировать документ

Параметры:
file_path: Путь к документу (обязательно)
length: Длина сводки, short/medium/long (необязательно, по умолчанию medium)

Возвращает:
dict, содержащий поля status, data или error
    """

    try:
        # Имитация чтения документа
        with open(file_path, "r", encoding="utf-8") as f:
            content = f.read()

        # Имитация создания сводки
        summary = content[:200] + "..."  # Здесь следует вызвать реальную логику суммирования

        return {
            "status": "success",
            "data": {
                "word_count": len(content),
                "summary": summary,
                "length": length
            }
        }

    except FileNotFoundError:
        return {"status": "error", "error": f"Файл не найден: {file_path}"}
    except Exception as e:
        return {"status": "error", "error": str(e)}

if __name__ == "__main__":
    file_path = sys.argv[1] if len(sys.argv) > 1 else ""
    length    = sys.argv[2] if len(sys.argv) > 2 else "medium"

    result = summarize(file_path, length)

    # Вывод унифицированного JSON для парсинга Claude
    print(json.dumps(result, ensure_ascii=False, indent=2))
{
  "status": "success",
  "data": {
    "word_count": 12480,
    "summary": "example 年度报告回顾了平台在过去一年的业务表现...",
    "length": "medium"
  }
}

Использование JSON в качестве формата вывода скрипта позволяет Claude стабильно разбирать результаты без необходимости прибегать к догадкам при интерпретации свободного текста.

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