feat(monitoring): 关联反馈记录与消息ID,新增反馈导出 (#2120)

* feat(monitoring): link feedback to LangBot message ID and add feedback export

- Add pipeline→adapter notification hook so monitoring message ID is
  passed back to WecomBotAdapter after creation
- Store stream_id→monitoring_message_id mapping with 10-min TTL cleanup
- Replace feedback record stream_id with LangBot monitoring message ID
  so feedback can be linked to actual message records
- Rename streamId label to "Related Query ID" in all 7 i18n locales
- Remove non-functional message ID jump button from FeedbackList
- Add feedback export option to ExportDropdown (backend already implemented)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat(monitoring): add combined refresh handler for monitoring and feedback data

* fix(wecombot): improve stream ID mapping and error logging in WecomBotAdapter

* feat(lark): add monitoring message ID mapping for feedback correlation

* feat(lark): rename monitoring message ID mappings for clarity and consistency
feat(feedback): add button to view conversation for feedback items

* feat(bot-session-monitor): add feedback handling for bot messages with visual indicators

* feat(bot-session-monitor): enhance feedback display with hover content for like/dislike indicators

* fix(dingtalk): use voice recognition text instead of raw audio binary

When DingTalk sends a voice message to the bot, the callback JSON contains
a 'recognition' field with the speech-to-text result (powered by Qwen).

Previously, LangBot only extracted the 'downloadCode' to download the raw
audio binary and passed it as 'file_base64' to LLM APIs, which caused
400 errors since most models don't support this content type.

This patch:
- Extracts the 'recognition' field from DingTalk audio message content
- Uses it as plain text input to the LLM instead of raw audio
- Falls back to audio binary only when no recognition text is available
- Fixes duplicate text issue for audio messages with recognition

Fixes voice messages returning 'Request failed' on all LLM models.

* fix: add filereader for dingtalk,lark (#2122)

* fix: add filereader for dingtalk

* feat: add lark

* feat: update uv.lock

* chore: update version to 4.9.6 in pyproject.toml, __init__.py, and uv.lock

* fix: update langbot-plugin version to 0.3.8

* fix: update langbot-plugin version to 0.3.8

* fix(wecombot): extend StreamSession TTL for feedback sessions to prevent context data loss

StreamSessionManager.cleanup() removes sessions after 60s TTL, but feedback
events (like → cancel → dislike) can arrive later. When the session expires
before the dislike event, all context fields (session_id, user_id, message_id,
stream_id) are lost because get_session_by_feedback_id() returns None.

Fix: Sessions with registered feedback_ids now use a 10-minute TTL, aligned
with the adapter's _stream_to_monitoring_msg TTL in wecombot.py.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: 6mvp6 <13727783693@163.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: fdc310 <2213070223@qq.com>
Co-authored-by: haiyangbg <zhouhaiyangaa@gmail.com>
Co-authored-by: Guanchao Wang <wangcham233@gmail.com>
Co-authored-by: Rock Chin <1010553892@qq.com>
This commit is contained in:
6mvp6
2026-04-18 12:56:41 +08:00
committed by GitHub
parent 917edb3413
commit f8010a20eb
15 changed files with 241 additions and 47 deletions

View File

@@ -1163,7 +1163,7 @@ const enUS = {
contextInfo: 'Context Info',
userId: 'User ID',
messageId: 'Message ID',
streamId: 'Stream ID',
streamId: 'Related Query ID',
inaccurateReasons: 'Inaccurate Reasons',
platform: 'Platform',
exportFeedback: 'Export Feedback',
@@ -1194,6 +1194,7 @@ const enUS = {
embeddingCalls: 'Embedding Calls',
errors: 'Error Logs',
sessions: 'Sessions',
feedback: 'User Feedback',
},
},
limitation: {

View File

@@ -1194,7 +1194,7 @@ const esES = {
contextInfo: 'Información de contexto',
userId: 'ID de usuario',
messageId: 'ID de mensaje',
streamId: 'ID de flujo',
streamId: 'ID de consulta relacionada',
inaccurateReasons: 'Razones de inexactitud',
platform: 'Plataforma',
exportFeedback: 'Exportar comentarios',
@@ -1225,6 +1225,7 @@ const esES = {
embeddingCalls: 'Llamadas Embedding',
errors: 'Registros de errores',
sessions: 'Sesiones',
feedback: 'Comentarios de usuarios',
},
},
limitation: {

View File

@@ -1166,7 +1166,7 @@
contextInfo: 'コンテキスト情報',
userId: 'ユーザーID',
messageId: 'メッセージID',
streamId: 'ストリームID',
streamId: '関連質問ID',
inaccurateReasons: '不正確な理由',
platform: 'プラットフォーム',
exportFeedback: 'フィードバックをエクスポート',
@@ -1197,6 +1197,7 @@
embeddingCalls: 'Embedding コール',
errors: 'エラーログ',
sessions: 'セッション',
feedback: 'ユーザーフィードバック',
},
},
limitation: {

View File

@@ -1142,7 +1142,7 @@ const thTH = {
contextInfo: 'ข้อมูลบริบท',
userId: 'ID ผู้ใช้',
messageId: 'ID ข้อความ',
streamId: 'ID สตรีม',
streamId: 'ID คำถามที่เกี่ยวข้อง',
inaccurateReasons: 'เหตุผลที่ไม่ถูกต้อง',
platform: 'แพลตฟอร์ม',
exportFeedback: 'ส่งออกความคิดเห็น',
@@ -1173,6 +1173,7 @@ const thTH = {
embeddingCalls: 'การเรียก Embedding',
errors: 'บันทึกข้อผิดพลาด',
sessions: 'เซสชัน',
feedback: 'ความคิดเห็นผู้ใช้',
},
},
limitation: {

View File

@@ -1163,7 +1163,7 @@ const viVN = {
contextInfo: 'Thông tin ngữ cảnh',
userId: 'ID người dùng',
messageId: 'ID tin nhắn',
streamId: 'ID luồng',
streamId: 'ID câu hỏi liên quan',
inaccurateReasons: 'Lý do không chính xác',
platform: 'Nền tảng',
exportFeedback: 'Xuất phản hồi',
@@ -1194,6 +1194,7 @@ const viVN = {
embeddingCalls: 'Cuộc gọi Embedding',
errors: 'Nhật ký lỗi',
sessions: 'Phiên',
feedback: 'Phản hồi người dùng',
},
},
limitation: {

View File

@@ -1110,7 +1110,7 @@ const zhHans = {
contextInfo: '上下文信息',
userId: '用户ID',
messageId: '消息ID',
streamId: 'ID',
streamId: '关联提问ID',
inaccurateReasons: '不准确原因',
platform: '平台',
exportFeedback: '导出反馈',
@@ -1141,6 +1141,7 @@ const zhHans = {
embeddingCalls: 'Embedding 调用',
errors: '错误日志',
sessions: '会话记录',
feedback: '用户反馈',
},
},
limitation: {

View File

@@ -1109,7 +1109,7 @@ const zhHant = {
contextInfo: '上下文資訊',
userId: '使用者ID',
messageId: '訊息ID',
streamId: '串流ID',
streamId: '關聯提問ID',
inaccurateReasons: '不準確原因',
platform: '平台',
exportFeedback: '匯出反饋',
@@ -1140,6 +1140,7 @@ const zhHant = {
embeddingCalls: 'Embedding 呼叫',
errors: '錯誤日誌',
sessions: '會話記錄',
feedback: '使用者回饋',
},
},
limitation: {