Feat/monitor (#1928)

* feat: add monitor

* feat: fix tab

* feat: work

* feat: not reliable monitor

* feat: enhance monitoring page layout with integrated filters and refresh button

* feat: add support for runner recording

* feat: add jump button & alignment

* feat: new

* fix: not show query variables in local agent

* fix: pnpm lint and python ruff check

* fix: ruff fromat

* chore: remove unnecessary migration

* style: optimize monitoring page layout and fix sticky filter issues

- Enhanced metric cards with gradient backgrounds and hover effects
- Increased traffic chart height from 200px to 300px
- Adjusted grid layout and spacing for better visual appeal
- Fixed sticky filter area to properly cover parent padding without transparent gaps
- Used negative margins and positioning to eliminate scrolling artifacts
- Matched padding/margins with other pages (pipelines, bots) for consistency
- Removed duplicate title/subtitle from page content
- Added cursor-pointer styling to tab triggers
- Removed border between tab list and tab content

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix: apply prettier formatting to monitoring components

- Fixed indentation and spacing in MetricCard.tsx
- Fixed formatting in TrafficChart.tsx
- Applied prettier formatting to page.tsx

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* feat: update HomeSidebar to trigger action on child selection and localize monitoring titles

* refactor: streamline LLM and embedding invocation methods

* feat: add embedding model monitor

* fix: database version

* chore: simplify pnpm-lock.yaml formatting

---------

Co-authored-by: Junyan Qin <rockchinq@gmail.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Guanchao Wang
2026-01-26 21:08:23 +08:00
committed by GitHub
parent b73847f1a6
commit 5d9f6ec763
37 changed files with 6706 additions and 3182 deletions

View File

@@ -276,6 +276,10 @@ const enUS = {
allLevels: 'All Levels',
selectLevel: 'Select Level',
levelsSelected: 'levels selected',
viewDetailedLogs: 'View Detailed Logs',
viewDetails: 'Details',
collapse: 'Collapse',
imagesAttached: 'image(s) attached',
},
plugins: {
title: 'Extensions',
@@ -802,6 +806,140 @@ const enUS = {
spaceEmailMismatch:
'Space login email does not match the local account email',
},
monitoring: {
title: 'Monitoring',
description: 'Monitor bot activities, LLM calls, and system performance',
overview: 'Overview',
totalMessages: 'Total Messages',
llmCallsCount: 'LLM Calls',
modelCallsCount: 'Model Calls',
successRate: 'Success Rate',
activeSessions: 'Active Sessions',
last24Hours: 'Last 24 hours',
filters: {
title: 'Filters',
bot: 'Bot',
pipeline: 'Pipeline',
allBots: 'All Bots',
selectBot: 'Select Bot',
allPipelines: 'All Pipelines',
selectPipeline: 'Select Pipeline',
loading: 'Loading...',
timeRange: 'Time Range',
customRange: 'Custom Range',
from: 'From',
to: 'To',
apply: 'Apply',
reset: 'Reset Filters',
lastHour: 'Last 1 hour',
last6Hours: 'Last 6 hours',
last24Hours: 'Last 24 hours',
last7Days: 'Last 7 days',
last30Days: 'Last 30 days',
},
tabs: {
messages: 'Message Records',
llmCalls: 'LLM Calls',
embeddingCalls: 'Embedding Calls',
modelCalls: 'Model Calls',
sessions: 'Session Analysis',
errors: 'Error Logs',
},
messageList: {
timestamp: 'Timestamp',
bot: 'Bot',
pipeline: 'Pipeline',
message: 'Message',
sessionId: 'Session ID',
status: 'Status',
actions: 'Actions',
viewDetails: 'View Details',
copyId: 'Copy ID',
noMessages: 'No messages found',
noMessagesDescription: 'Try adjusting your filters or check back later',
loading: 'Loading messages...',
loadMore: 'Load More',
autoRefresh: 'Auto Refresh',
platform: 'Role',
user: 'User',
level: 'Level',
runner: 'Runner',
viewConversation: 'View Conversation',
},
llmCalls: {
title: 'LLM Calls',
model: 'Model',
tokens: 'Tokens',
duration: 'Duration',
cost: 'Cost',
noData: 'No LLM calls found',
inputTokens: 'Input Tokens',
outputTokens: 'Output Tokens',
totalTokens: 'Total Tokens',
avgDuration: 'Avg Duration',
calls: 'Calls',
},
embeddingCalls: {
title: 'Embedding Calls',
model: 'Model',
tokens: 'Tokens',
duration: 'Duration',
noData: 'No embedding calls found',
promptTokens: 'Prompt Tokens',
totalTokens: 'Total Tokens',
inputCount: 'Input Count',
knowledgeBase: 'Knowledge Base',
queryText: 'Query',
},
modelCalls: {
title: 'Model Calls',
llmModel: 'LLM',
embeddingModel: 'Embedding',
embeddingCall: 'Embedding',
retrieveCall: 'Retrieve',
noData: 'No model calls found',
},
sessions: {
sessionId: 'Session ID',
messageCount: 'Messages',
duration: 'Duration',
lastActivity: 'Last Activity',
noSessions: 'No sessions found',
startTime: 'Start Time',
messageStats: 'Message Statistics',
totalMessages: 'Total Messages',
successMessages: 'Successful',
errorMessages: 'Failed',
llmStats: 'LLM Statistics',
noData: 'Session not found',
},
errors: {
title: 'Errors',
errorType: 'Error Type',
errorMessage: 'Error Message',
occurredAt: 'Occurred At',
noErrors: 'No errors found',
stackTrace: 'Stack Trace',
},
queries: {
title: 'Queries',
},
messageDetails: {
noData: 'No LLM calls or errors for this query',
},
queryVariables: {
title: 'Query Variables',
},
trafficChart: {
title: 'Traffic Overview',
messages: 'Messages',
llmCalls: 'LLM Calls',
noData: 'No traffic data available',
},
viewMonitoring: 'View Monitoring',
refreshData: 'Refresh Data',
exportData: 'Export Data',
},
};
export default enUS;

View File

@@ -811,6 +811,123 @@ const jaJP = {
spaceEmailMismatch:
'Spaceログインのメールアドレスがローカルアカウントのメールアドレスと一致しません',
},
monitoring: {
title: 'モニタリング',
description:
'ボットアクティビティ、LLM呼び出し、システムパフォーマンスを監視',
overview: '概要',
totalMessages: '総メッセージ数',
llmCallsCount: 'LLM呼び出し',
modelCallsCount: 'モデル呼び出し',
successRate: '成功率',
activeSessions: 'アクティブセッション',
last24Hours: '過去24時間',
filters: {
title: 'フィルター',
bot: 'ボット',
pipeline: 'パイプライン',
allBots: 'すべてのボット',
selectBot: 'ボットを選択',
allPipelines: 'すべてのパイプライン',
selectPipeline: 'パイプラインを選択',
loading: '読み込み中...',
timeRange: '時間範囲',
customRange: 'カスタム範囲',
from: '開始',
to: '終了',
apply: '適用',
reset: 'フィルターをリセット',
lastHour: '過去1時間',
last6Hours: '過去6時間',
last24Hours: '過去24時間',
last7Days: '過去7日間',
last30Days: '過去30日間',
},
tabs: {
messages: 'メッセージ記録',
llmCalls: 'LLM呼び出し',
embeddingCalls: 'Embedding呼び出し',
modelCalls: 'モデル呼び出し',
sessions: 'セッション分析',
errors: 'エラーログ',
},
messageList: {
timestamp: 'タイムスタンプ',
bot: 'ボット',
pipeline: 'パイプライン',
message: 'メッセージ',
sessionId: 'セッションID',
status: 'ステータス',
actions: 'アクション',
viewDetails: '詳細を表示',
copyId: 'IDをコピー',
noMessages: 'メッセージが見つかりません',
noMessagesDescription: 'フィルターを調整するか、後で確認してください',
loading: 'メッセージを読み込んでいます...',
loadMore: 'もっと読み込む',
autoRefresh: '自動更新',
platform: 'プラットフォーム',
user: 'ユーザー',
level: 'レベル',
runner: 'ランナー',
viewConversation: '会話詳細を表示',
},
llmCalls: {
model: 'モデル',
tokens: 'トークン数',
duration: '期間',
cost: 'コスト',
noData: 'LLM呼び出し記録が見つかりません',
inputTokens: '入力トークン',
outputTokens: '出力トークン',
totalTokens: '合計トークン数',
},
embeddingCalls: {
title: 'Embedding呼び出し',
model: 'モデル',
tokens: 'トークン数',
duration: '期間',
noData: 'Embedding呼び出し記録が見つかりません',
promptTokens: '入力トークン',
totalTokens: '合計トークン数',
inputCount: '入力数',
knowledgeBase: 'ナレッジベース',
queryText: 'クエリ',
},
modelCalls: {
title: 'モデル呼び出し',
llmModel: '対話モデル',
embeddingModel: '埋め込みモデル',
embeddingCall: '埋め込み呼び出し',
retrieveCall: '検索呼び出し',
noData: 'モデル呼び出し記録が見つかりません',
},
sessions: {
sessionId: 'セッションID',
messageCount: 'メッセージ数',
duration: '期間',
lastActivity: '最終アクティビティ',
noSessions: 'セッションが見つかりません',
startTime: '開始時刻',
},
errors: {
errorType: 'エラータイプ',
errorMessage: 'エラーメッセージ',
occurredAt: '発生時刻',
noErrors: 'エラーが見つかりません',
stackTrace: 'スタックトレース',
title: 'エラー',
},
messageDetails: {
noData: 'このクエリにはLLM呼び出しやエラーがありません',
},
queryVariables: {
title: 'クエリ変数',
},
viewMonitoring: 'モニタリングを表示',
refreshData: 'データを更新',
exportData: 'データをエクスポート',
},
};
export default jaJP;

