refactor: Implement LLM tracing callback to improve parsing of tokens usage stats (#9311)

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
This commit is contained in:
oleg
2024-05-12 21:12:07 +02:00
committed by GitHub
parent 244520547b
commit 359ade45bc
19 changed files with 282 additions and 111 deletions

View File

@@ -31,7 +31,7 @@
{{
$locale.baseText('runData.aiContentBlock.tokens', {
interpolate: {
count: consumedTokensSum?.totalTokens.toString()!,
count: formatTokenUsageCount(consumedTokensSum?.totalTokens ?? 0),
},
})
}}
@@ -42,7 +42,7 @@
{{
$locale.baseText('runData.aiContentBlock.tokens', {
interpolate: {
count: consumedTokensSum?.promptTokens.toString()!,
count: formatTokenUsageCount(consumedTokensSum?.promptTokens ?? 0),
},
})
}}
@@ -53,7 +53,7 @@
{{
$locale.baseText('runData.aiContentBlock.tokens', {
interpolate: {
count: consumedTokensSum?.completionTokens.toString()!,
count: formatTokenUsageCount(consumedTokensSum?.completionTokens ?? 0),
},
})
}}
@@ -75,12 +75,7 @@
import type { IAiData, IAiDataContent } from '@/Interface';
import { useNodeTypesStore } from '@/stores/nodeTypes.store';
import { useWorkflowsStore } from '@/stores/workflows.store';
import type {
IDataObject,
INodeExecutionData,
INodeTypeDescription,
NodeConnectionType,
} from 'n8n-workflow';
import type { INodeExecutionData, INodeTypeDescription, NodeConnectionType } from 'n8n-workflow';
import { computed } from 'vue';
import NodeIcon from '@/components/NodeIcon.vue';
import AiRunContentBlock from './AiRunContentBlock.vue';
@@ -105,12 +100,13 @@ type TokenUsageData = {
promptTokens: number;
totalTokens: number;
};
const consumedTokensSum = computed(() => {
// eslint-disable-next-line @typescript-eslint/no-use-before-define
const consumedTokensSum1 = outputRun.value?.data?.reduce(
const tokenUsage = outputRun.value?.data?.reduce(
(acc: TokenUsageData, curr: INodeExecutionData) => {
const response = curr.json?.response as IDataObject;
const tokenUsageData = (response?.llmOutput as IDataObject)?.tokenUsage as TokenUsageData;
const tokenUsageData = (curr.json?.tokenUsage ??
curr.json?.tokenUsageEstimate) as TokenUsageData;
if (!tokenUsageData) return acc;
@@ -127,9 +123,16 @@ const consumedTokensSum = computed(() => {
},
);
return consumedTokensSum1;
return tokenUsage;
});
const usingTokensEstimates = computed(() => {
return outputRun.value?.data?.some((d) => d.json?.tokenUsageEstimate);
});
function formatTokenUsageCount(count: number) {
return usingTokensEstimates.value ? `~${count}` : count.toString();
}
function extractRunMeta(run: IAiDataContent) {
const uiNode = workflowsStore.getNodeByName(props.inputData.node);
const nodeType = nodeTypesStore.getNodeType(uiNode?.type ?? '');