feat(消息通知): 添加对markdown格式消息的支持

新增send_markdown函数用于发送富文本格式消息,替换原有send_text调用以支持代码块、标题等格式内容显示。自动分割长消息为多个卡片发送,提升消息展示效果。
This commit is contained in:
Yuyao Huang (Sam) 2026-03-29 18:38:23 +08:00
parent 28e0fe7c27
commit c6e38026ec
3 changed files with 32 additions and 5 deletions

View File

@ -108,6 +108,33 @@ async def send_text(receive_id: str, receive_id_type: str, text: str) -> None:
await asyncio.sleep(0.3) await asyncio.sleep(0.3)
async def send_markdown(receive_id: str, receive_id_type: str, content: str) -> None:
"""
Send a markdown card message. Used for LLM/agent replies that contain
formatted text (code blocks, headings, bold, lists, etc.).
Automatically splits long content into multiple cards.
"""
parts = _split_message(content)
for i, part in enumerate(parts):
card = {
"schema": "2.0",
"body": {
"elements": [
{
"tag": "markdown",
"content": part,
}
]
}
}
await send_card(receive_id, receive_id_type, card)
if len(parts) > 1 and i < len(parts) - 1:
await asyncio.sleep(0.3)
async def send_card(receive_id: str, receive_id_type: str, card: dict) -> None: async def send_card(receive_id: str, receive_id_type: str, card: dict) -> None:
""" """
Send an interactive card message. Send an interactive card message.

View File

@ -13,7 +13,7 @@ import lark_oapi as lark
from lark_oapi.api.im.v1 import P2ImMessageReceiveV1 from lark_oapi.api.im.v1 import P2ImMessageReceiveV1
from bot.commands import handle_command from bot.commands import handle_command
from bot.feishu import send_text from bot.feishu import send_text, send_markdown
from config import FEISHU_APP_ID, FEISHU_APP_SECRET, is_user_allowed from config import FEISHU_APP_ID, FEISHU_APP_SECRET, is_user_allowed
from orchestrator.agent import agent from orchestrator.agent import agent
from orchestrator.tools import set_current_chat from orchestrator.tools import set_current_chat
@ -177,14 +177,14 @@ async def _process_message(user_id: str, chat_id: str, text: str) -> None:
try: try:
reply = await forward(node_id, user_id, chat_id, text) reply = await forward(node_id, user_id, chat_id, text)
if reply: if reply:
await send_text(chat_id, "chat_id", reply) await send_markdown(chat_id, "chat_id", reply)
except Exception as e: except Exception as e:
logger.exception("Failed to forward to node %s", node_id) logger.exception("Failed to forward to node %s", node_id)
await send_text(chat_id, "chat_id", f"Error communicating with node: {e}") await send_text(chat_id, "chat_id", f"Error communicating with node: {e}")
else: else:
reply = await agent.run(user_id, text) reply = await agent.run(user_id, text)
if reply: if reply:
await send_text(chat_id, "chat_id", reply) await send_markdown(chat_id, "chat_id", reply)
except Exception: except Exception:
logger.exception("Error processing message for user %s", user_id) logger.exception("Error processing message for user %s", user_id)

View File

@ -96,10 +96,10 @@ async def handle_task_complete(msg: TaskComplete) -> None:
"""Handle a task completion notification from a host client.""" """Handle a task completion notification from a host client."""
logger.info("Task %s completed for user %s", msg.task_id, msg.user_id) logger.info("Task %s completed for user %s", msg.task_id, msg.user_id)
from bot.feishu import send_text from bot.feishu import send_markdown
try: try:
await send_text(msg.chat_id, "chat_id", msg.result) await send_markdown(msg.chat_id, "chat_id", msg.result)
except Exception as e: except Exception as e:
logger.error("Failed to send task completion notification: %s", e) logger.error("Failed to send task completion notification: %s", e)