1
1
import {
2
2
DynamicResourceAction ,
3
+ GenerateResponse ,
3
4
genkit ,
4
5
ModelReference ,
5
6
ToolAction ,
@@ -27,6 +28,7 @@ import {
27
28
GenkitModelProvider ,
28
29
PromptDataForCounting ,
29
30
} from './model-provider.js' ;
31
+ import { ToolLogEntry } from '../../shared-interfaces.js' ;
30
32
31
33
const globalLogger = new GenkitLogger ( ) ;
32
34
logger . init ( globalLogger ) ;
@@ -38,6 +40,7 @@ export class GenkitRunner implements LlmRunner {
38
40
readonly hasBuiltInRepairLoop = false ;
39
41
private readonly genkitInstance = this . getGenkitInstance ( ) ;
40
42
private mcpHost : GenkitMcpHost | null = null ;
43
+ private toolLogs : ToolLogEntry [ ] = [ ] ;
41
44
42
45
async generateConstrained < T extends z . ZodTypeAny = z . ZodTypeAny > (
43
46
options : LlmConstrainedOutputGenerateRequestOptions < T >
@@ -75,9 +78,14 @@ export class GenkitRunner implements LlmRunner {
75
78
files : result . output . outputFiles || [ ] ,
76
79
usage : result . usage ,
77
80
reasoning : result . reasoning ,
81
+ toolLogs : this . flushToolLogs ( ) ,
78
82
} ;
79
83
}
80
84
85
+ flushToolLogs ( ) : ToolLogEntry [ ] {
86
+ return this . toolLogs . splice ( 0 ) ;
87
+ }
88
+
81
89
async generateText (
82
90
options : LlmGenerateTextRequestOptions
83
91
) : Promise < LlmGenerateTextResponse > {
@@ -87,6 +95,7 @@ export class GenkitRunner implements LlmRunner {
87
95
text : result . text ,
88
96
usage : result . usage ,
89
97
reasoning : result . reasoning ,
98
+ toolLogs : this . flushToolLogs ( ) ,
90
99
} ;
91
100
}
92
101
@@ -120,7 +129,7 @@ export class GenkitRunner implements LlmRunner {
120
129
] ) ;
121
130
}
122
131
123
- return this . genkitInstance . generate ( {
132
+ const response = await this . genkitInstance . generate ( {
124
133
prompt : options . prompt ,
125
134
model,
126
135
output : schema
@@ -145,6 +154,10 @@ export class GenkitRunner implements LlmRunner {
145
154
resources,
146
155
abortSignal : options . abortSignal ,
147
156
} ) ;
157
+
158
+ this . _logToolUsage ( response ) ;
159
+
160
+ return response ;
148
161
} ;
149
162
150
163
return options . timeout
@@ -158,6 +171,42 @@ export class GenkitRunner implements LlmRunner {
158
171
) ;
159
172
}
160
173
174
+ private _logToolUsage ( response : GenerateResponse < any > ) {
175
+ const toolRequests = new Map < string , any > ( ) ;
176
+ const toolResponses = new Map < string , any > ( ) ;
177
+
178
+ if ( response . request ?. messages ) {
179
+ for ( const message of response . request . messages ) {
180
+ if ( ! message . content ) {
181
+ continue ;
182
+ }
183
+ for ( const contentPart of message . content ) {
184
+ if ( contentPart . toolRequest ) {
185
+ toolRequests . set (
186
+ contentPart . toolRequest . ref || '0' ,
187
+ contentPart . toolRequest
188
+ ) ;
189
+ } else if ( contentPart . toolResponse ) {
190
+ toolResponses . set (
191
+ contentPart . toolResponse . ref || '0' ,
192
+ contentPart . toolResponse
193
+ ) ;
194
+ }
195
+ }
196
+ }
197
+ }
198
+
199
+ for ( const [ ref , toolRequest ] of toolRequests . entries ( ) ) {
200
+ const toolResponse = toolResponses . get ( ref ) ;
201
+ if ( toolResponse ) {
202
+ this . toolLogs . push ( {
203
+ request : toolRequest ,
204
+ response : toolResponse ,
205
+ } ) ;
206
+ }
207
+ }
208
+ }
209
+
161
210
startMcpServerHost ( hostName : string , servers : McpServerOptions [ ] ) : void {
162
211
if ( this . mcpHost !== null ) {
163
212
throw new Error ( 'MCP host is already started' ) ;
0 commit comments