11import {
22 DynamicResourceAction ,
3+ GenerateResponse ,
34 genkit ,
45 ModelReference ,
56 ToolAction ,
@@ -27,6 +28,7 @@ import {
2728 GenkitModelProvider ,
2829 PromptDataForCounting ,
2930} from './model-provider.js' ;
31+ import { ToolLogEntry } from '../../shared-interfaces.js' ;
3032
3133const globalLogger = new GenkitLogger ( ) ;
3234logger . init ( globalLogger ) ;
@@ -38,6 +40,7 @@ export class GenkitRunner implements LlmRunner {
3840 readonly hasBuiltInRepairLoop = false ;
3941 private readonly genkitInstance = this . getGenkitInstance ( ) ;
4042 private mcpHost : GenkitMcpHost | null = null ;
43+ private toolLogs : ToolLogEntry [ ] = [ ] ;
4144
4245 async generateConstrained < T extends z . ZodTypeAny = z . ZodTypeAny > (
4346 options : LlmConstrainedOutputGenerateRequestOptions < T >
@@ -75,9 +78,14 @@ export class GenkitRunner implements LlmRunner {
7578 files : result . output . outputFiles || [ ] ,
7679 usage : result . usage ,
7780 reasoning : result . reasoning ,
81+ toolLogs : this . flushToolLogs ( ) ,
7882 } ;
7983 }
8084
85+ flushToolLogs ( ) : ToolLogEntry [ ] {
86+ return this . toolLogs . splice ( 0 ) ;
87+ }
88+
8189 async generateText (
8290 options : LlmGenerateTextRequestOptions
8391 ) : Promise < LlmGenerateTextResponse > {
@@ -87,6 +95,7 @@ export class GenkitRunner implements LlmRunner {
8795 text : result . text ,
8896 usage : result . usage ,
8997 reasoning : result . reasoning ,
98+ toolLogs : this . flushToolLogs ( ) ,
9099 } ;
91100 }
92101
@@ -120,7 +129,7 @@ export class GenkitRunner implements LlmRunner {
120129 ] ) ;
121130 }
122131
123- return this . genkitInstance . generate ( {
132+ const response = await this . genkitInstance . generate ( {
124133 prompt : options . prompt ,
125134 model,
126135 output : schema
@@ -145,6 +154,10 @@ export class GenkitRunner implements LlmRunner {
145154 resources,
146155 abortSignal : options . abortSignal ,
147156 } ) ;
157+
158+ this . _logToolUsage ( response ) ;
159+
160+ return response ;
148161 } ;
149162
150163 return options . timeout
@@ -158,6 +171,42 @@ export class GenkitRunner implements LlmRunner {
158171 ) ;
159172 }
160173
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+
161210 startMcpServerHost ( hostName : string , servers : McpServerOptions [ ] ) : void {
162211 if ( this . mcpHost !== null ) {
163212 throw new Error ( 'MCP host is already started' ) ;
0 commit comments