@@ -543,19 +543,27 @@ def _normalize_content_item(item: Dict[str, Any]) -> ContentItem:
543543 )
544544 return AudioContent (attachment = attachment )
545545
546- # File content (Chat Completions only )
546+ # File content (Chat Completions API )
547547 elif item_type == "file" :
548548 file_data = item .get ("file" , {})
549549 file_id = file_data .get ("file_id" )
550- file_data_b64 = file_data .get ("file_data" )
550+ file_data_content = file_data .get ("file_data" )
551551 filename = file_data .get ("filename" , "file" )
552552
553- if file_data_b64 :
554- attachment = Attachment .from_base64 (
555- data_base64 = file_data_b64 ,
556- name = filename ,
557- media_type = "application/octet-stream" ,
558- )
553+ if file_data_content :
554+ if file_data_content .startswith ("data:" ):
555+ # Parse data URL: data:application/pdf;base64,{base64_data}
556+ attachment = _parse_data_url_to_attachment (
557+ file_data_content , default_type = "file"
558+ )
559+ attachment .name = filename
560+ else :
561+ # Raw base64 data
562+ attachment = Attachment .from_base64 (
563+ data_base64 = file_data_content ,
564+ name = filename ,
565+ media_type = "application/octet-stream" ,
566+ )
559567 elif file_id :
560568 # Just reference the file ID (can't download without API call)
561569 attachment = Attachment (name = filename )
@@ -565,6 +573,25 @@ def _normalize_content_item(item: Dict[str, Any]) -> ContentItem:
565573
566574 return FileContent (attachment = attachment )
567575
576+ # File content (Responses API) - different structure than Chat Completions
577+ elif item_type == "input_file" :
578+ filename = item .get ("filename" , "file" )
579+ file_data = item .get ("file_data" , "" )
580+ file_id = item .get ("file_id" )
581+
582+ if file_data and file_data .startswith ("data:" ):
583+ # Parse data URL: data:application/pdf;base64,{base64_data}
584+ attachment = _parse_data_url_to_attachment (file_data , default_type = "file" )
585+ attachment .name = filename
586+ elif file_id :
587+ # Just reference the file ID
588+ attachment = Attachment (name = filename )
589+ attachment .metadata ["openai_file_id" ] = file_id
590+ else :
591+ attachment = Attachment (name = filename )
592+
593+ return FileContent (attachment = attachment )
594+
568595 else :
569596 # Unknown type, return as TextContent with string representation
570597 logger .debug ("Unknown content item type: %s" , item_type )
0 commit comments