View File

@@ -265,6 +265,10 @@ const zhHans = {
allLevels: '全部级别',
selectLevel: '选择级别',
levelsSelected: '个级别已选',
viewDetailedLogs: '查看详细日志',
viewDetails: '详情',
collapse: '收起',
imagesAttached: '张图片',
},
plugins: {
title: '插件扩展',
@@ -729,7 +733,7 @@ const zhHans = {
},
llm: {
llmModels: '对话模型',
description: '管理 LLM 模型用于对话消息生成',
description: '管理 LLM 模型,用于对话消息生成',
extraParametersDescription:
'将在请求时附加到请求体中,如 max_tokens, temperature, top_p 等',
},
@@ -763,6 +767,140 @@ const zhHans = {
setPasswordHint: '设置密码后可使用邮箱密码登录',
spaceEmailMismatch: 'Space登录账号邮箱与本实例账号邮箱不匹配',
},
monitoring: {
title: '日志监控',
description: '查看机器人活动、LLM调用和系统性能',
overview: '概览',
totalMessages: '总消息数',
llmCallsCount: 'LLM调用',
modelCallsCount: '模型调用',
successRate: '成功率',
activeSessions: '活跃会话',
last24Hours: '最近24小时',
filters: {
title: '筛选',
bot: '机器人',
pipeline: '流水线',
allBots: '全部机器人',
selectBot: '选择机器人',
allPipelines: '全部流水线',
selectPipeline: '选择流水线',
loading: '加载中...',
timeRange: '时间范围',
customRange: '自定义范围',
from: '从',
to: '到',
apply: '应用',
reset: '重置筛选',
lastHour: '最近1小时',
last6Hours: '最近6小时',
last24Hours: '最近24小时',
last7Days: '最近7天',
last30Days: '最近30天',
},
tabs: {
messages: '消息记录',
llmCalls: 'LLM调用',
embeddingCalls: 'Embedding调用',
modelCalls: '模型调用',
sessions: '会话分析',
errors: '错误日志',
},
messageList: {
timestamp: '时间戳',
bot: '机器人',
pipeline: '流水线',
message: '消息',
sessionId: '会话ID',
status: '状态',
actions: '操作',
viewDetails: '查看详情',
copyId: '复制ID',
noMessages: '未找到消息',
noMessagesDescription: '尝试调整筛选条件或稍后查看',
loading: '加载消息中...',
loadMore: '加载更多',
autoRefresh: '自动刷新',
platform: '角色',
user: '用户',
level: '级别',
runner: '执行器',
viewConversation: '显示对话详情',
},
llmCalls: {
title: 'LLM调用',
model: '模型',
tokens: 'Token数',
duration: '持续时间',
cost: '成本',
noData: '未找到LLM调用记录',
inputTokens: '输入Token',
outputTokens: '输出Token',
totalTokens: '总Token数',
avgDuration: '平均耗时',
calls: '调用次数',
},
embeddingCalls: {
title: 'Embedding调用',
model: '模型',
tokens: 'Token数',
duration: '持续时间',
noData: '未找到Embedding调用记录',
promptTokens: '输入Token',
totalTokens: '总Token数',
inputCount: '输入数量',
knowledgeBase: '知识库',
queryText: '查询文本',
},
modelCalls: {
title: '模型调用',
llmModel: '对话模型',
embeddingModel: '嵌入模型',
embeddingCall: '嵌入调用',
retrieveCall: '检索调用',
noData: '未找到模型调用记录',
},
sessions: {
sessionId: '会话ID',
messageCount: '消息数',
duration: '持续时间',
lastActivity: '最后活动',
noSessions: '未找到会话',
startTime: '开始时间',
messageStats: '消息统计',
totalMessages: '总消息数',
successMessages: '成功',
errorMessages: '失败',
llmStats: 'LLM统计',
noData: '会话未找到',
},
errors: {
title: '错误',
errorType: '错误类型',
errorMessage: '错误消息',
occurredAt: '发生时间',
noErrors: '未找到错误',
stackTrace: '堆栈追踪',
},
queries: {
title: '查询记录',
},
messageDetails: {
noData: '此查询没有LLM调用或错误记录',
},
queryVariables: {
title: '查询变量',
},
trafficChart: {
title: '流量概览',
messages: '消息数',
llmCalls: 'LLM调用',
noData: '暂无流量数据',
},
viewMonitoring: '查看日志监控',
refreshData: '刷新数据',
exportData: '导出数据',
},
};
export default zhHans;

