@@ -127,6 +127,53 @@ def test_free_mode_sends_no_context(self, mock_build_ctx):
127127
128128 mock_build_ctx .assert_not_called ()
129129
130+ @patch ('odoo.addons.account_invoice_digitize_ai.models.ai_document.render_pdf_pages_for_vision' )
131+ @patch ('odoo.addons.account_invoice_digitize_ai.models.ai_fiscal_context.build_fiscal_context' )
132+ def test_vision_pdf_uses_rendered_pages (self , mock_build_ctx , mock_render_pdf ):
133+ """Vision mode for PDFs should send rendered page images, not raw PDF bytes."""
134+ self ._set_mode ('guided' )
135+ mock_build_ctx .return_value = 'full context'
136+ mock_render_pdf .return_value = [
137+ {'media_type' : 'image/png' , 'data' : 'page-one' },
138+ {'media_type' : 'image/png' , 'data' : 'page-two' },
139+ ]
140+
141+ doc_info = {'text' : '' , 'is_vision' : True }
142+ _system_prompt , user_content , _user_prompt = self .move ._ai_build_content (
143+ doc_info ,
144+ b'%PDF-1.7 fake' ,
145+ 'application/pdf' ,
146+ self .partner ,
147+ self .company ,
148+ False ,
149+ )
150+
151+ image_blocks = [block for block in user_content if block .get ('type' ) == 'image' ]
152+ self .assertEqual (len (image_blocks ), 2 )
153+ self .assertEqual (image_blocks [0 ]['source' ]['data' ], 'page-one' )
154+ self .assertEqual (image_blocks [1 ]['source' ]['data' ], 'page-two' )
155+ self .assertEqual (user_content [- 1 ]['type' ], 'text' )
156+
157+ @patch ('odoo.addons.account_invoice_digitize_ai.models.ai_document.render_pdf_pages_for_vision' )
158+ @patch ('odoo.addons.account_invoice_digitize_ai.models.ai_fiscal_context.build_fiscal_context' )
159+ def test_vision_pdf_without_rendered_pages_returns_no_content (self , mock_build_ctx , mock_render_pdf ):
160+ """Vision mode should not build a prompt-only payload when PDF rendering fails."""
161+ self ._set_mode ('guided' )
162+ mock_build_ctx .return_value = 'full context'
163+ mock_render_pdf .return_value = []
164+
165+ doc_info = {'text' : '' , 'is_vision' : True }
166+ _system_prompt , user_content , _user_prompt = self .move ._ai_build_content (
167+ doc_info ,
168+ b'%PDF-1.7 fake' ,
169+ 'application/pdf' ,
170+ self .partner ,
171+ self .company ,
172+ False ,
173+ )
174+
175+ self .assertEqual (user_content , [])
176+
130177 # ---------------------------------------------------------------
131178 # Vendor memory in prompt
132179 # ---------------------------------------------------------------
0 commit comments