Feishu/Lark
This is a shipped runtime-backed surface: direct sends are implemented, the serve loop is implemented, and the channel can joingateway run or gateway run.
At A Glance
| Field | Value |
|---|---|
| Catalog id | feishu |
| Config key | feishu |
| Implementation status | runtime_backed |
| Transport | feishu_openapi_webhook_or_websocket |
| Aliases | lark |
| Default send target kind | receive_id, message_reply |
Minimal Config
Preferred setup path:app_id and app_secret into loong.toml, and defaults the channel to mode = "websocket". Manual credential handoff remains available with loong feishu onboard --manual --app-id ... --app-secret ....
Smoke Test
Command Surface
| Operation | Command | Usage or status |
|---|---|---|
| direct send | channels send feishu | Usage: loong channels send feishu [OPTIONS] —target <TARGET> —text <TEXT> |
| inbound reply service | channels serve feishu | Usage: loong channels serve feishu [OPTIONS] |
Required Fields For Send
| Requirement | Config paths | Env pointer paths | Default env |
|---|---|---|---|
| channel enabled | feishu.enabledfeishu.accounts.<account>.enabled | none | none |
| app id | feishu.app_idfeishu.accounts.<account>.app_id | feishu.app_id_envfeishu.accounts.<account>.app_id_env | FEISHU_APP_ID |
| app secret | feishu.app_secretfeishu.accounts.<account>.app_secret | feishu.app_secret_envfeishu.accounts.<account>.app_secret_env | FEISHU_APP_SECRET |
Required Fields For Serve
| Requirement | Config paths | Env pointer paths | Default env |
|---|---|---|---|
| channel enabled | feishu.enabledfeishu.accounts.<account>.enabled | none | none |
| app id | feishu.app_idfeishu.accounts.<account>.app_id | feishu.app_id_envfeishu.accounts.<account>.app_id_env | FEISHU_APP_ID |
| app secret | feishu.app_secretfeishu.accounts.<account>.app_secret | feishu.app_secret_envfeishu.accounts.<account>.app_secret_env | FEISHU_APP_SECRET |
| serve mode | feishu.modefeishu.accounts.<account>.mode | none | none |
| allowed chat ids | feishu.allowed_chat_idsfeishu.accounts.<account>.allowed_chat_ids | none | none |
| verification token (webhook mode only) | feishu.verification_tokenfeishu.accounts.<account>.verification_token | feishu.verification_token_envfeishu.accounts.<account>.verification_token_env | FEISHU_VERIFICATION_TOKEN |
| encrypt key (webhook mode only) | feishu.encrypt_keyfeishu.accounts.<account>.encrypt_key | feishu.encrypt_key_envfeishu.accounts.<account>.encrypt_key_env | FEISHU_ENCRYPT_KEY |
Gateway And Ownership
This surface can run directly throughchannels serve feishu, or under Gateway And Supervision through gateway run.
Operator Notes
loong feishu onboardis the recommended first-run path for both Feishu and Lark. Use--domain larkto start on the international lane, or keep the default Feishu lane and let the registration poll switch to Lark when the scanned tenant reportstenant_brand = "lark".loong channels send feishuandloong channels serve feishustay aligned with the same canonical grouped channel contract used by other shipped channels.- Keep Feishu-specific richer payload modes such as
--post-json,--image-key/--image-path, and--file-key/--file-path/--file-typeon the dedicatedloong feishu sendandloong feishu replysurfaces instead of widening the shared grouped contract. - Webhook mode additionally needs
verification_tokenandencrypt_key; websocket mode does not. - Set
require_mention = truewhen multiple bots share the same group and you only want Loong to react when this bot is explicitly @-mentioned. P2P chats still bypass that gate. - QR onboarding only provisions
app_idandapp_secret, so it currently targets websocket mode. Useloong feishu onboard --manual --mode webhook ...when you need webhook callback credentials. - When QR onboarding receives the configuring user’s
open_idand no Feishu inbound allowlists are already configured, Loong bootstrapsallowed_chat_ids = ["*"]plusallowed_sender_ids = [owner_open_id]so that same user can immediately start a direct chat with the bot after setup. - Use
allowed_chat_idsas the trust boundary instead of treating it as a convenience filter. - Keep
domain = "lark"for the Lark lane anddomain = "feishu"for the Feishu lane; the runtime contract is the same family.
Related Docs
- Continue to Channel Guides for the full shipped channel matrix.
- Continue to Channels for the conceptual surface model.
- Continue to Channel Setup for the shared public setup contract.
- Continue to Gateway And Supervision when this surface needs longer-lived runtime ownership.