更新
This commit is contained in:
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调用失败')
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user