This commit is contained in:
hero920103 committed 2026-11-13 20:26:16 +08:00
1 parent b6b528490c
commit 4ab63e77ed
28 files changed
+1858 -695

No files matched your search

@@ -158,16 +158,20 @@
</template>
</div>
<div
v-if="msg.role === 'assistant' && (msg.tokens || msg.durationMs || msg.firstTokenMs)"
v-if="msg.role === 'assistant' && (msg.tokens || msg.durationMs || msg.firstTokenMs || msg.model || msg.providerName || msg.provider_name)"
class="message-meta"
>
<span v-if="msg.firstTokenMs" class="meta-item">首字 {{ (msg.firstTokenMs / 1000).toFixed(1) }}s</span>
<span v-if="msg.firstTokenMs" class="meta-dot">·</span>
<span class="meta-item">{{ formatDuration(msg.durationMs) }}</span>
<span class="meta-dot">·</span>
<span class="meta-item">{{ msg.tokens }} tokens</span>
<span v-if="msg.model" class="meta-dot">·</span>
<span v-if="msg.model" class="meta-item">{{ msg.model }}</span>
<span v-if="msg.providerName || msg.provider_name || msg.model" class="meta-item">
{{ msg.providerName || msg.provider_name || '未知厂商' }}<template v-if="msg.model"> · {{ msg.model }}</template>
</span>
<span v-if="msg.tokens || msg.durationMs" class="meta-dot">·</span>
<span v-if="msg.durationMs" class="meta-item">用时 {{ formatDuration(msg.durationMs) }}</span>
<span v-if="msg.durationMs && msg.tokens" class="meta-dot">·</span>
<span v-if="msg.tokens" class="meta-item">{{ formatTokenRate(msg.tokens, msg.durationMs) }} token/s</span>
<span v-if="msg.tokens" class="meta-dot">·</span>
<span v-if="msg.tokens" class="meta-item">{{ msg.tokens }} tokens</span>
</div>
<div class="message-actions">
<el-tooltip content="复制" placement="top">
@@ -369,6 +373,17 @@ const currentModels = computed(() => {
return p && p.models ? p.models : []
})
const currentProvider = computed(() =>
providerList.value.find((item) => item.id === selectedProviderId.value) || null
)
function formatTokenRate(tokens, durationMs) {
const count = Number(tokens || 0)
const elapsed = Number(durationMs || 0)
if (!count || !elapsed) return '—'
return (count / (elapsed / 1000)).toFixed(1)
}
onMounted(() => {
fetchProviders()
fetchDefaultPreset()
@@ -475,7 +490,11 @@ async function fetchMessages(sessionId) {
try {
const res = await getChatMessageList(sessionId)
if (res.code === 200) {
messages.value = res.data.list || []
messages.value = (res.data.list || []).map((msg) => ({
...msg,
durationMs: msg.durationMs ?? msg.duration_ms ?? 0,
providerName: msg.providerName || msg.provider_name || '',
}))
scrollToBottom()
}
} catch (e) {
@@ -748,9 +767,10 @@ async function doSend(content, images = []) {
scrollToBottom()
} else if (eventType === 'done') {
aiMsg.id = parsed.message_id
if (parsed.tokens) aiMsg.tokens = parsed.tokens
if (parsed.duration_ms) aiMsg.durationMs = parsed.duration_ms
if (parsed.tokens !== undefined) aiMsg.tokens = parsed.tokens
if (parsed.duration_ms !== undefined) aiMsg.durationMs = parsed.duration_ms
if (parsed.model) aiMsg.model = parsed.model
aiMsg.providerName = parsed.provider_name || currentProvider.value?.name || ''
} else if (eventType === 'error') {
streamError = new Error(parsed.error || 'AI调用失败')
}