{/ Эта страница автоматически передается из навыков SKILL.md с помощью сайта/scripts/generate-skill-docs.py. Редактируйте исходный SKILL.md, а не эту страницу. /}
Воздушный стол
REST API Airtable через Curl. CRUD записи, фильтры, upsert.
Метаданные навыки
Источник
Встроенный (устанавливается по умолчанию)
Путь
навыки/производительность/airtable
Версия
1.1.0
Автор
сообщество
Лицензия
Массачусетский технологический институт
Платформы
Linux, MacOS, Windows
Теги
Airtable, Производительность, База данных, API
Справочник: полный SKILL.md:::информация
Ниже приведено полное описание навыка, который Hermes загружает при активации этого навыка. Это то, что агент видит в качестве инструкций, когда навыки активны.
Airtable — Базы, Таблицы и Записи
Работайте с REST API Airtable напрямую через «curl» с помощью инструмента «терминал». Никакого MCP-сервера, никакого OAuth-потока, никакого Python SDK — просто «curl» и персональный токен доступа.
Предварительные требования
Создайте Персональный токен доступа (PAT) на https://airtable.com/create/tokens (токены начинаются с pat...).
Важно: в том же интерфейсе токена добавьте все приложения, к которым вы хотите получить доступ, в списке Доступ токена. PAT ограничен по базам — фактический токен для неправильной базы возвращает 403.
Сохраните токен в ~/.hermes/.env (или через hermes setup):
AIRTABLE_API_KEY=pat_your_token_here
Примечание: конфиденциальность ключей API key... была объявлена закрытыми в феврале 2024 года. Сейчас работают только PAT и OAuth-токены.
-s блокирует индикатор прогресса завитка — удерживает его включенным для каждого вызова, чтобы вывести инструмент стабильно чистым для Hermes. Запускайте через python3 -m json.tool (всегда присутствует) или jq (если установлен) для читаемого JSON.
Типы полей (формы запроса тела)
Тип поля
Форма записи
Однострочный текст
"Имя": "привет"
Длинный текст
"Заметки": "multi\nline"
Число
"Счет": 42
Флажок
"Готово": правда
Одиночный выбор
"Status": "Todo" (имя должно уже существовать, если не typecast: true)
Множественный выбор
"Теги": ["срочно", "ошибка"]
Дата
"Срок": "2026-04-01"
Дата и время (UTC)
"В": "2026-04-01T14:30:00.000Z"
URL / Электронная почта / Телефон
"Ссылка": "https://…"
Вложение
"Files": [{"url": "https://…"}] (Airtable загружается и размещается у себя)
Передайте "typecast": true на верхний уровень создания/обновления тела, чтобы позволить Airtable автоматически преобразовывать значения (например, создать новый вариант выбора на лету, преобразовать "42" → 42).
Пакетные конечные точки ограничены 10 записями на запрос. Для больших вставок выполняйте цикл партиями по 10 с короткой паузой, чтобы соблюсти 5 запросов/сек/базу.
Обновить запись (PATCH — конверт, сохранить неизмененные поля)
performUpsert записывает значения полей слияния, которые новые, и обновляет записи, значения полей слияния, которые уже существуют. Отлично подходит для идемпотентных синхронизаций.
Конечная точка-ы возвращают максимум 100 записей на страницу. Если ответ включает "offset": "...", передайте его обратно в следующем вызове. Выполните цикл, пока отсутствует поле:
OFFSET=""while:;doURL="https://api.airtable.com/v0/$BASE_ID/$TABLE?pageSize=100"[-n"$OFFSET"]&&URL="$URL&offset=$OFFSET"RESP=$(curl-s"$URL"-H"Authorization: Bearer $AIRTABLE_API_KEY")echo"$RESP"|python3-c'import json,sys; d=json.load(sys.stdin); [print(r["id"], r["fields"].get("Name","")) for r in d["records"]]'OFFSET=$(echo"$RESP"|python3-c'import json,sys; d=json.load(sys.stdin); print(d.get("offset",""))')[-z"$OFFSET"]&&breakdone
Найдите ресурсы. Вы создайте список баз (шаг выше) ИЛИ запросите идентификатор пользователя app... напрямую, если у токена нет schema.bases:read.
Проверьте схему.GET /v0/meta/bases/$BASE_ID/tables — кэшируйте точные имена полей и имя первого локального поля в сеансе перед любыми изменениями.
Читайте перед записью. Для «обновить X, где Y» сначала используйте filterByFormula, чтобы получить идентификатор rec..., затем PATCH /v0/$BASE_ID/$TABLE/$RECORD_ID. Никогда не угадывайте идентификатор записи.
Пакетная запись. Объедините создание связи в одном POST на 10 записей, чтобы оставаться в рамках бюджета 5 запросов/сек.
Деструктивные операции невозможно. Удаления отмены через API. Если пользователь говорит «удалить все X», вы вводите обратно фильтр + количество записей и подтверждаете перед выполнением.
Подводные камни
filterByFormula ДОЛЖЕН быть URL-закодирован. Имена полей с пробелами или не-ASCII также необходимы в кодировании ({My Field} → %7BMy%20Field%7D). Используйте стандартную библиотеку Python (шаблон выше) — никогда не экранируйте вручную.
Пустые поля о выходе из конфликтов. Отсутствующий ключ "Цессионарий" не означает, что поле не существует — это означает, что значение этого записано пусто. Прежде чем делать вывод, проверьте схему (шаг 3), что поле отсутствует.
PATCH vs PUT.PATCH предоставил предоставленные поля в записи. PUT полностью заменяет запись и очищает любое поле, которое вы не включили. По умолчанию викор ПАТЧ.
Варианты одного выбора должны существовать. Запись "Status": "Shipping", когда Shipping` нет в полях списка вариантов, вызывает ошибкуINVALID_MULTIPLE_CHOICE_OPTIONS, если не передать"typecast": true` (который автоматически вызывает вариант).
Область действия токена по базам.403 на одной базе, в то время как работает другая, означает, что список токенов доступа не включает эти базы — это область не проблема или аутентификации. Отправьте пользователю ссылку https://airtable.com/create/tokens, чтобы определить доступ.
Лимиты скорости применяются к каждой базе, а не к токену. 5 запросов/сек по baseA и 5 запросов/сек по baseB — нормально; 6 запросов/сек только на baseA будет ограничено. Следите за заголовком «Повторить попытку» при «429».
Важные примечания для Hermes
Всегда используйте инструмент terminal с curl. НЕ используйте web_extract (он не может отправлять заголовки аутентификации) или browser_navigate (требует аутентификации через пользовательский интерфейс и замедление).
AIRTABLE_API_KEY автоматически активируется из ~/.hermes/.env в подпроцессе при включении этого навыка — нет необходимости повторно экспортировать его перед каждым вызовом curl.
Осторожно экранируйте фигурные скобки в формулах. В теле heredoc {Status} является литералом. В аргументе {Status} безопасно вне контекста подстановки {...} — но передавайте динамические строки через python3 urllib.parse.quote перед вставкой в URL.
Форматируйте вывод с помощью python3 -m json.tool (всегда присутствует), а не jq (опционально). Используйте jq только тогда, когда нужна фильтрация/проекция.
Пагинация постраничная, а не глобальная. Лимит Airtable в 100 записей — это жесткое ограничение; нет выхода его увеличить. Выполните цикл со смещением, пока поле не исчезнет.
Читайте массив errors в ответах, отличных от 2xx — Airtable возвращает структурированные коды ошибок, таких как AUTHENTICATION_REQUIRED, INVALID_PERMISSIONS, MODEL_ID_NOT_FOUND, INVALID_MULTIPLE_CHOICE_OPTIONS, которые точно говорят, что не так.