View File

@@ -760,6 +760,122 @@ const zhHant = {
setPasswordHint: '設定密碼後可使用電子郵件密碼登入',
spaceEmailMismatch: 'Space登入帳號電子郵件與本實例帳號電子郵件不匹配',
},
monitoring: {
title: '日誌監控',
description: '監控機器人活動、LLM調用和系統效能',
overview: '概覽',
totalMessages: '總訊息數',
llmCallsCount: 'LLM調用',
modelCallsCount: '模型調用',
successRate: '成功率',
activeSessions: '活躍會話',
last24Hours: '最近24小時',
filters: {
title: '篩選',
bot: '機器人',
pipeline: '流水線',
allBots: '全部機器人',
selectBot: '選擇機器人',
allPipelines: '全部流水線',
selectPipeline: '選擇流水線',
loading: '載入中...',
timeRange: '時間範圍',
customRange: '自訂範圍',
from: '從',
to: '到',
apply: '套用',
reset: '重置篩選',
lastHour: '最近1小時',
last6Hours: '最近6小時',
last24Hours: '最近24小時',
last7Days: '最近7天',
last30Days: '最近30天',
},
tabs: {
messages: '訊息記錄',
llmCalls: 'LLM調用',
embeddingCalls: 'Embedding調用',
modelCalls: '模型調用',
sessions: '會話分析',
errors: '錯誤日誌',
},
messageList: {
timestamp: '時間戳記',
bot: '機器人',
pipeline: '流水線',
message: '訊息',
sessionId: '會話ID',
status: '狀態',
actions: '操作',
viewDetails: '查看詳情',
copyId: '複製ID',
noMessages: '未找到訊息',
noMessagesDescription: '嘗試調整篩選條件或稍後查看',
loading: '載入訊息中...',
loadMore: '載入更多',
autoRefresh: '自動重新整理',
platform: '平台',
user: '使用者',
level: '級別',
runner: '執行器',
viewConversation: '顯示對話詳情',
},
llmCalls: {
model: '模型',
tokens: '代幣數',
duration: '持續時間',
cost: '成本',
noData: '未找到LLM調用記錄',
inputTokens: '輸入代幣',
outputTokens: '輸出代幣',
totalTokens: '總代幣數',
},
embeddingCalls: {
title: 'Embedding調用',
model: '模型',
tokens: '代幣數',
duration: '持續時間',
noData: '未找到Embedding調用記錄',
promptTokens: '輸入代幣',
totalTokens: '總代幣數',
inputCount: '輸入數量',
knowledgeBase: '知識庫',
queryText: '查詢文字',
},
modelCalls: {
title: '模型調用',
llmModel: '對話模型',
embeddingModel: '嵌入模型',
embeddingCall: '嵌入調用',
retrieveCall: '檢索調用',
noData: '未找到模型調用記錄',
},
sessions: {
sessionId: '會話ID',
messageCount: '訊息數',
duration: '持續時間',
lastActivity: '最後活動',
noSessions: '未找到會話',
startTime: '開始時間',
},
errors: {
errorType: '錯誤類型',
errorMessage: '錯誤訊息',
occurredAt: '發生時間',
noErrors: '未找到錯誤',
stackTrace: '堆疊追蹤',
title: '錯誤',
},
messageDetails: {
noData: '此查詢沒有LLM調用或錯誤記錄',
},
queryVariables: {
title: '查詢變數',
},
viewMonitoring: '查看日誌監控',
refreshData: '重新整理資料',
exportData: '匯出資料',
},
};
export default zhHant;