@@ -15,6 +15,7 @@ import {
1515} from './helpers/studio-agent-run-request'
1616import { ensureDefaultStudioWorkspaceExists } from '../studio-agent/workspace/default-studio-workspace'
1717import { createLogger } from '../utils/logger'
18+ import { logPlotStudioTiming , readElapsedMs } from '../studio-agent/observability/plot-studio-timing'
1819
1920const router = express . Router ( )
2021const logger = createLogger ( 'StudioAgentRoute' )
@@ -119,25 +120,13 @@ router.get('/studio-agent/works/:sessionId', authMiddleware, asyncHandler(async
119120} ) )
120121
121122router . get ( '/studio-agent/events' , authMiddleware , asyncHandler ( async ( req , res ) => {
122- logger . info ( 'Studio SSE client connected' , {
123- ip : req . ip ,
124- userAgent : req . get ( 'user-agent' ) ?? '' ,
125- } )
126123 res . setHeader ( 'Content-Type' , 'text/event-stream' )
127124 res . setHeader ( 'Cache-Control' , 'no-cache, no-transform' )
128125 res . setHeader ( 'Connection' , 'keep-alive' )
129126 res . flushHeaders ?.( )
130127
131128 const backlog = studioRuntime . listExternalEvents ( )
132129 for ( const event of backlog ) {
133- logger . info ( 'Writing backlog SSE event' , {
134- type : event . type ,
135- sessionId : ( event . properties as { sessionId ?: string ; sessionID ?: string ; run ?: { sessionId ?: string } } ) ?. sessionId
136- ?? ( event . properties as { sessionID ?: string } ) ?. sessionID
137- ?? ( event . properties as { run ?: { sessionId ?: string } } ) ?. run ?. sessionId
138- ?? null ,
139- runId : ( event . properties as { runId ?: string } ) ?. runId ?? null ,
140- } )
141130 res . write ( `event: ${ event . type } \n` )
142131 res . write ( `data: ${ JSON . stringify ( event ) } \n\n` )
143132 }
@@ -148,14 +137,6 @@ router.get('/studio-agent/events', authMiddleware, asyncHandler(async (req, res)
148137 } , 15000 )
149138
150139 const unsubscribe = studioRuntime . subscribeExternalEvents ( ( event ) => {
151- logger . info ( 'Writing live SSE event' , {
152- type : event . type ,
153- sessionId : ( event . properties as { sessionId ?: string ; sessionID ?: string ; run ?: { sessionId ?: string } } ) ?. sessionId
154- ?? ( event . properties as { sessionID ?: string } ) ?. sessionID
155- ?? ( event . properties as { run ?: { sessionId ?: string } } ) ?. run ?. sessionId
156- ?? null ,
157- runId : ( event . properties as { runId ?: string } ) ?. runId ?? null ,
158- } )
159140 res . write ( `event: ${ event . type } \n` )
160141 res . write ( `data: ${ JSON . stringify ( event ) } \n\n` )
161142 } )
@@ -164,17 +145,14 @@ router.get('/studio-agent/events', authMiddleware, asyncHandler(async (req, res)
164145 res . write ( `data: ${ JSON . stringify ( { type : 'studio.connected' , properties : { timestamp : Date . now ( ) } } ) } \n\n` )
165146
166147 req . on ( 'close' , ( ) => {
167- logger . info ( 'Studio SSE client disconnected' , {
168- ip : req . ip ,
169- userAgent : req . get ( 'user-agent' ) ?? '' ,
170- } )
171148 clearInterval ( heartbeat )
172149 unsubscribe ( )
173150 res . end ( )
174151 } )
175152} ) )
176153
177154router . post ( '/studio-agent/runs' , authMiddleware , asyncHandler ( async ( req , res ) => {
155+ const requestStartedAt = Date . now ( )
178156 const parsed = parseStudioCreateRunRequest ( req . body )
179157 const sessionId = parsed . sessionId
180158 const inputText = parsed . inputText
@@ -189,19 +167,15 @@ router.post('/studio-agent/runs', authMiddleware, asyncHandler(async (req, res)
189167 return sendStudioError ( res , 404 , 'NOT_FOUND' , 'Session not found' , { sessionId } )
190168 }
191169
192- logger . info ( 'Studio run requested', {
170+ logPlotStudioTiming ( session . studioKind , 'http. run. requested', {
193171 sessionId,
194172 projectId,
195- agent : session . agentType ,
196- studioKind : session . studioKind ,
197- inputPreview : summarizeInput ( inputText ) ,
198173 inputLength : inputText . length ,
199174 hasCustomApiConfig : Boolean (
200175 parsed . customApiConfig ?. apiUrl ?. trim ( )
201176 && parsed . customApiConfig ?. apiKey ?. trim ( )
202177 && parsed . customApiConfig ?. model ?. trim ( )
203178 ) ,
204- toolChoice : parsed . toolChoice ?? null ,
205179 } )
206180
207181 const started = await studioRuntime . startRun ( {
@@ -221,10 +195,11 @@ router.post('/studio-agent/runs', authMiddleware, asyncHandler(async (req, res)
221195 } )
222196 }
223197
224- logger . info ( 'Studio run started ', {
198+ logPlotStudioTiming ( session . studioKind , 'http. run.accepted ', {
225199 sessionId,
226200 runId : started . run . id ,
227201 assistantMessageId : started . assistantMessage . id ,
202+ durationMs : readElapsedMs ( requestStartedAt ) ,
228203 } )
229204
230205 await studioRuntime . syncSession ( session . id )
@@ -352,8 +327,3 @@ router.post('/studio-agent/permissions/reply', authMiddleware, replyPermissionHa
352327router . post ( '/studio-agent/permissions/:requestID/reply' , authMiddleware , replyPermissionHandler )
353328
354329export default router
355-
356- function summarizeInput ( inputText : string ) : string {
357- const normalized = inputText . replace ( / \s + / g, ' ' ) . trim ( )
358- return normalized . length > 120 ? `${ normalized . slice ( 0 , 117 ) } ...` : normalized
359- }
0 commit comments