File size: 1,379 Bytes
63522a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import { useMemo } from "react";
import useMetricsStore from "#/stores/metrics-store";
import { useActiveConversation } from "#/hooks/query/use-active-conversation";
import { useConversationMetrics } from "#/hooks/query/use-conversation-metrics";

export interface ContextWindowUsage {
  perTurnToken: number;
  contextWindow: number;
}

function toContextWindowUsage(
  usage:
    | {
        per_turn_token?: number | null;
        context_window?: number | null;
      }
    | null
    | undefined,
): ContextWindowUsage | null {
  const contextWindow = usage?.context_window ?? 0;
  if (contextWindow <= 0) {
    return null;
  }

  return {
    perTurnToken: usage?.per_turn_token ?? 0,
    contextWindow,
  };
}

export function useContextWindowUsage(): ContextWindowUsage | null {
  const storeUsage = useMetricsStore((state) => state.usage);
  const { data: conversation } = useActiveConversation();

  const { data: conversationMetrics } = useConversationMetrics(
    conversation?.id,
    conversation?.conversation_url,
    conversation?.session_api_key,
    Boolean(conversation?.id),
  );

  return useMemo(() => {
    const fromStore = toContextWindowUsage(storeUsage);
    if (fromStore) {
      return fromStore;
    }

    return toContextWindowUsage(
      conversationMetrics?.accumulated_token_usage ?? null,
    );
  }, [storeUsage, conversationMetrics]);
}