diff --git a/pkg/api/http/controller/groups/stats.py b/pkg/api/http/controller/groups/stats.py new file mode 100644 index 00000000..45326035 --- /dev/null +++ b/pkg/api/http/controller/groups/stats.py @@ -0,0 +1,23 @@ +import quart +import asyncio + +from .....core import app, taskmgr +from .. import group + + +@group.group_class('stats', '/api/v1/stats') +class StatsRouterGroup(group.RouterGroup): + + async def initialize(self) -> None: + @self.route('/basic', methods=['GET']) + async def _() -> str: + + conv_count = 0 + for session in self.ap.sess_mgr.session_list: + conv_count += len(session.conversations if session.conversations is not None else []) + + return self.success(data={ + 'active_session_count': len(self.ap.sess_mgr.session_list), + 'conversation_count': conv_count, + 'query_count': self.ap.query_pool.query_id_counter, + }) diff --git a/pkg/api/http/controller/groups/system.py b/pkg/api/http/controller/groups/system.py index 17dcba7e..a967d6b1 100644 --- a/pkg/api/http/controller/groups/system.py +++ b/pkg/api/http/controller/groups/system.py @@ -15,7 +15,8 @@ class SystemRouterGroup(group.RouterGroup): return self.success( data={ "version": constants.semantic_version, - "debug": constants.debug_mode + "debug": constants.debug_mode, + "enabled_platform_count": len(self.ap.platform_mgr.adapters) } ) diff --git a/pkg/api/http/controller/main.py b/pkg/api/http/controller/main.py index be9685b1..35ac7616 100644 --- a/pkg/api/http/controller/main.py +++ b/pkg/api/http/controller/main.py @@ -6,7 +6,7 @@ import quart import quart_cors from ....core import app -from .groups import logs, system, settings, plugins +from .groups import logs, system, settings, plugins, stats from . import group diff --git a/web/src/pages/DashBoard.vue b/web/src/pages/DashBoard.vue index bc48c5cd..2c17e575 100644 --- a/web/src/pages/DashBoard.vue +++ b/web/src/pages/DashBoard.vue @@ -10,9 +10,9 @@
- - - + + +
@@ -23,7 +23,7 @@
- +
@@ -34,7 +34,7 @@
- +
@@ -46,8 +46,45 @@ import PageTitle from '@/components/PageTitle.vue' import NumberFieldData from '@/components/NumberFieldData.vue' -import { ref, onMounted } from 'vue' +import { ref, onMounted, inject, getCurrentInstance } from 'vue' +const { proxy } = getCurrentInstance() + +const snackbar = inject('snackbar') + +const basicData = ref({ + active_session_count: 0, + conversation_count: 0, + query_count: 0, +}) + +const pluginsAmount = ref(0) + +const refresh = () => { + proxy.$axios.get('/stats/basic').then(res => { + if (res.data.code != 0) { + snackbar.error(res.data.msg) + return + } + basicData.value = res.data.data + }).catch(error => { + snackbar.error(error) + }) + + proxy.$axios.get('/plugins').then(res => { + if (res.data.code != 0) { + snackbar.error(res.data.msg) + return + } + pluginsAmount.value = res.data.data.plugins.length + }).catch(error => { + snackbar.error(error) + }) + + proxy.$store.commit('fetchSystemInfo') +} + +onMounted(refresh)