cards — 飞书卡片构建器#

源码:src/cclark/cards/

所有卡片构建工具。每个模块生成一个飞书卡片 JSON 字符串 (json.dumps 输出),可直接通过 FeishuClient 发送。

飞书卡片 schema#

所有卡片遵循飞书交互卡片 schema:

{
  "config": {"wide_screen_mode": true},
  "header": {
    "title": {"tag": "plain_text", "content": "Title"},
    "template": "blue"
  },
  "elements": [
    {"tag": "markdown", "content": "..."},
    {"tag": "action", "children": [
      {"tag": "button", "text": {...}, "action_type": "interactive", "value": {"action": "..."}}
    ]}
  ]
}

支持的 header 模板:bluewathetturquoisegreenyelloworangeredpurpleindigogrey

cards/builder — FeishuCardBuilder#

CardPayloadInteractivePrompt 的核心构建器:

FeishuCardBuilder.build_card(CardPayload(title="...", body="...", color="blue"))
# → json.dumps(card_dict)

Markdown 转换(_md#

  • **bold**<strong>bold</strong>

  • 反引号代码段 → <code>code</code>

  • &<> 转义为 HTML 实体

cards/output — 智能体输出卡片#

build_output_card(title, body, provider, color, actions)
# → FeishuCardBuilder.build_card(CardPayload(...))

build_code_output_card(title, code, language, provider, max_chars)
# → json.dumps({header, elements: [{tag: "markdown", content: "```lang\ncode\n```"}]})

cards/prompt — 权限/提问卡片#

build_permission_card(title, body, options, cancel_text)
# → 带批准按钮的飞书交互卡片

build_question_card(title, question, options, cancel_text)
# → 带多选按钮的飞书交互卡片

飞书 markdown 限制#

飞书 markdown 不支持 <pre><code> 标签中的 `` `language `` 代码围栏。 ``cards/output.py:build_code_output_card 通过在 <markdown> 元素标签内 使用 `` ``` `` markdown 语法(由飞书渲染为代码块)来绕过此限制, 但某些飞书版本对此支持不稳定。对于超过几行的代码输出, 建议改用文件消息发送。

cards/streaming — VerboseCardStreamer#

详见 cards/streaming.rst 的完整调用栈文档。

卡片大小限制#

飞书强制每张卡片最大约 30 KB。FeishuCardBuilder._truncate_code 将代码块截断到 2000 字符。VerboseCardStreamer._build_card 在文本超过 28 KB 时添加截断警告。