mirror of
https://github.com/hellodigua/ChatLab.git
synced 2026-05-26 16:40:17 +08:00
feat: 聊天会话底部显示token消耗
This commit is contained in:
@@ -20,7 +20,7 @@
|
||||
- **严禁**用于窃取、监控或分析未经授权的他人隐私。
|
||||
- **严禁**将分析结果用于骚扰、诈骗、人肉搜索或任何侵犯他人权益的行为。
|
||||
- **严禁**用于规避安全措施或网络渗透测试。
|
||||
- **禁止商用**:我们严禁任何个人或机构将本软件用于任何形式的商业盈利行为(如打包销售、提供有偿代分析服务等),因此产生的纠纷与损失由用户自行承担。
|
||||
- **禁止商用**:严禁任何个人或机构将本软件用于任何形式的商业盈利行为(如打包销售、提供有偿代分析服务等),因此产生的纠纷与损失由用户自行承担。
|
||||
|
||||
## 4. 风险警告
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@ const {
|
||||
currentConversationId,
|
||||
currentToolStatus,
|
||||
toolsUsedInCurrentRound,
|
||||
sessionTokenUsage,
|
||||
sendMessage,
|
||||
loadConversation,
|
||||
startNewConversation,
|
||||
@@ -514,8 +515,18 @@ watch(
|
||||
</template>
|
||||
</UPopover>
|
||||
|
||||
<!-- 右侧:配置状态指示 -->
|
||||
<!-- 右侧:Token 使用量 + 配置状态指示 -->
|
||||
<div class="flex items-center gap-3">
|
||||
<!-- Token 使用量 -->
|
||||
<div
|
||||
v-if="sessionTokenUsage.totalTokens > 0"
|
||||
class="flex items-center gap-1.5 text-xs text-gray-400"
|
||||
title="本次会话累计 Token 使用量"
|
||||
>
|
||||
<UIcon name="i-heroicons-chart-bar-square" class="h-3.5 w-3.5" />
|
||||
<span>{{ sessionTokenUsage.totalTokens.toLocaleString() }} tokens</span>
|
||||
</div>
|
||||
|
||||
<div
|
||||
v-if="!isCheckingConfig"
|
||||
class="flex items-center gap-1.5 text-xs transition-colors"
|
||||
|
||||
@@ -67,6 +67,13 @@ export interface ToolStatus {
|
||||
result?: unknown
|
||||
}
|
||||
|
||||
// Token 使用量类型
|
||||
export interface TokenUsage {
|
||||
promptTokens: number
|
||||
completionTokens: number
|
||||
totalTokens: number
|
||||
}
|
||||
|
||||
// 工具名称映射(英文 → 中文)
|
||||
const TOOL_DISPLAY_NAMES: Record<string, string> = {
|
||||
search_messages: '搜索聊天记录',
|
||||
@@ -105,6 +112,9 @@ export function useAIChat(
|
||||
const currentToolStatus = ref<ToolStatus | null>(null)
|
||||
const toolsUsedInCurrentRound = ref<string[]>([])
|
||||
|
||||
// Token 使用量(当前会话累计)
|
||||
const sessionTokenUsage = ref<TokenUsage>({ promptTokens: 0, completionTokens: 0, totalTokens: 0 })
|
||||
|
||||
// 中止控制
|
||||
let isAborted = false
|
||||
// 当前请求 ID,用于区分不同请求的响应
|
||||
@@ -339,9 +349,18 @@ export function useAIChat(
|
||||
break
|
||||
|
||||
case 'done':
|
||||
// 完成
|
||||
console.log('[AI] Agent 完成')
|
||||
// 完成 - 更新 Token 使用量
|
||||
console.log('[AI] Agent 完成', chunk.usage)
|
||||
currentToolStatus.value = null
|
||||
// 更新会话累计 Token(流式响应在最后一个 chunk 返回 usage)
|
||||
if (chunk.usage) {
|
||||
sessionTokenUsage.value = {
|
||||
promptTokens: sessionTokenUsage.value.promptTokens + chunk.usage.promptTokens,
|
||||
completionTokens: sessionTokenUsage.value.completionTokens + chunk.usage.completionTokens,
|
||||
totalTokens: sessionTokenUsage.value.totalTokens + chunk.usage.totalTokens,
|
||||
}
|
||||
console.log('[AI] Token 使用量更新:', sessionTokenUsage.value)
|
||||
}
|
||||
break
|
||||
|
||||
case 'error':
|
||||
@@ -506,6 +525,8 @@ export function useAIChat(
|
||||
messages.value = []
|
||||
sourceMessages.value = []
|
||||
currentKeywords.value = []
|
||||
// 重置 Token 计数
|
||||
sessionTokenUsage.value = { promptTokens: 0, completionTokens: 0, totalTokens: 0 }
|
||||
|
||||
if (welcomeMessage) {
|
||||
messages.value.push({
|
||||
@@ -573,6 +594,7 @@ export function useAIChat(
|
||||
currentConversationId,
|
||||
currentToolStatus,
|
||||
toolsUsedInCurrentRound,
|
||||
sessionTokenUsage,
|
||||
|
||||
// 方法
|
||||
sendMessage,
|
||||
|
||||
Reference in New Issue
Block a user