This commit is contained in:
ViperEkura 2026-04-27 23:03:35 +08:00
parent 89d9a753b6
commit e07326ce33
6 changed files with 16 additions and 9 deletions

View File

@ -31,9 +31,9 @@
<div class="message-footer">
<span class="message-time">{{ formatTime(message.created_at) }}</span>
<template v-if="message.role === 'assistant' && message.usage">
<span class="token-item" v-if="message.usage.prompt">{{ formatNumber(message.usage.prompt) }} in</span>
<span class="token-item" v-if="message.usage.completion">{{ formatNumber(message.usage.completion) }} out</span>
<span class="token-item" v-if="message.usage.total">{{ formatNumber(message.usage.total) }} total</span>
<span class="token-item" v-if="message.usage.prompt_tokens">{{ formatNumber(message.usage.prompt_tokens) }} in</span>
<span class="token-item" v-if="message.usage.completion_tokens">{{ formatNumber(message.usage.completion_tokens) }} out</span>
<span class="token-item" v-if="message.usage.total_tokens">{{ formatNumber(message.usage.total_tokens) }} total</span>
</template>
<button v-if="message.role === 'assistant'" class="ghost-btn success" @click="$emit('regenerate', message.id)" title="重新生成">
<span v-html="regenerateIcon"></span>

View File

@ -2,7 +2,7 @@ import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import router from './router'
import { pinia } from './utils'
import pinia from './utils/store.js'
// 初始化夜间模式
if (localStorage.getItem('theme') === 'dark') {

View File

@ -1 +0,0 @@
export { default as pinia } from './store.js'

View File

@ -40,6 +40,8 @@ onMounted(async () => {
if (convs.status === 'fulfilled' && convs.value.success) {
stats.value.conversations = convs.value.data?.total || 0
const items = convs.value.data?.items || []
console.log('[HomeView] conversations response:', convs.value.data)
console.log('[HomeView] items with token_count:', items.map(i => ({ id: i.id, token_count: i.token_count })))
stats.value.totalTokens = items.reduce((sum, c) => sum + (c.token_count || 0), 0)
}
if (tools.status === 'fulfilled' && tools.value.success) {

View File

@ -65,14 +65,17 @@ def list_conversations(
).all()
total_tokens = 0
for msg in assistant_messages:
total_tokens += msg.token_count or 0
# Also try to get usage from the usage field
# Get usage from the usage field (new format from LLM)
if msg.usage:
try:
usage_obj = json.loads(msg.usage)
total_tokens = usage_obj.get("total_tokens", total_tokens)
total_tokens += usage_obj.get("total_tokens", 0)
except:
pass
# Fallback to token_count field
total_tokens += msg.token_count or 0
else:
# Legacy messages without usage field
total_tokens += msg.token_count or 0
conv_dict['token_count'] = total_tokens
items.append(conv_dict)

View File

@ -105,6 +105,9 @@ class ToolRegistry:
# Automatic permission check (transparent to tool function)
if context is not None and context.user_id is not None:
user_level = context.extra.get("user_permission_level", CommandPermission.READ_ONLY)
# Ensure user_level is an enum for comparison and display
if isinstance(user_level, int):
user_level = CommandPermission(user_level)
if user_level < tool.required_permission:
return {
"success": False,