Найти в Дзене
“Gorilla Guerrilla”

Как легко создавать краткие изложения веб-страниц с помощью Fabric в Alfred и Apple Shortcuts

Автоматизация
ActionsforObsidian, AlfredApp, Automation, Fabric, LLM, macOS, Obsidian

Введение в использование Fabric с Alfred и Apple Shortcuts
Как я обещал в своей предыдущей статье, в этой статье я хочу показать, как можно использовать Fabric в рабочих процессах с приложением Alfred, а также в Apple Shortcuts. Для приложения Alfred требуется платный пакет PowerPack.

Для этого я хочу использовать пример вызова из предыдущей статьи, который уже создавал краткое изложение веб-страницы в командной строке. По сути, это задача, которую лучше выполнять одним нажатием клавиши или щелчком мыши.

Вот еще раз вызов для напоминания:

wget -qO- https://ileif.de/2024/08/07/automatisierung-von-apple-kurzbefehlen-mit-shortery/ | pandoc -f html -t plain | fabric -sp summarize


Рабочий процесс в Alfred

Цель — создать рабочий процесс для Alfred, который с помощью комбинации клавиш, например, ⌃⌥F, возьмет URL-адрес активного окна браузера, создаст краткое изложение и сохранит его в моем хранилище Obsidian в папке «17 WebSiteSummaries». Заметка должна носить название веб-сайта и содержать область свойств, где, помимо прочего, URL-адрес страницы будет установлен как «source», а тег — «fabric».

Скрипты Shell, а также скрипты Python всегда выполняются в среде, где пути поиска, переменные, а в случае Python также установленные библиотеки, определяются одним или несколькими конфигурационными файлами. Для терминала существует определенный порядок загрузки определенных конфигураций. Дополнительно в Python добавляются виртуальные среды. Однако при выполнении скриптов в таких инструментах, как Alfred или Shortcuts, загружаются только минимальные конфигурационные файлы, из-за чего могут отсутствовать важные пути поиска для определенных программ. Как решить эту проблему для Python и виртуальных сред, я описал в статье «Использование скриптов Python в рабочих процессах Alfred с виртуальными средами».

Я перенёс этот подход на выполнение скриптов Shell. Теоретически можно загрузить весь файл ~/.zshrc, но мне нужны только пути поиска для Go, а также включение определения псевдонимов. При необходимости также необходимо добавить путь поиска для приложений Homebrew:

export PATH="$PATH:$HOME/go/bin:$HOME/Applications"
if [ -f "$HOME/.config/fabric/fabric-bootstrap.inc" ];
then . "$HOME/.config/fabric/fabric-bootstrap.inc";
fi

Этот файл у меня хранится в $HOME/.fabenv и может быть загружен оттуда. О том, что такое if ... fi, я уже писал в предыдущей статье.

Рабочий процесс в приложении Alfred выглядит следующим образом:

-2

В качестве триггера я использую триггер горячих клавиш, который вызывает «Current Front Browser Tab». Поскольку нам нужны как URL-адрес, так и название веб-страницы, в действии необходимо установить «Output Format» в «URL⇥Title». Таким образом, URL-адрес и название, которые передаются в качестве строки в «Split Arg» с разделителем TAB, в свою очередь, с настройками «Split with Tab», «Output as Vaiables» и «Varable Prefix split», передаются в действие «Run Script».

Здесь в заголовке установлено «Language: /bin/zsh — ‑norcs», «with input as argv “ и ”running instances: Sequentially». В область скрипта вставлен и изменен этот скрипт:

# Передача параметров из модуля Split
url=$split1
title=$split2
# Загрузить конфигурационный или инициализационный файл '.fabenv', который находится по указанному пути
# Этот файл содержит необходимую информацию о путях и переменные среды
source $HOME/.fabenv
# Обработать название: заменить все вхождения ':' и '/' на '-'
# Это необходимо, поскольку ':' и '/' являются недопустимыми символами в именах файлов
FILENAME=$(echo "$title" | sed 's/[:\/]/-/g')
# Определить целевой каталог, в который будет сохранен файл Markdown
# Путь содержит пробелы, поэтому он заключен в кавычки
TARGET_DIR="$HOME/Documents/01 Meine Dokumente/ObsidianNotes/17 WebSiteSummaries"
# Установить полное имя файла с расширением .md
# Имя файла основано на очищенном названии
FULL_FILENAME="${FILENAME}.md"
# Создать файл Markdown в целевом каталоге с блоком Frontmatter
{
echo "---"
echo "source: ${url}"
echo "erstellt:"
echo "geändert:"
echo "tags: fabric"
echo "---"
echo ""
} > "${TARGET_DIR}/${FULL_FILENAME}"
# Выполнить команду 'wget', чтобы получить содержимое URL-адреса и перенаправить его через канал в 'pandoc'
# 'pandoc' конвертирует HTML-содержимое в обычный текст
# 'fabric' создает краткое изложение текста на немецком языке
# Вывод добавляется в конец уже созданной заметки
wget -qO- $url | pandoc -f html -t plain | fabric -sp summarize_german | >> "${TARGET_DIR}/${FULL_FILENAME}"
# Добавить дополнительную информацию в конец заметки
{
echo ""
echo "---"
echo "Ordner: `=this.file.folder`"
} >> "${TARGET_DIR}/${FULL_FILENAME}"

