| name | lark |
| description | 与飞书(Lark)机器人交互 - 发送消息到用户或群聊、@ 功能、监听事件、群聊管理。当用户提到飞书、Lark、发消息、群聊、@ 某人时使用。 |
| user-invocable | true |
| disable-model-invocation | false |
| allowed-tools | Bash, Read |
飞书 CLI Skill
使用 lark-cli 工具与飞书机器人交互,支持多租户管理。
命令前缀
所有命令使用 uv run 执行:
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli <command>
当前配置
- 配置文件: !
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli config path 2>/dev/null
- 默认租户: !
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli config get cli.default_tenant 2>/dev/null
群聊操作说明
直接发送即可,缓存过期或找不到时会自动同步:
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send --chat "群名称" "消息内容"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send --chat "群名称" --at "姓名" "消息内容"
自动同步机制:
- 群列表缓存过期(默认 3 天)或找不到群时,自动从 API 同步
- @ 成员时,群成员缓存过期或找不到时,自动同步群成员
- 无需手动执行
chat sync 或 chat members --sync
@ 功能优先级:
- 群聊中优先从群成员列表查找(通过姓名)
- 如果找不到,自动同步群成员后重试
- 如果是邮箱,先通过 API 解析,失败则用邮箱前缀匹配群成员姓名
命令参考
发送消息
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send "消息内容"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send -r "ou_xxx" "消息内容"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send -e "user@example.com" "消息内容"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send -r "oc_xxx" --receiver-type chat_id "消息内容"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send -t tenant_name "消息内容"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send --at ou_xxx "请查阅这份文档"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send --at user@example.com "请审核"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send -r "oc_xxx" --receiver-type chat_id --at-all "全体会议通知"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send --at ou_xxx --at ou_yyy "请两位审核"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send --chat "群名称" --at "张三" "请审核这份文档"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send --chat "群名称" --at "张三" --at "李四" "请两位审核"
发送富文本消息 (Post)
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message post --title "通知" "这是一条富文本消息"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message post --at ou_xxx "请审核这份文档"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message post -r "oc_xxx" --receiver-type chat_id --at-all "全体通知"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message post -r "oc_xxx" --receiver-type chat_id --at ou_xxx --title "审核通知" "请审核这份文档"
回复消息
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message reply <message_id> "回复内容"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message reply --in-thread <message_id> "话题内回复"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message reply --at ou_xxx <message_id> "回复并 @ 某人"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message reply --in-thread --at "张三" <message_id> "回复内容"
查看消息
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message list --chat "群名称" --limit 10
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message list --chat oc_xxx --limit 20
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message list --thread om_xxx --limit 10
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message list --user ou_xxx --limit 10
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message list --user user@example.com --limit 10
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message list --chat "群名称" --json
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message get <message_id>
提示: 获取消息列表后,可以使用返回的 message_id 进行回复(message reply)或表情回复(message react)。
私聊消息
要查看与某用户的私聊消息,需要先获取私聊的 chat_id:
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli listen
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat private
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message list --user ou_xxx --limit 10
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message list --chat oc_xxx --limit 10
监听事件 (WebSocket)
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli listen
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli listen -t tenant_name
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli listen -v
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli listen --log --log-dir ./events
配置管理
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli config show
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli config show --secrets
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli config show --json
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli config add-tenant <name> \
--app-id "cli_xxx" \
--app-secret "xxx" \
--receiver-id "ou_xxx" \
--description "描述"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli config update-tenant <name> --description "新描述"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli config remove-tenant <name>
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli config set-default <name>
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli config set cli.log_level DEBUG
租户管理(快捷命令)
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli tenant list
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli tenant add <name> --app-id xxx --app-secret yyy
群聊管理
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat sync
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat list
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat list --refresh
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat search "关键词"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat search "关键词" --id-only
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat find "群名称"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat get-id "群名称"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send --chat "群名称" "消息内容"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send --chat "群名称" --at-all "全体通知"
群成员管理
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat members "群名称" --sync
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat members "群名称"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat members oc_xxx --sync
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat find-member "群名称" "姓名"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat search-member "群名称" "关键词"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat search-member "群名称" "关键词" --with-email
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat find-member "群名称" "姓名" --id-only
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli chat search-member "群名称" "关键词" --json
AI Agent 推荐流程:当需要 @ 某人但不确定准确姓名时:
- 使用
chat search-member 模糊搜索
- 如果有多个匹配,提示用户选择
- 使用确定的姓名发送消息
话题群操作
话题群(Thread Group)是飞书的特殊群聊模式,所有消息都在话题下发送。
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message send --chat "话题群名称" "话题标题/内容"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message reply --in-thread <message_id> "话题内回复"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message reply --in-thread --at "张三" <message_id> "请审阅"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message reply --in-thread --at "张三" --at "李四" <message_id> "请两位审阅"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message reply --in-thread --at-all <message_id> "全体注意"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message reply --in-thread --at "张三" --at-all <message_id> "请注意"
话题群工作流程示例:
lark-cli chat sync
lark-cli chat search "火山"
lark-cli message send --chat "火山方舟成本优化" "新话题:讨论本周成本报告"
lark-cli message reply --in-thread --at "张三" om_xxx "请查看附件中的详细数据"
表情回复 (Reaction)
给消息添加表情回应,类似于点赞、确认等操作。
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message react <message_id> THUMBSUP
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message react <message_id> SMILE
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message react <message_id> OK
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message react <message_id> DONE
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message react <message_id> LOVE
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message react <message_id> APPLAUSE
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message reactions <message_id>
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message reactions <message_id> --type THUMBSUP
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message reactions <message_id> --json
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message unreact <message_id> <reaction_id>
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli message emoji-list
常用 emoji_type:
| 类别 | emoji_type |
|---|
| 认可 | THUMBSUP, OK, THANKS, DONE, MUSCLE, APPLAUSE, FISTBUMP, CLAP, CHECKMARK |
| 表情 | SMILE, LAUGH, BLUSH, WINK, LOL, PROUD, JOYFUL, WOW, YEAH |
| 爱心 | HEART, HEARTBROKEN, FINGERHEART, KISS, ROSE |
| 庆祝 | PARTY, FIRE, TROPHY, FIREWORKS, GIFT, CAKE |
| 状态 | TYPING, THINKING, WORKING, ONIT, ONESECOND |
| 否定 | CROSSMARK, THUMBSDOWN, MINUSONE, FACEPALM |
| 其他 | WAVE, COFFEE, BEER, LGTM, HUNDRED, PIN, ALARM |
完整 emoji_type 参考(按类别):
# 面部表情
SMILE, BLUSH, LAUGH, SMIRK, LOL, FACEPALM, WINK, PROUD, WITTY, SMART,
SCOWL, THINKING, SOB, CRY, INNOCENT, JOYFUL, WOW, TRICK, YEAH, EMBARRASSED,
KISS, SMOOCH, DROOL, OBSESSED, TEASE, SHOWOFF, SILENT, WAVE, WHAT, FROWN,
SHY, DIZZY, CHUCKLE, WAIL, CRAZY, WHIMPER, BLUBBER, WRONGED, HUSKY, SHHH,
SMUG, ANGRY, SHOCKED, TERROR, PETRIFIED, SKULL, SWEAT, SPEECHLESS, SLEEP,
DROWSY, YAWN, SICK, PUKE, BETRAYED
# 手势和动作
OK, THUMBSUP, THANKS, MUSCLE, FINGERHEART, APPLAUSE, FISTBUMP, JIAYI, DONE,
SALUTE, SHAKE, HIGHFIVE, CLAP, PRAISE, STRIVE, HUG, HEADSET, THUMBSDOWN
# 物品和符号
HEART, HEARTBROKEN, ROSE, FIRE, BOMB, PARTY, LIPS, BEER, CAKE, GIFT, TROPHY,
MUSIC, LGTM, LEMON, GET, CHECKMARK, CROSSMARK, MINUSONE, HUNDRED, PIN, ALARM,
LOUDSPEAKER, XMASTREE, SNOWMAN, XMASHAT, FIREWORKS, REDPACKET, POOP, COFFEE
# 状态和活动
WORKING, ONIT, ONESECOND, TYPING, VRHEADSET, YOUARETHEBEST, ROARFORYOU,
CALF, BEAR, BULL, RAINBOWPUKE, EATINGFOOD, SIGH
AI Agent 表情状态机推荐用法:
OK - 收到消息确认
TYPING - 正在处理/思考中
DONE/CHECKMARK - 任务完成
CROSSMARK - 处理失败/错误
THUMBSUP - 同意/确认
THINKING - 分析/思考
FIRE - 紧急/重要
PARTY - 庆祝/成功
使用说明
群聊操作流程
直接使用 --chat "群名称" 发送即可,系统自动处理缓存同步:
- 缓存有效(3 天内):直接使用缓存数据发送
- 缓存过期或为空:自动同步后发送
- 可选:用
chat search "关键词" 手动确认群名
请求映射
当用户请求时:
- "发消息给xxx" → 使用
message send 命令
- "发个飞书消息" → 使用
message send 命令
- "发消息给 xxx@example.com" → 使用
message send -e "xxx@example.com" 命令
- "发卡片消息" → 使用
card template 或 card send 命令
- "监听飞书事件" → 使用
listen 命令
- "查看飞书配置" → 使用
config show 命令
- "添加飞书机器人" → 使用
config add-tenant 命令
- "切换飞书租户" → 使用
config set-default 命令
- "@ 某人发消息" → 使用
message send --at 或 message post --at 命令
- "在群里 @所有人" → 直接使用
--at-all 参数(自动同步群列表)
- "发送到群聊" → 直接使用
--chat "群名称" 参数(自动同步群列表)
- "查看群列表" →
chat list(需要手动刷新用 --refresh)
- "发消息到某某群" → 直接使用
--chat "群名称" 参数(自动同步群列表)
- "发消息到群并 @ 某人" → 直接
message send --chat "群名称" --at "姓名" "消息"(自动同步,群聊中用中文姓名)
- "回复消息" → 使用
message reply <message_id> 命令
- "在话题中回复" → 使用
message reply --in-thread <message_id> 命令
- "查找群 ID" → 使用
chat get-id "群名称" 或 chat search "关键词" 命令
- "搜索群" → 使用
chat search "关键词" 命令(模糊搜索)
- "话题群发消息" → 先
message send --chat "群名" 创建话题,再 message reply --in-thread 回复
- "在话题里 @ 某人" → 使用
message reply --in-thread --at "姓名"
- "给消息点赞" → 使用
message react <message_id> THUMBSUP
- "表情回复" → 使用
message react <message_id> <EMOJI_TYPE>
- "查看表情" → 使用
message reactions <message_id>
- "查看表情类型" → 使用
message emoji-list
- "获取最近消息" → 使用
message list --chat "群名称" --limit N
- "查看群里的消息" → 使用
message list --chat "群名称"
- "查看私聊消息" → 使用
message list --user ou_xxx 或 --user email(需要先 listen)
- "查看私聊缓存" → 使用
chat private
- "启动 AI Agent" → 使用
agent 命令启动自动回复机器人
- "让机器人自动回复" → 使用
agent 命令
- "启动聊天机器人" → 使用
agent 命令
- "agent 监听所有消息" → 使用
agent --filter all
- "agent 只回复私聊" → 使用
agent --filter p2p
$ARGUMENTS 包含用户的具体请求,解析后决定运行哪个命令。
接收者类型
open_id: 用户的 Open ID (ou_xxx)
user_id: 用户 ID
union_id: Union ID
chat_id: 群聊 ID (oc_xxx)
email: 用户邮箱
消息类型
text: 纯文本消息
post: 富文本消息
image: 图片消息
file: 文件消息
发送卡片消息
卡片消息推荐使用以下两种方式发送:
方式1:使用预设模板(推荐)
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli card template notify \
--title "标题" --content "内容" -o send [-e email]
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli card template alert \
--title "告警" --content "消息" --level error -o send [-e email]
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli card template success \
--title "成功" --content "操作成功" -o send [-e email]
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli card template task \
--title "任务" --content "描述" --status "待处理" --assignee "张三" -o send [-e email]
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli card template report \
--title "周报" --fields '{"完成": "10", "进行中": "5"}' -o send [-e email]
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli card template notify \
--title "审核通知" --content "请审核文档" --at ou_xxx -o send
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli card template alert \
--title "紧急通知" --content "服务器故障" --at-all -o send -r oc_xxx
方式2:直接发送卡片 JSON
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli card send '<card_json>' [-e email]
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli card send -f card.json [-e email]
校验卡片 JSON
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli card validate '<card_json>'
列出可用模板
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli card list-templates
卡片 JSON 结构
{
"config": {
"wide_screen_mode": true,
"enable_forward": true
},
"header": {
"title": {
"content": "卡片标题",
"tag": "plain_text"
},
"template": "blue"
},
"elements": [
]
}
结构说明
| 字段 | 必填 | 说明 |
|---|
config.wide_screen_mode | 否 | 宽屏模式,推荐设为 true |
config.enable_forward | 否 | 允许转发,默认 true |
header.title.content | 是 | 标题文本 |
header.template | 否 | 标题颜色 |
elements | 是 | 卡片内容元素数组 |
标题颜色模板
可选值:blue、turquoise、green、yellow、orange、red、purple、grey、default
- 通知/信息 →
blue
- 成功 →
green
- 警告 →
orange 或 yellow
- 错误/告警 →
red
- 中性 →
grey
卡片元素类型
1. 文本块 (div)
{
"tag": "div",
"text": {
"content": "**粗体** 和 *斜体* 文本",
"tag": "lark_md"
}
}
2. 多列字段 (div + fields)
{
"tag": "div",
"fields": [
{
"is_short": true,
"text": {"content": "**状态**\n已完成", "tag": "lark_md"}
},
{
"is_short": true,
"text": {"content": "**负责人**\n张三", "tag": "lark_md"}
}
]
}
3. 分割线 (hr)
{"tag": "hr"}
4. 备注 (note)
{
"tag": "note",
"elements": [
{"tag": "plain_text", "content": "这是备注文字"}
]
}
5. 按钮组 (action)
{
"tag": "action",
"actions": [
{
"tag": "button",
"type": "primary",
"text": {"content": "主要按钮", "tag": "plain_text"},
"url": "https://example.com"
},
{
"tag": "button",
"type": "default",
"text": {"content": "次要按钮", "tag": "plain_text"},
"url": "https://example.com/cancel"
}
],
"layout": "bisected"
}
按钮属性:
type: primary(蓝色主按钮)或 default(灰色次按钮)
url: 点击跳转链接
layout: bisected(并排)或 vertical(垂直)
Markdown 语法支持
在 "tag": "lark_md" 的文本中支持:
| 语法 | 效果 |
|---|
**文本** | 粗体 |
*文本* | 斜体 |
~~文本~~ | 删除线 |
[链接](url) | 超链接 |
`代码` | 行内代码 |
<at id=ou_xxx></at> | @用户 |
\n | 换行 |
卡片限制
重要:请遵守以下限制,避免卡片显示异常
| 限制项 | 限制值 | 说明 |
|---|
| 卡片总大小 | ≤ 30KB | 整个 JSON 字符串大小 |
| 标题长度 | ≤ 100 字符 | header.title.content |
| 单个文本块 | ≤ 2000 字符 | div.text.content |
| elements 数量 | ≤ 50 个 | 单张卡片元素数量 |
| 按钮数量 | ≤ 5 个/组 | 单个 action 中的按钮 |
| 字段数量 | ≤ 8 个 | 单个 div.fields 中的字段 |
| 嵌套层级 | ≤ 3 层 | 元素嵌套深度 |
最佳实践:
- 卡片内容精简,突出重点信息
- 长文本分段,每段不超过 500 字符
- 使用 Markdown 格式化,提高可读性
- 按钮文字简短(2-6字),链接有效
完整示例
示例1:简单通知卡片
{
"config": {"wide_screen_mode": true},
"header": {
"title": {"content": "✅ 任务完成", "tag": "plain_text"},
"template": "green"
},
"elements": [
{
"tag": "div",
"text": {"content": "您的构建任务已成功完成。", "tag": "lark_md"}
}
]
}
示例2:带字段的信息卡片
{
"config": {"wide_screen_mode": true},
"header": {
"title": {"content": "📊 部署报告", "tag": "plain_text"},
"template": "blue"
},
"elements": [
{
"tag": "div",
"fields": [
{"is_short": true, "text": {"content": "**环境**\n生产环境", "tag": "lark_md"}},
{"is_short": true, "text": {"content": "**版本**\nv1.2.3", "tag": "lark_md"}},
{"is_short": true, "text": {"content": "**状态**\n成功", "tag": "lark_md"}},
{"is_short": true, "text": {"content": "**耗时**\n2分30秒", "tag": "lark_md"}}
]
},
{"tag": "hr"},
{
"tag": "div",
"text": {"content": "部署详情请查看 [Jenkins](https://jenkins.example.com/job/123)", "tag": "lark_md"}
}
]
}
示例3:告警卡片(带按钮)
{
"config": {"wide_screen_mode": true},
"header": {
"title": {"content": "⚠️ 服务告警", "tag": "plain_text"},
"template": "red"
},
"elements": [
{
"tag": "div",
"text": {"content": "**告警内容**\nCPU 使用率超过 90%,持续 5 分钟", "tag": "lark_md"}
},
{
"tag": "div",
"fields": [
{"is_short": true, "text": {"content": "**服务**\napi-server", "tag": "lark_md"}},
{"is_short": true, "text": {"content": "**级别**\n严重", "tag": "lark_md"}}
]
},
{"tag": "hr"},
{
"tag": "action",
"actions": [
{
"tag": "button",
"type": "primary",
"text": {"content": "查看详情", "tag": "plain_text"},
"url": "https://monitor.example.com/alert/123"
},
{
"tag": "button",
"type": "default",
"text": {"content": "忽略", "tag": "plain_text"},
"url": "https://monitor.example.com/alert/123/ignore"
}
],
"layout": "bisected"
},
{
"tag": "note",
"elements": [{"tag": "plain_text", "content": "来自监控系统 · 2024-01-15 10:30:00"}]
}
]
}
构建卡片的建议
当需要发送卡片时:
- 根据信息类型选择合适的标题颜色
- 使用 div + fields 展示结构化数据
- 重要操作使用按钮,提供跳转链接
- 使用 note 添加来源或时间信息
- 保持卡片简洁,避免信息过载
MCP Server(AI Agent 实时消息集成)
lark-cli 提供了 MCP (Model Context Protocol) Server,允许 AI Agent 实时监听和响应飞书消息。
可用的 MCP Tools
| Tool | 描述 |
|---|
get_bot_info | 获取机器人配置信息(名称、描述、persona 等) |
list_chats | 列出机器人所在的群聊 |
list_chat_members | 列出群聊成员 |
send_message | 发送消息到用户或群聊 |
reply_message | 回复指定消息 |
add_reaction | 给消息添加表情回复 |
get_recent_messages | 获取群聊的最近消息 |
search_member | 在群聊中搜索成员 |
start_message_listener | 启动消息监听器 |
get_pending_messages | 获取待处理的消息队列 |
stop_message_listener | 停止消息监听器 |
消息监听过滤类型
start_message_listener 支持以下过滤类型:
| filter_type | 描述 |
|---|
all | 监听所有消息 |
p2p | 仅监听私聊消息 |
group | 仅监听群聊消息 |
at | 仅监听 @ 机器人的消息 |
AI Agent 工作流示例
bot_info = get_bot_info()
start_message_listener(filter_type="at")
while True:
pending = get_pending_messages(max_messages=5)
for msg in pending["messages"]:
chat_id = msg["chat_id"]
message_id = msg["message_id"]
content = msg["content"]["text"]
response = generate_response(content)
reply_message(message_id, response)
stop_message_listener()
机器人 Persona 配置
在 lark-cli 配置文件中可以为租户添加自定义字段:
tenants:
my-bot:
app_id: cli_xxx
app_secret: xxx
description: "我的飞书机器人"
bot_name: "小助手"
persona: |
你是一个友好的助手,负责回答技术问题。
回复要简洁专业。
AI Agent 自动回复
lark-cli 提供了完整的 AI Agent 功能,可以让机器人自动监听飞书消息并使用 Claude 生成回复。
前置依赖
使用 AI Agent 功能需要以下条件:
-
Claude Code CLI
- Agent 使用
claude-agent-sdk 与 Claude 交互
- SDK 已包含在插件依赖中(自动安装)
- SDK 内部自动管理 Claude Code CLI 进程
-
Anthropic API 访问
- 确保已完成
claude 命令的初始设置
- 或设置
ANTHROPIC_API_KEY 环境变量
-
飞书机器人配置
- 配置
~/.lark_cli/config.yaml 中的租户信息
- 需要有效的 App ID 和 App Secret
验证依赖:
claude --version
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli config show
启动 AI Agent
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli agent
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli agent --filter all
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli agent --filter p2p
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli agent --filter group
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli agent --model haiku
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli agent --model sonnet
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli agent --model opus
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli agent --persona "你是一个专业的技术助手,用简洁的语言回答问题"
cd ${CLAUDE_PLUGIN_ROOT}/src && uv run lark-cli agent --verbose
Agent 命令选项
| 选项 | 说明 |
|---|
-t, --tenant | 指定租户名称 |
-f, --filter | 消息过滤:all、p2p、group、at(默认) |
-m, --model | 模型选择:haiku、sonnet、opus |
-p, --persona | 自定义 AI persona |
-d, --debounce | 消息聚合延迟(秒,默认 0.5) |
--no-fast-llm | 禁用快速 LLM,仅使用 Claude Code |
--group-auto-reply | 启用群聊自主回复(根据话题相关性) |
-v, --verbose | 详细日志输出 |
双层 LLM 架构
AI Agent 采用双层 LLM 架构以优化响应速度:
| 层级 | 用途 | 响应时间 |
|---|
| 快速 LLM(可选) | 意图分类、简单闲聊 | ~1-2 秒 |
| Claude Code | 复杂任务、代码执行 | ~10-30 秒 |
工作流程:
- 收到消息后,快速 LLM 判断意图(CHAT 或 TASK)
- 简单闲聊由快速 LLM 直接回复
- 复杂任务转发给 Claude Code 处理
不配置快速 LLM:所有消息由 Claude Code 处理(功能正常,但响应稍慢)
快速 LLM 配置
在 ~/.lark_cli/config.yaml 中添加 fast_llm 配置:
tenants:
my_bot:
fast_llm:
enabled: true
provider: "ark"
base_url: "https://ark.cn-beijing.volces.com/api/v3"
model: "ep-your-endpoint-id"
api_key_env: "ARK_API_KEY"
Agent 架构特点
- 双层 LLM:快速响应简单对话,复杂任务交给 Claude Code
- 持久 Claude 连接:每个聊天保持独立的 Claude session,支持多轮对话
- Session 自动恢复:重启 agent 后自动恢复之前的对话上下文
- 实时状态反馈:
- 收到消息时添加 ✓ 表情
- 处理中显示 THINKING 表情
- 处理失败显示 ERROR 表情
- 处理成功后移除状态表情
- WebSocket 连接监控:自动重连,断线重连后继续处理新消息
- 消息聚合:短时间内的多条消息会被聚合处理
性能指标
| 指标 | 数值 |
|---|
| 平均响应时间 | ~9.5 秒 |
| 平均成本 | ~$0.012/消息 |
| 首次响应 | ~11 秒 |
| 后续响应 | ~8 秒(利用缓存) |
机器人 Persona 配置
在配置文件 (~/.lark_cli/config.yaml) 中为机器人设置个性化行为:
tenants:
my-bot:
app_id: cli_xxx
app_secret: xxx
description: "我的 AI 助手"
bot_name: "Kira"
bot_identity: "你是 Kira,一个友好、专业的 AI 助手"
bot_capabilities: "回答问题、提供建议、协助文档编写、解释代码"
persona: |
## 行为准则
- 用友好的语气回复,适当使用 emoji
- 回复要简洁但完整
- 技术问题要准确专业
- 不确定时诚实说明
model: sonnet
Session 管理
Agent 会自动管理每个聊天的 session:
~/.lark_cli/agent_sessions.yaml
使用场景
- 客服机器人:自动回答常见问题
- 技术支持:解答技术问题,提供代码示例
- 团队助手:在群聊中回答 @ 机器人的问题
- 通知助手:接收通知后智能回复确认