> ## Documentation Index
> Fetch the complete documentation index at: https://docs.veadk.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Feishu

## Overview

`FeishuChannelExtension` bridges inbound messages from a Feishu (Lark) bot into the VeADK `Runner`.

<Note>
  This page treats Feishu as an **inbound message channel**: messages from Feishu users trigger the agent. If instead you want the agent to **call Feishu capabilities** (send messages, process cloud docs, manage calendars), see [Feishu / Lark MCP](/productions/veadk/archives/1.0.1/en/components/tools/lark).
</Note>

It listens for the bot's message events and maps Feishu's session identity onto VeADK: the message sender becomes the `Runner`'s user identity, and the thread the message belongs to becomes the session identity; when there is no thread, it falls back to the current group or direct chat as the session. This way VeADK's existing short-term memory, long-term memory, tracing, and multi-tenant isolation all carry over directly, per user and per session.

## Environment & prerequisites

Installation:

```bash lines theme={null}
pip install veadk-python[extensions]
```

If you only want this capability, install it on its own:

```bash lines theme={null}
pip install lark-oapi
```

Environment variables:

* `TOOL_FEISHU_CHANNEL_APP_ID`
* `TOOL_FEISHU_CHANNEL_APP_SECRET`
* `TOOL_FEISHU_CHANNEL_TRANSPORT`: defaults to `ws`
* `TOOL_FEISHU_CHANNEL_STREAMING`: whether to enable streaming output, defaults to `false`
* `TOOL_FEISHU_CHANNEL_REACTIONS`: whether to reply with a "received" reaction on incoming messages, defaults to `false`

Or configure in `config.yaml`:

```yaml title="config.yaml" lines theme={null}
tool:
  feishu_channel:
    app_id: cli_xxx
    app_secret: xxx
    transport: ws
    streaming: true
    reactions: true
```

## Usage

```python title="examples/channel/feishu_bot.py" lines theme={null}
import asyncio

from veadk import Agent, Runner
from veadk.extensions import FeishuChannelExtension
from veadk.memory.short_term_memory import ShortTermMemory

agent = Agent(
    name="feishu_agent",
    model_name="doubao-seed-1-8-251228",
    instruction="You are an assistant that talks to users through a Feishu bot.",
)

runner = Runner(
    agent=agent,
    app_name="veadk_feishu_demo",
    user_id="veadk_feishu_default_user",
    short_term_memory=ShortTermMemory(),
)

channel = FeishuChannelExtension(
    runner=runner,
    channel_kwargs={"transport": "ws"},
)


async def main():
    await channel.connect()


if __name__ == "__main__":
    asyncio.run(main())
```

## Notes

* The Feishu WebSocket long-connection mode is used by default, so as long as the bot has subscribed to message events, you can start the connection directly.
* Replies are sent as replies to the original message by default, keeping VeADK output attached to the current Feishu message thread.
* Override the default identity mapping via `session_id_factory` and `user_id_factory`.