В области свойств заметки я вставил ключи «erstellt:» и «geändert:», которые в моем хранилище автоматически заполняются плагином Update time on edit. Кроме того, эта заметка помечается тегом «fabric». Я также определил нижний колонтитул, который присутствует во всех моих заметках, и с помощью плагина DataView отображается папка, в которой находится заметка. Остальные комментарии в скрипте должны содержать достаточные пояснения.

В конце рабочего процесса отображается уведомление после завершения выполнения скрипта. Поскольку ответ LLM часто занимает несколько секунд, может случиться, что заметка будет записана в хранилище и отображена уже с областью свойств, а остальное содержимое еще не будет доступно. То есть может пройти несколько секунд, пока весь текст появится в заметке.

Не все веб-страницы можно получить таким образом. Если wget не может правильно извлечь текст из HTML, вместо него будет сгенерирован произвольный текст, который может не иметь никакого отношения к фактической веб-странице.

Вот и рабочий процесс для Alfred, который должен работать во всех браузерах на основе Webkit и Chrome. В Firefox, однако, он не работает.

Apple Shortcut
Изначально я хотел реализовать Apple Shortcut с помощью аналогичного скрипта, что и в решении для Alfred. URL-адрес текущей веб-страницы должен был передаваться в скрипт и использоваться там. Однако оказалось, что при действии «Ввод URL из содержимого экрана» в действие «Выполнить скрипт Shell» передается не URL-адрес, а путь к локальной копии HTML-файла веб-страницы.

Небольшой тестовый Shortcut показывает эту проблему:

-3

После того, как «Ввод URL из содержимого экрана» был вызван в активном окне браузера, в действии «Показать результат» действительно отображается URL-адрес веб-страницы:

-4

Но скрипт Shell получает совершенно другие данные, как показывает второе отображение результата:

-5

К сожалению, я не сразу провел этот тест, поэтому в итоге потратил некоторое время на анализ проблемы.

Еще один момент, который потребовал времени, — это различное содержимое переменной $PATH в Alfred и Shortcuts. В то время как в Alfred путь к командам, установленным с помощью Homebrew, был указан в пути поиска, в версии Apple Shortcuts этого пути не было.

Решение, которое обходится без команд Homebrew, в конечном итоге немного проще, но я все же хотел задокументировать эти препятствия.

Apple Shortcut
В качестве решения я воспользовался тем фактом, что с помощью опции «Получить содержимое экрана» создается локальная копия веб-страницы, а путь к этому файлу передается при вызове скрипта Shell в действии «Выполнить скрипт Shell». Будет ли это функцией или ошибкой, которая когда-нибудь будет исправлена, покажет время.

Скрипт Shell выглядит следующим образом:

source $HOME/.favenv
cat $1 | fabric -sp summarize_german

*я работаю на немецком, вам надо заменить german на russian!

И вот как работает этот процесс:

  1. URL-адрес и название веб-страницы передаются в Shortcut и сохраняются в соответствующих переменных.
  2. В действие «Выполнить скрипт Shell» через переменную URL передается путь к локальному HTML-файлу.
  3. В скрипте сначала с помощью конфигурационного файла расширяется путь поиска Go-специфичными путями. Затем содержимое локального HTML-файла передается в fabric и обрабатывается LLM с помощью паттерна summarize_german.
  4. Вывод скрипта Shell сохраняется в переменной Text. Затем в текстовом формате составляется заметка, включая область свойств и нижний колонтитул.
  5. Этот текст затем сохраняется в хранилище Obsidian.

Для сохранения заметки в хранилище Obsidian я использую расширение Shortcut Actions for Obsidian с действием «Create Note». В качестве альтернативы можно использовать действие «Сохранить файл», но в контексте Obsidian стоит потратить немного денег на Actions for Obsidian.

В целом, это выглядит следующим образом:

-6

Как и в рабочем процессе для Alfred, может случиться, что определенные веб-страницы не будут доступны. В этом случае в зависимости от используемого LLM в качестве вывода появится произвольный текст.

Заключение и перспективы на будущее
Я надеюсь, что в этой статье я не только представил полезный инструмент, но и предложил отправную точку для собственных решений по интеграции Fabric в другие рабочие процессы. Я использовал Alfred и Apple Shortcuts, но убежден, что эти подходы можно применять и в Raycast, а также в других инструментах для рабочих процессов.

Оба примера рабочих процессов, безусловно, еще не полностью доработаны. Например, в обоих отсутствует обработка ошибок. Кроме того, я могу представить себе, что через диалог выбора можно было бы выбирать другие паттерны. Кроме того, рабочие процессы выполняются локально на моем MacBook Pro, поэтому я еще не проверял, можно ли с помощью действия «Удаленный скрипт Shell» выполнить вызов Fabric на сервере. Пока в работе не задействованы локальные LLM, для этого, по сути, должен хватить Raspberry Pi. Таким образом, Shortcut мог бы работать и на iPad, и на iPhone.

Поэтому вполне возможно, что я представлю еще несколько приложений в этом блоге.

Как всегда, критика, исправления и похвала приветствуются в комментариях.