feat: add token usage and top questions statistics retrieval

v3.2
wxg0103 2025-11-13 14:55:47 +08:00
parent 719ba08c6e
commit 74b1bce315
4 changed files with 127 additions and 63 deletions

View File

@ -192,6 +192,26 @@ const getStatistics: (
) => Promise<Result<any>> = (application_id, data, loading) => { ) => Promise<Result<any>> = (application_id, data, loading) => {
return get(`${prefix.value}/${application_id}/application_stats`, data, loading) return get(`${prefix.value}/${application_id}/application_stats`, data, loading)
} }
/**
* token
*/
const getTokenUsage: (
application_id: string,
data: any,
loading?: Ref<boolean>,
) => Promise<Result<any>> = (application_id, data, loading) => {
return get(`${prefix.value}/${application_id}/application_token_usage`, data, loading)
}
/**
*
*/
const topQuestions: (
application_id: string,
data: any,
loading?: Ref<boolean>,
) => Promise<Result<any>> = (application_id, data, loading) => {
return get(`${prefix.value}/${application_id}/top_questions`, data, loading)
}
/** /**
* id * id
* @param application_id id * @param application_id id
@ -408,5 +428,7 @@ export default {
speechToText, speechToText,
getMcpTools, getMcpTools,
postUploadFile, postUploadFile,
generate_prompt generate_prompt,
getTokenUsage,
topQuestions
} }

View File

@ -111,6 +111,23 @@ const getStatistics: (
) => Promise<Result<any>> = (application_id, data, loading) => { ) => Promise<Result<any>> = (application_id, data, loading) => {
return get(`${prefix}/${application_id}/application_stats`, data, loading) return get(`${prefix}/${application_id}/application_stats`, data, loading)
} }
/**
* token
*/
const getTokenUsage: (
application_id: string,
data: any,
loading?: Ref<boolean>,
) => Promise<Result<any>> = (application_id, data, loading) => {
return get(`${prefix}/${application_id}/application_token_usage`, data, loading)
}
const topQuestions: (
application_id: string,
data: any,
loading?: Ref<boolean>,
) => Promise<Result<any>> = (application_id, data, loading) => {
return get(`${prefix}/${application_id}/top_questions`, data, loading)
}
/** /**
* id * id
* @param application_id id * @param application_id id
@ -174,7 +191,7 @@ const playDemoText: (application_id: string, data: any, loading?: Ref<boolean>)
* *
*/ */
const postTextToSpeech: ( const postTextToSpeech: (
application_id: String, application_id: string,
data: any, data: any,
loading?: Ref<boolean>, loading?: Ref<boolean>,
) => Promise<Result<any>> = (application_id, data, loading) => { ) => Promise<Result<any>> = (application_id, data, loading) => {
@ -184,7 +201,7 @@ const postTextToSpeech: (
* *
*/ */
const speechToText: ( const speechToText: (
application_id: String, application_id: string,
data: any, data: any,
loading?: Ref<boolean>, loading?: Ref<boolean>,
) => Promise<Result<any>> = (application_id, data, loading) => { ) => Promise<Result<any>> = (application_id, data, loading) => {
@ -289,7 +306,7 @@ const updatePlatformConfig: (
/** /**
* mcp * mcp
*/ */
const getMcpTools: (application_id: String, loading?: Ref<boolean>) => Promise<Result<any>> = ( const getMcpTools: (application_id: string, loading?: Ref<boolean>) => Promise<Result<any>> = (
application_id, application_id,
loading, loading,
) => { ) => {
@ -320,5 +337,7 @@ export default {
speechToText, speechToText,
getMcpTools, getMcpTools,
putXpackAccessToken, putXpackAccessToken,
generate_prompt generate_prompt,
getTokenUsage,
topQuestions
} }

View File

@ -59,11 +59,20 @@ import AppCharts from '@/components/app-charts/index.vue'
import {getAttrsArray, getSum} from '@/utils/array' import {getAttrsArray, getSum} from '@/utils/array'
import {numberFormat} from '@/utils/common' import {numberFormat} from '@/utils/common'
import {t} from '@/locales' import {t} from '@/locales'
const props = defineProps({ const props = defineProps({
data: { data: {
type: Array, type: Array,
default: () => [], default: () => [],
}, },
tokenUsage: {
type: Array,
default: () => [],
},
topQuestions: {
type: Array,
default: () => [],
}
}) })
const statisticsType = computed(() => [ const statisticsType = computed(() => [
{ {

View File

@ -173,7 +173,8 @@
/> />
</div> </div>
<div v-loading="statisticsLoading"> <div v-loading="statisticsLoading">
<StatisticsCharts :data="statisticsData" /> <StatisticsCharts :data="statisticsData" :token-usage="tokenUsage"
:top-questions="topQuestions"/>
</div> </div>
</el-card> </el-card>
</div> </div>
@ -287,6 +288,8 @@ const daterange = ref({
const statisticsLoading = ref(false) const statisticsLoading = ref(false)
const statisticsData = ref([]) const statisticsData = ref([])
const tokenUsage = ref([])
const topQuestions = ref([])
const apiInputParams = ref([]) const apiInputParams = ref([])
@ -356,6 +359,16 @@ function getAppStatistics() {
.then((res: any) => { .then((res: any) => {
statisticsData.value = res.data statisticsData.value = res.data
}) })
loadSharedApi({type: 'application', systemType: apiType.value})
.getTokenUsage(id, daterange.value, statisticsLoading)
.then((res: any) => {
tokenUsage.value = res.data
})
loadSharedApi({type: 'application', systemType: apiType.value})
.topQuestions(id, daterange.value, statisticsLoading)
.then((res: any) => {
topQuestions.value = res.data
})
} }
function refreshAccessToken() { function refreshAccessToken() {
@ -374,7 +387,8 @@ function refreshAccessToken() {
const str = t('views.applicationOverview.appInfo.refreshToken.refreshSuccess') const str = t('views.applicationOverview.appInfo.refreshToken.refreshSuccess')
updateAccessToken(obj, str) updateAccessToken(obj, str)
}) })
.catch(() => {}) .catch(() => {
})
} }
async function changeState(bool: boolean) { async function changeState(bool: boolean) {