@@ -40,7 +40,7 @@ const FALLBACK_SHAPE = {
4040export function buildPreviewModel ( log ) {
4141 const errors = [ ] ;
4242 const urlInfo = parseUrlInfo ( log ?. request ?. url ) ;
43- const shape = SHAPES . find ( ( candidate ) => candidate . match ( urlInfo ) ) || FALLBACK_SHAPE ;
43+ const shape = resolveShape ( urlInfo ) ;
4444
4545 let normalized ;
4646 try {
@@ -65,6 +65,20 @@ export function buildPreviewModel(log) {
6565 } ;
6666}
6767
68+ export function getRequestMessageCount ( log ) {
69+ const urlInfo = parseUrlInfo ( log ?. request ?. url ) ;
70+ const shape = resolveShape ( urlInfo ) ;
71+ if ( shape . id === 'other' ) return null ;
72+
73+ try {
74+ const requestMessages = normalizeRequestMessages ( shape . id , log ) ;
75+ if ( ! Array . isArray ( requestMessages ) ) return null ;
76+ return requestMessages . length ;
77+ } catch {
78+ return null ;
79+ }
80+ }
81+
6882function parseUrlInfo ( rawUrl ) {
6983 if ( ! rawUrl || typeof rawUrl !== 'string' ) {
7084 return { raw : '' , pathname : '' , hostname : '' } ;
@@ -82,6 +96,10 @@ function parseUrlInfo(rawUrl) {
8296 }
8397}
8498
99+ function resolveShape ( urlInfo ) {
100+ return SHAPES . find ( ( candidate ) => candidate . match ( urlInfo ) ) || FALLBACK_SHAPE ;
101+ }
102+
85103function normalizeCompletions ( log , urlInfo , errors ) {
86104 const requestBody = asObject ( log ?. request ?. body ) ;
87105 const responseBody = log ?. response ?. body ;
@@ -317,6 +335,85 @@ function normalizeOther(log) {
317335 } ;
318336}
319337
338+ function normalizeRequestMessages ( shapeId , log ) {
339+ const requestBody = asObject ( log ?. request ?. body ) ;
340+
341+ if ( shapeId === 'completions' ) {
342+ return normalizeCompletionsRequestMessages ( requestBody ) ;
343+ }
344+ if ( shapeId === 'responses' ) {
345+ return normalizeResponsesInput ( requestBody ) ;
346+ }
347+ if ( shapeId === 'anthropic' ) {
348+ return normalizeAnthropicRequestMessages ( requestBody ) ;
349+ }
350+ if ( shapeId === 'gemini' ) {
351+ return normalizeGeminiRequestMessages ( requestBody ) ;
352+ }
353+
354+ return null ;
355+ }
356+
357+ function normalizeCompletionsRequestMessages ( requestBody ) {
358+ const requestMessages = normalizeOpenAIChatMessages ( requestBody . messages ) ;
359+ if ( requestMessages . length === 0 && typeof requestBody . prompt === 'string' ) {
360+ requestMessages . push ( {
361+ role : 'user' ,
362+ name : null ,
363+ parts : [ { type : 'text' , text : requestBody . prompt } ] ,
364+ metadata : { } ,
365+ } ) ;
366+ } else if ( requestMessages . length === 0 && Array . isArray ( requestBody . prompt ) ) {
367+ for ( const prompt of requestBody . prompt ) {
368+ if ( typeof prompt === 'string' ) {
369+ requestMessages . push ( {
370+ role : 'user' ,
371+ name : null ,
372+ parts : [ { type : 'text' , text : prompt } ] ,
373+ metadata : { } ,
374+ } ) ;
375+ }
376+ }
377+ }
378+ return requestMessages ;
379+ }
380+
381+ function normalizeAnthropicRequestMessages ( requestBody ) {
382+ const requestMessages = [ ] ;
383+ if ( typeof requestBody . system === 'string' ) {
384+ requestMessages . push ( {
385+ role : 'system' ,
386+ name : null ,
387+ parts : [ { type : 'text' , text : requestBody . system } ] ,
388+ metadata : { } ,
389+ } ) ;
390+ } else if ( Array . isArray ( requestBody . system ) ) {
391+ requestMessages . push ( {
392+ role : 'system' ,
393+ name : null ,
394+ parts : normalizeAnthropicContent ( requestBody . system ) ,
395+ metadata : { } ,
396+ } ) ;
397+ }
398+ requestMessages . push ( ...normalizeAnthropicMessages ( requestBody . messages ) ) ;
399+ return requestMessages ;
400+ }
401+
402+ function normalizeGeminiRequestMessages ( requestBody ) {
403+ const requestMessages = [ ] ;
404+ if ( requestBody . systemInstruction ) {
405+ const parts = normalizeGeminiParts ( requestBody . systemInstruction . parts || requestBody . systemInstruction ) ;
406+ requestMessages . push ( {
407+ role : 'system' ,
408+ name : null ,
409+ parts,
410+ metadata : { } ,
411+ } ) ;
412+ }
413+ requestMessages . push ( ...normalizeGeminiMessages ( requestBody . contents ) ) ;
414+ return requestMessages ;
415+ }
416+
320417function normalizeOpenAIChatMessages ( messages ) {
321418 if ( ! Array . isArray ( messages ) ) return [ ] ;
322419 return messages
0 commit comments