11import { createLogger } from '@sim/logger'
2+ import { isRecordLike } from '@sim/utils'
23import { getErrorMessage , toError } from '@sim/utils/errors'
34import { sleep } from '@sim/utils/helpers'
45import { type NextRequest , NextResponse } from 'next/server'
@@ -431,10 +432,6 @@ const FALAI_IMAGE_MODEL_CONFIGS: Record<string, FalAIImageModelConfig> = {
431432 } ,
432433}
433434
434- function isRecord ( value : unknown ) : value is Record < string , unknown > {
435- return typeof value === 'object' && value !== null && ! Array . isArray ( value )
436- }
437-
438435function getStringProperty (
439436 record : Record < string , unknown > | undefined ,
440437 key : string
@@ -452,7 +449,7 @@ function getNumberProperty(
452449}
453450
454451function firstRecord ( value : unknown ) : Record < string , unknown > | undefined {
455- return Array . isArray ( value ) ? value . find ( isRecord ) : undefined
452+ return Array . isArray ( value ) ? value . find ( isRecordLike ) : undefined
456453}
457454
458455function pickAllowed (
@@ -575,7 +572,7 @@ async function generateWithOpenAI(
575572 maxBytes : MAX_IMAGE_JSON_BYTES ,
576573 label : 'OpenAI image response' ,
577574 } )
578- if ( ! isRecord ( data ) ) {
575+ if ( ! isRecordLike ( data ) ) {
579576 throw new Error ( 'Invalid OpenAI image response' )
580577 }
581578
@@ -669,27 +666,27 @@ async function generateWithGemini(
669666 maxBytes : MAX_IMAGE_JSON_BYTES ,
670667 label : 'Gemini image response' ,
671668 } )
672- if ( ! isRecord ( data ) ) {
669+ if ( ! isRecordLike ( data ) ) {
673670 throw new Error ( 'Invalid Gemini image response' )
674671 }
675672
676673 const candidate = firstRecord ( data . candidates )
677- const content = isRecord ( candidate ?. content ) ? candidate . content : undefined
674+ const content = isRecordLike ( candidate ?. content ) ? candidate . content : undefined
678675 const parts = Array . isArray ( content ?. parts ) ? content . parts : [ ]
679- const textPart = parts . find ( ( part ) => isRecord ( part ) && typeof part . text === 'string' )
676+ const textPart = parts . find ( ( part ) => isRecordLike ( part ) && typeof part . text === 'string' )
680677 const imagePart = parts . find ( ( part ) => {
681- if ( ! isRecord ( part ) ) return false
682- return isRecord ( part . inlineData ) || isRecord ( part . inline_data )
678+ if ( ! isRecordLike ( part ) ) return false
679+ return isRecordLike ( part . inlineData ) || isRecordLike ( part . inline_data )
683680 } )
684681
685- if ( ! isRecord ( imagePart ) ) {
682+ if ( ! isRecordLike ( imagePart ) ) {
686683 logger . error ( `[${ requestId } ] Gemini response missing image part` )
687684 throw new Error ( 'No image data found in Gemini response' )
688685 }
689686
690- const inlineData = isRecord ( imagePart . inlineData )
687+ const inlineData = isRecordLike ( imagePart . inlineData )
691688 ? imagePart . inlineData
692- : isRecord ( imagePart . inline_data )
689+ : isRecordLike ( imagePart . inline_data )
693690 ? imagePart . inline_data
694691 : undefined
695692 const base64Image = getStringProperty ( inlineData , 'data' )
@@ -712,7 +709,7 @@ async function generateWithGemini(
712709 fileName : `gemini-${ model } .${ extensionFromContentType ( contentType ) } ` ,
713710 provider : 'gemini' ,
714711 model,
715- description : isRecord ( textPart ) ? getStringProperty ( textPart , 'text' ) : undefined ,
712+ description : isRecordLike ( textPart ) ? getStringProperty ( textPart , 'text' ) : undefined ,
716713 }
717714}
718715
@@ -722,7 +719,7 @@ function buildFalAIQueueUrl(endpoint: string, requestId: string, path: 'status'
722719
723720function getFalAIErrorMessage ( error : unknown ) : string {
724721 if ( typeof error === 'string' ) return error
725- if ( isRecord ( error ) ) {
722+ if ( isRecordLike ( error ) ) {
726723 return (
727724 getStringProperty ( error , 'message' ) ||
728725 getStringProperty ( error , 'detail' ) ||
@@ -835,7 +832,7 @@ async function generateWithFalAI(
835832 maxBytes : MAX_IMAGE_JSON_BYTES ,
836833 label : 'Fal.ai create response' ,
837834 } )
838- if ( ! isRecord ( createData ) ) {
835+ if ( ! isRecordLike ( createData ) ) {
839836 throw new Error ( 'Invalid Fal.ai queue response' )
840837 }
841838
@@ -878,7 +875,7 @@ async function generateWithFalAI(
878875 maxBytes : MAX_IMAGE_JSON_BYTES ,
879876 label : 'Fal.ai status response' ,
880877 } )
881- if ( ! isRecord ( statusData ) ) {
878+ if ( ! isRecordLike ( statusData ) ) {
882879 throw new Error ( 'Invalid Fal.ai status response' )
883880 }
884881
@@ -910,7 +907,7 @@ async function generateWithFalAI(
910907 maxBytes : MAX_IMAGE_JSON_BYTES ,
911908 label : 'Fal.ai result response' ,
912909 } )
913- if ( ! isRecord ( resultData ) ) {
910+ if ( ! isRecordLike ( resultData ) ) {
914911 throw new Error ( 'Invalid Fal.ai result response' )
915912 }
916913
0 commit comments