sidebar_position: 11
title: "Feishu / Lark"
description: "Set up Hermes Agent as a Feishu or Lark bot"
lang: ru
Настройка Фейшу/Жаворонка
Агент Hermes интегрируется с Feishu и Lark как полнофункциональный бот. После подключения вы можете общаться с агентом в прямых сообщениях или групповых чатах, получать результаты заданий cron в домашнем чате и отправлять текст, изображения, аудио и вложения файлов через обычный поток шлюза.
Интеграция поддерживает оба режима подключения:
websocket — рекомендуется; Hermes открывает исходящее соединение, и вам не требуется общедоступная конечная точка веб-перехватчика.
webhook — полезно, если вы хотите, чтобы Feishu/Lark отправлял события в ваш шлюз через HTTP.
Как ведет себя Гермес
Контекст
Поведение
Прямые сообщения
Гермес отвечает на каждое сообщение.
Групповые чаты
Hermes отвечает только тогда, когда бот @упоминается в чате.
Общие групповые чаты
По умолчанию история сеансов изолирована для каждого пользователя внутри общего чата.
Такое поведение общего чата контролируется config.yaml:
group_sessions_per_user:true
Установите значение false только в том случае, если вы явно хотите, чтобы в каждом чате был один общий разговор.
Шаг 1. Создайте приложение Feishu/Lark
Рекомендуется: сканирование и создание (одна команда)
hermesgatewaysetup
Выберите Feishu / Lark и отсканируйте QR-код с помощью мобильного приложения Feishu или Lark. Hermes автоматически создаст бот-приложение с правильными разрешениями и сохранит учетные данные.
Альтернатива: ручная настройка
Если сканирование для создания недоступно, мастер возвращается к ручному вводу:
В разделе Учетные данные и основная информация скопируйте Идентификатор приложения и Секрет приложения.
Включите функцию Бот для приложения.
Запустите hermes gateway setup, выберите Feishu / Lark и введите учетные данные при появлении запроса.
:::предупреждение
Держите секрет приложения в тайне. Любой, у кого он есть, может выдать себя за ваше приложение.
Шаг 2. Выберите режим подключения
Рекомендуется: режим WebSocket.
Используйте режим WebSocket, когда Hermes работает на вашем ноутбуке, рабочей станции или частном сервере. Публичный URL-адрес не требуется. Официальный Lark SDK открывает и поддерживает постоянное исходящее соединение WebSocket с автоматическим повторным подключением.
FEISHU_CONNECTION_MODE=websocket
Требования: Должен быть установлен пакет websockets Python. SDK управляет жизненным циклом соединения, контрольными сигналами и автоматическим повторным подключением внутри компании.
Как это работает. Адаптер запускает клиент WebSocket из Lark SDK в фоновом потоке исполнителя. Входящие события (сообщения, реакции, действия карты) отправляются в основной цикл asyncio. При отключении SDK попытается автоматически повторно подключиться.
Необязательно: режим веб-перехватчика
Используйте режим веб-перехватчика только в том случае, если вы уже запускаете Hermes за доступной конечной точкой HTTP.
FEISHU_CONNECTION_MODE=webhook
В режиме веб-перехватчика Hermes запускает HTTP-сервер (через aiohttp) и обслуживает конечную точку Feishu по адресу:
/feishu/webhook
Требования: Должен быть установлен пакет aiohttp Python.
Вы можете настроить адрес и путь привязки сервера веб-перехватчика:
Когда Feishu отправляет запрос на проверку URL-адреса (type: url_verification), веб-перехватчик отвечает автоматически, и вы можете завершить настройку подписки в консоли разработчика Feishu.
Шаг 3: Настройте Гермес
Вариант А: Интерактивная настройка
hermesgatewaysetup
Выберите Фейшу/Жаворонок и заполните подсказки.
Вариант Б: настройка вручную
Добавьте следующее в ~/.hermes/.env:
FEISHU_APP_ID=cli_xxx
FEISHU_APP_SECRET=secret_xxx
FEISHU_DOMAIN=feishu
FEISHU_CONNECTION_MODE=websocket
# Optional but strongly recommendedFEISHU_ALLOWED_USERS=ou_xxx,ou_yyy
FEISHU_HOME_CHANNEL=oc_xxx
FEISHU_DOMAIN принимает:
feishu для Feishu China
lark для Lark International
Шаг 4: Запустите шлюз
hermesgateway
Затем отправьте сообщение боту от Feishu/Lark, чтобы подтвердить, что соединение установлено.
Домашний чат
Используйте /set-home в чате Feishu/Lark, чтобы пометить его как домашний канал для результатов заданий cron и кроссплатформенных уведомлений.
Вы также можете предварительно настроить его:
FEISHU_HOME_CHANNEL=oc_xxx
Безопасность
Белый список пользователей
Для производственного использования установите белый список Feishu Open ID:
FEISHU_ALLOWED_USERS=ou_xxx,ou_yyy
Если вы оставите белый список пустым, любой, кто сможет связаться с ботом, сможет им воспользоваться. В групповых чатах список разрешенных проверяется по open_id отправителя перед обработкой сообщения.
Ключ шифрования вебхука
При работе в режиме веб-перехватчика установите ключ шифрования, чтобы включить проверку подписи входящих полезных данных веб-перехватчика:
FEISHU_ENCRYPT_KEY=your-encrypt-key
Этот ключ находится в разделе Подписки на события конфигурации вашего приложения Feishu. Если этот параметр установлен, адаптер проверяет каждый запрос веб-перехватчика с использованием алгоритма подписи:
SHA256(timestamp + nonce + encrypt_key + body)
Вычисленный хэш сравнивается с заголовком x-lark-signature с использованием безопасного по времени сравнения. Запросы с недействительными или отсутствующими подписями отклоняются с помощью HTTP 401.
:::совет
В режиме WebSocket проверка подписи выполняется самим SDK, поэтому FEISHU_ENCRYPT_KEY является необязательным. В режиме веб-перехватчика настоятельно рекомендуется использовать его в рабочей среде.
Токен подтверждения
Дополнительный уровень аутентификации, который проверяет поле token внутри полезных данных веб-перехватчика:
FEISHU_VERIFICATION_TOKEN=your-verification-token
Этот токен также можно найти в разделе Подписки на события вашего приложения Feishu. Если этот параметр установлен, каждая входящая полезная нагрузка веб-перехватчика должна содержать соответствующий token в своем объекте header. Несовпадающие токены отклоняются с помощью HTTP 401.
Оба FEISHU_ENCRYPT_KEY и FEISHU_VERIFICATION_TOKEN могут использоваться вместе для глубокоэшелонированной защиты.
Политика групповых сообщений
Переменная среды FEISHU_GROUP_POLICY определяет, будет ли Гермес отвечать в групповых чатах и если да, то каким образом:
FEISHU_GROUP_POLICY=allowlist# default
Значение
Поведение
open
Hermes отвечает на @упоминания любого пользователя в любой группе.
allowlist
Hermes отвечает только на @упоминания пользователей, перечисленных в FEISHU_ALLOWED_USERS.
disabled
Гермес полностью игнорирует все групповые сообщения.
Во всех режимах бот должен быть явно @упомянут (или @all) в группе перед обработкой сообщения. Прямые сообщения всегда обходят эти ворота.
Установите FEISHU_REQUIRE_MENTION=false, чтобы Hermes мог читать весь групповой трафик без необходимости @упоминания:
FEISHU_REQUIRE_MENTION=false
Для управления каждым чатом установите require_mention в записи group_rules — см. Групповой контроль доступа ниже.
Идентификация бота
Hermes автоматически определяет open_id и отображаемое имя бота при запуске. Вам нужно установить их вручную только в том случае, если автоматическое обнаружение не может достичь API Feishu или когда ваше приложение использует идентификаторы пользователей на уровне клиента:
FEISHU_BOT_OPEN_ID=ou_xxx# only when auto-detection failsFEISHU_BOT_USER_ID=xxx# required if your app uses sender_id_type=user_idFEISHU_BOT_NAME=MyBot# only when auto-detection fails
Обмен сообщениями между ботами
По умолчанию Hermes игнорирует сообщения, отправленные другими ботами. Включите обмен сообщениями между ботами, если хотите, чтобы Hermes участвовал в оркестрации A2A или получал уведомления от других ботов в той же группе.
FEISHU_ALLOW_BOTS=mentions# default: none
Значение
Поведение
none
Игнорировать все сообщения от других ботов (по умолчанию).
mentions
Принимайте только тогда, когда одноранговый бот @упомянет Гермеса.
all
Принимайте каждое сообщение однорангового бота.
Также можно настроить как feishu.allow_bots в config.yaml (env выигрывает, если установлены оба).
Одноранговых ботов не нужно добавлять в FEISHU_ALLOWED_USERS — этот белый список применяется только к отправителям-людям.
Предоставьте область application:bot.basic_info:read для отображения имен одноранговых ботов; без него одноранговые боты по-прежнему маршрутизируются правильно, но отображаются как open_id.
Действия с интерактивными картами
Когда пользователи нажимают кнопки или взаимодействуют с интерактивными карточками, отправленными ботом, адаптер маршрутизирует их как синтетические командные события /card:
Полезная нагрузка value действия из определения карты включается в формате JSON.
Действия с картами дедуплицируются с 15-минутным окном для предотвращения двойной обработки.
События действия карты отправляются с помощью MessageType.COMMAND, поэтому они проходят через обычный конвейер обработки команд.
Точно так же работает утверждение команды — когда агенту необходимо выполнить опасную команду, он отправляет интерактивную карточку с кнопками «Разрешить один раз» / «Сеанс» / «Всегда» / «Запретить». Пользователь нажимает кнопку, и обратный вызов действия карты возвращает агенту решение об утверждении.
Требуемая конфигурация приложения Feishu
Для интерактивных карточек требуется три шага настройки в консоли разработчика Feishu. Отсутствие любого из них приводит к ошибке 200340, когда пользователи нажимают кнопки карточек.
Подпишитесь на событие действия карты:
В разделе Подписки на события добавьте card.action.trigger к событиям, на которые вы подписаны.
Включите функцию интерактивной карты:
В разделе Функции приложения > Бот убедитесь, что переключатель Интерактивная карта включен. Это сообщает Фейшу, что ваше приложение может получать обратные вызовы действий карты.
Настройте URL-адрес запроса карты (только в режиме веб-перехватчика):
В разделе Функции приложения > Бот > URL-адрес запроса карточки сообщения установите URL-адрес той же конечной точки, что и веб-перехватчик событий (например, https://your-server:8765/feishu/webhook). In WebSocket mode this is handled automatically by the SDK.
⚠️ Warning
Without all three steps, Feishu will successfully *send* interactive cards (sending only requires `im:сообщение:отправить` permission), but clicking any button will return error 200340. The card appears to work — the error only surfaces when a user interacts with it.
Document Comment Intelligent Reply
Beyond chat, the adapter can also answer @-mentions left on Feishu/Lark documents. When a user comments on a document (local text selection or whole-doc comment) and @-mentions the bot, Hermes reads the document plus the surrounding comment thread and posts an LLM reply inline on the thread.
Powered by the drive.notice.comment_add_v1 event, the handler:
Fetches the document content and comment timeline in parallel (20 messages for whole-doc threads, 12 for local-selection threads).
Runs the agent with the feishu_doc + feishu_drive toolsets scoped to that single comment session.
Chunks replies at 4000 chars and posts them back as threaded replies.
Caches per-document sessions for 1 hour with a 50-message cap so follow-up comments on the same doc keep context.
3-Tier Access Control
Document-comment replies are explicit-grant only — there is no implicit allow-all mode. Permissions resolve in this order (first match wins, per field):
Exact doc — rule scoped to a specific document token.
Wildcard — rule that matches a pattern of docs.
Top-level — default rule for the workspace.
Two policies are available per rule:
allowlist — a static list of users / tenants.
**pairing@@IC00 50@@~/.hermes/feishu_comment_rules.json (pairing grants in ~/.hermes/feishu_comment_pairing.json) with mtime-cached hot-reload — edits take effect on the next comment event without restarting the gateway.
CLI:
# Inspect current rules and pairing state
python-mgateway.platforms.feishu_comment_rulesstatus
# Simulate an access check for a specific doc + user
python-mgateway.platforms.feishu_comment_rulescheck<fileType:fileToken><user_open_id>
# Manage pairing grants at runtime
python-mgateway.platforms.feishu_comment_rulespairinglist
python-mgateway.platforms.feishu_comment_rulespairingadd<user_open_id>
python-mgateway.platforms.feishu_comment_rulespairingremove<user_open_id>
Required Feishu App Configuration
On top of the chat/card permissions already granted, add the drive comment event:
Subscribe to drive.notice.comment_add_v1 in Event Subscriptions.
Grant the docs:doc:readonly@@IC0054 @@drive:drive:readonly scopes so the handler can read document content.
Media Support
Inbound (receiving)
The adapter receives and caches the following media types from users:
Type
Extensions
How it's processed
Images
.jpg, .jpeg, .png, .gif, .webp, .bmp
Downloaded via Feishu API and cached locally
Audio
.ogg, .mp3, .wav, .m4a, .aac, .flac, .opus, .webm
Downloaded and cached; small text files are auto-extracted
Video
.mp4, .mov, .avi, .mkv, .webm, .m4v, .3gp
Downloaded and cached as documents
Files
.pdf, .doc, .docx, .xls, .xlsx, .ppt, .pptx, and more
Downloaded and cached as documents
Media from rich-text (post) messages, including inline images and file attachments, is also extracted and cached.
For small text-based documents (.txt, .md), the file content is automatically injected into the message text so the agent can read it directly without needing tools.
Outbound (sending)
Method
What it sends
send
Text or rich post messages (auto-detected based on markdown content)
send_image / send_image_file
Uploads image to Feishu, then sends as native image bubble (with optional caption)
send_document
Uploads file to Feishu API, then sends as file attachment
send_voice
Uploads audio file as a Feishu file attachment
send_video
Uploads video and sends as native media message
send _animation
GIFs are downgraded to file attachments (Feishu has no native GIF bubble)
File upload routing is automatic based on extension:
.ogg, .opus → uploaded as opus audio
.mp4, .m ov, .avi, .m4v → uploaded as mp4 media
.pdf, .doc(x)@@IC0 072@@.xls(x), .ppt(x) → uploaded with their document type
Everything else → uploaded as a generic stream file
Markdown Rendering and Post Fallback
When outbound text contains markdown formatting (headings, bold, lists, code blocks, links, etc.), the adapter automatically sends it as a Feishu post message with an embedded md tag rather than as plain text. This enables rich rendering in the Feishu client.
If the Feishu API rejects the post payload (e.g., due to unsupported markdown constructs), the adapter automatically falls back to sending as plain text with markdown stripped. This two-stage fallback ensures messages are always delivered.
Plain text messages (no markdown detected) are sent as the simple text message type.
Processing Status Reactions
While the agent is working, the bot shows a Ввод@@IC0077 @@CrossMark if processing failed.
Set FEISHU_REACTIONS=false to turn it off.
Burst Protection and Batching
The adapter includes debouncing for rapid message bursts to avoid overwhelming the agent:
Text Batching
When a user sends multiple text messages in quick succession, they are merged into a single event before being dispatched:
Setting
Env Var
Default
Quiet period
HERMES_FEISHU_TEXT_BATCH_D ELAY_SECONDS
0.6s
Max messages per batch
HERMES_FEISHU_TEXT_BATCH_MAX_MESSAGES
8
Max characters per batch
HERMES_FEISHU_TEXT_BATCH_MAX_CHARS
4000
Media Batching
Multiple media attachments sent in quick succession (e.g., dragging several images) are merged into a single event:
Setting
Env Var
Default
Quiet period
HERMES_FEISHU_MEDIA_BATCH_DELAY_SECONDS@@IC00 83@@application/json is accepted
WebSocket Tuning
When using websocket mode, you can customize reconnect and ping behavior:
platforms:feishu:extra:ws_reconnect_interval:120# Seconds between reconnect attempts (default: 120)ws_ping_interval:30# Seconds between WebSocket pings (optional; SDK default if unset)
Setting
Config key
Default
Description
Reconnect interval
ws_reconnect_interval
120s
How long to wait between reconnection attempts
Ping interval
ws_ping_interval
(SDK default)
Frequency of WebSocket keepalive pings
Per-Group Access Control
Beyond the global FEISHU_GROUP_POLICY, you can set fine-grained rules per group chat using group_rules in config.yaml:
platforms:feishu:extra:default_group_policy:"open"# Default for groups not in group_rulesadmins:# Users who can manage bot settings-"ou_admin_open_id"group_rules:"oc_group_chat_id_1":policy:"allowlist"# open | allowlist | blacklist | admin_only | disabledallowlist:-"ou_user_open_id_1"-"ou_user_open_id_2""oc_group_chat_id_2":policy:"admin_only""oc_group_chat_id_3":policy:"blacklist"blacklist:-"ou_blocked_user""oc_free_chat":policy:"open"require_mention:false# overrides FEISHU_REQUIRE_MENTION for this chat
Policy
Description
op ru
Anyone in the group can use the bot
allowlist
Only users in the group's allowlist can use the bot
blacklist
Everyone except users in the group's blacklist can use the bot
admin_only
Only users in the global admins list can use the bot in this group
disabled
Bot ignores all messages in this group
Set require_mention: false on a group_rules entry to skip the @-mention requirement for that specific chat. When omitted, the chat inherits the global FEISHU_REQUIRE_MENTION value.
Groups not listed in group_rules fall back to default_group_policy (defaults to the value of FEISHU_GROUP_POLICY).
Deduplication
Inbound messages are deduplicated using message IDs with a 24-hour TTL. The dedup state is persisted across restarts to ~/.hermes/feishu_seen_me ssage_ids.json.
Setting
Env Var
Default
Cache size
HERMES_FEISHU_DEDUP_CACHE_SIZE
2048 entries
All Environment Variables
Variable
Required
Default
Description
FEISHU_APP_ID@@IC0106@ @FEISHU_APP_SECRET
✅
—
Feishu/Lark App Secret
FEISHU_DOMAIN
—
feishu
feishu (China) or lar k (international)
FEISHU_CONNECTION_MODE
—
websocket
websocket or webho ok
FEISHU_ALLOWED_USERS
—
(empty)
Comma-separated open_id list for user allowlist
FEISHU_ALLOW_BOTS
—
none
Accept messages from other bots: non e, mentions, or all
websockets не установлен; режим websocket недоступен
Install websockets: pip install websockets
aiohttp не установлен; режим webhook недоступен
Install aiohttp: pip install aiohttp
FEISHU_APP_ID или FEISHU_APP_SECRET не установлен
Set both env vars or configure via hermesшлюз setup
Другой локальный шлюз Hermes уже использует этот Feishu app_id
Only one Hermes instance can use the same app_id at a time. Stop the other gateway first.
Bot doesn't respond in groups
Ensure the bot is @mentioned, check FEISHU_GROUP_POLICY, and verify the sender is in FEISHU_ALLOWED_USERS if policy is allowlist
Webhook отклонен: неверная проверка token
Ensure FEISHU_VERIFICATION_TOKEN matches the token in your Feishu app's Event Subscriptions config
Вебхук отклонен: недействителен подпись
Ensure FEISHU_ENCRYPT_KEY matches the encrypt key in your Feishu app config
Post messages show as plain text
The Feishu API rejected the post payload; this is normal fallback behavior. Check logs for details.
Images/files not received by bot
Grant im:message and im:resource permission scopes to your Feishu app
Bot identity not auto-detected
Usually a transient network issue reaching Feishu's bot info endpoint. Set FEISHU_BOT_OPEN_ID and FEISHU_BOT_NAME manually as a workaround.
Peer bot messages still ignored after enabling FEISHU_ALLOW_BOTS@@I C0173@@FEISHU_BOT_OPEN_ID (and FEISHU_BOT_USER_ID if your app uses sender_id_type=user_id).
Peer bots show as ou_xxxxxx instead of by name
Grant the application:bot.basic_info:read scope.
Error 200340 when clicking approval buttons
Enable Interactive Card capability and configure Card Request URL in the Feishu Developer Console. See Required Feishu App Configuration above.
Webhook превышен лимит скорости
More than 120 requests/minute from the same IP. This is usually a misconfiguration or loop.
Toolset
Feishu / Lark uses the hermes-feishu, предустановленная платформа, которая включает в себя те же основные инструменты, что и Telegram и другие платформы обмена сообщениями на основе шлюза.