@@ -20,6 +20,7 @@ import { RecursiveCharacterTextSplitter } from '../../../common/textSplitter';
2020export interface GenAiCommitProps {
2121 cacheSummary ?: string ;
2222 onStreamMessage ?: ( message : string ) => void ;
23+ onTokenUsage ?: ( tokenUsage : number ) => void ;
2324 setLoadingInfo : ( text : string ) => void ;
2425 setSummary : ( text : string ) => void ;
2526}
@@ -52,7 +53,13 @@ export class Commits {
5253 this . prompt = promptCommits ( ) ;
5354 }
5455
55- async genCommit ( { setLoadingInfo, setSummary, cacheSummary, onStreamMessage } : GenAiCommitProps ) {
56+ async genCommit ( {
57+ setLoadingInfo,
58+ setSummary,
59+ cacheSummary,
60+ onStreamMessage,
61+ onTokenUsage,
62+ } : GenAiCommitProps ) {
5663 setLoadingInfo ( ' Generating...' ) ;
5764
5865 // STEP 1
@@ -63,16 +70,21 @@ export class Commits {
6370 summary,
6471 } ) ;
6572
73+ // Calculate input tokens
74+ const inputTokens = calcToken ( JSON . stringify ( messages ) ) ;
75+
6676 if ( this . config . stream && onStreamMessage ) {
67- return this . genCommitStream ( messages , onStreamMessage ) ;
77+ return this . genCommitStream ( messages , onStreamMessage , onTokenUsage , inputTokens ) ;
6878 } else {
69- return this . genCommitNonStream ( messages ) ;
79+ return this . genCommitNonStream ( messages , onTokenUsage , inputTokens ) ;
7080 }
7181 }
7282
7383 private async genCommitStream (
7484 messages : any [ ] ,
7585 onStreamMessage : ( message : string ) => void ,
86+ onTokenUsage ?: ( tokenUsage : number ) => void ,
87+ inputTokens ?: number ,
7688 ) : Promise < string > {
7789 // 开始流式输出,先调用一次回调来切换UI状态
7890 onStreamMessage ( '' ) ;
@@ -85,6 +97,7 @@ export class Commits {
8597 } ) ;
8698
8799 let fullMessage = '' ;
100+ let tokenUsage = inputTokens || 0 ;
88101
89102 for await ( const chunk of stream ) {
90103 const content = chunk . choices [ 0 ] ?. delta ?. content || '' ;
@@ -95,19 +108,26 @@ export class Commits {
95108 fullMessage . replace ( / \( ( .* ?) \) : / , ( match , p1 ) => match && `(${ p1 . toLowerCase ( ) } ):` ) ,
96109 ) ;
97110 onStreamMessage ( processedMessage ) ;
111+ tokenUsage += calcToken ( content ) ;
98112 }
99113 }
100114
101115 if ( ! fullMessage ) {
102116 alert . error ( 'Diff summary failed, please check your network or try again...' , true ) ;
103117 }
104118
119+ onTokenUsage ?.( tokenUsage ) ;
120+
105121 return addEmojiToMessage (
106122 fullMessage . replace ( / \( ( .* ?) \) : / , ( match , p1 ) => match && `(${ p1 . toLowerCase ( ) } ):` ) ,
107123 ) ;
108124 }
109125
110- private async genCommitNonStream ( messages : any [ ] ) : Promise < string > {
126+ private async genCommitNonStream (
127+ messages : any [ ] ,
128+ onTokenUsage ?: ( tokenUsage : number ) => void ,
129+ inputTokens ?: number ,
130+ ) : Promise < string > {
111131 const completion = await this . client . chat . completions . create ( {
112132 messages : messages as OpenAI . Chat . Completions . ChatCompletionMessageParam [ ] ,
113133 model : this . config . modelName ,
@@ -119,6 +139,10 @@ export class Commits {
119139 if ( ! result )
120140 alert . error ( 'Diff summary failed, please check your network or try again...' , true ) ;
121141
142+ const outputTokens = calcToken ( result ! ) ;
143+ const totalTokenUsage = ( inputTokens || 0 ) + outputTokens ;
144+ onTokenUsage ?.( totalTokenUsage ) ;
145+
122146 return addEmojiToMessage (
123147 result ! . replace ( / \( ( .* ?) \) : / , ( match , p1 ) => match && `(${ p1 . toLowerCase ( ) } ):` ) ,
124148 ) ;
0 commit comments