Ë
    ãß²jM  ã                   óð   — d Z ddlZddlZddlmZ ddlmZmZmZm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ d	efd
„Zdededed	e	eee   ef   fd„Zdedededeeef   dee   d	eeef   fd„Zdeded	efd„Zy)uþ   browser_vision helpers: Lightpanda pre-route, native provider vision, auxiliary-LLM screenshot analysis.

Split out of ``tools/browser_tool.py``. Facade-owned state is read through ``_bt`` (``tools.browser_tool``, resolved per call) â€” no import cycle.
é    N)ÚPath)ÚAnyÚDictÚOptionalÚTuple)Úcfg_get)Úorigin)Úbrowser_tool_cloud)Ú browser_tool_lightpanda_fallbackÚreturnc                  óR   — t        j                  «       } | €dS d| j                  › d�S )NÚlocalzcloud (ú))Ú_cloudÚ_get_cloud_providerÚdisplay_name)Ú_cps    ú>/home/ubuntu/.hermes/hermes-agent/tools/browser_tool_vision.pyÚ_vision_mode_labelr      s/   € Ü
×
$Ñ
$Ó
&€CØ�kˆ7ÐD¨°×1AÑ1AÐ0BÀ!Ð'DÐDó    Úeffective_task_idÚannotateÚscreenshot_pathc                 óD  — t        j                  «       }|dk7  st        j                  |«      sdd|fS t        j                  j                  d«       |rdgng }t        j                  | |t        j                  «       «      }t        j                  |t        j                  «      }|j                  d«      s4t        j                  j                  d|j                  d«      «       dd|fS |j                  d	i «      j                  d
d«      }|r~t        j                  j                  |«      r_ddl}ddlm}  |dd«      }	|	j'                  dd¬«       |	d|j)                  «       j*                  › d�z  }
t-        j.                  ||
«       |
}d|j                  d«      |fS )aM  Capture the vision screenshot via the Chrome fallback when Lightpanda is the engine
    (it has no graphical renderer). Returns ``(prerouted, fallback_warning, path)``;
    on fallback failure ``prerouted`` is False and the caller takes the normal
    screenshot path (forcing Chrome) so the standard fallback metadata still applies.Ú
lightpandaFNzDbrowser_vision: pre-routing screenshot to Chrome (engine=lightpanda)z
--annotateÚsuccessz7Lightpanda Chrome fallback vision screenshot failed: %sÚerrorÚdataÚpathÚ r   )Úget_hermes_dirzcache/screenshotsÚbrowser_screenshotsT)ÚparentsÚexist_okÚbrowser_screenshot_z.pngÚfallback_warning)r   Ú_get_browser_engineÚ_should_inject_engineÚ_btÚloggerÚdebugÚ_lpÚ_chrome_fallback_screenshotÚ_get_command_timeoutÚ_annotate_lightpanda_fallbackÚ_LP_VISION_FALLBACK_REASONÚgetÚwarningÚosr   ÚexistsÚuuidÚhermes_constantsr!   ÚmkdirÚuuid4ÚhexÚshutilÚcopy2)r   r   r   ÚengineÚscreenshot_argsÚ	fb_resultÚfb_pathÚuuid_modr!   Úscreenshots_dirÚpersistent_paths              r   Ú_lightpanda_vision_prerouterC      sg  € ô ×'Ñ'Ó)€FØ�Ò¤V×%AÑ%AÀ&Ô%IØ�d˜OÐ+Ð+Ü‡J�J×ÑÐ[Ô\Ù(0�|‘n°b€OÜ×/Ñ/Ð0AÀ?ÔTW×TlÑTlÓTnÓo€IÜ×1Ñ1°)¼S×=[Ñ=[Ó\€IØ�=‰=˜Ô#Ü�
‰
×ÑÐTÐV_×VcÑVcÐdkÓVlÔmØ�d˜OÐ+Ð+Ø�m‰m˜F BÓ'×+Ñ+¨F°BÓ7€GÙ”2—7‘7—>‘> 'Ô*ÛÝ3á(Ð)<Ð>SÓTˆØ×Ñ d°TÐÔ:Ø)Ð.AÀ(Ç.Á.ÓBR×BVÑBVÐAWÐW[Ð,\Ñ\ˆÜ�‰�W˜oÔ.Ø)ˆØ�—‘Ð1Ó2°OÐCÐCr   ÚquestionÚresultÚlp_fallback_warningc                 óž  — ddl m}m}m} ddlm}  || d |«       |d¬«      }	 |t        | «      ||	| j                  «       j                  ¬«      }
|
j                  di «      }t        | «      |d	<   |r||d
<   |r,|j                  di «      j                  d«      r|d   d   |d<   |
j                  dd«      › d| › �j                  «       |
d<   |
S )a5  Multimodal tool-result envelope: the main model inspects the pixels itself.

    The embed is baked into history and re-sent every later turn, so apply the same
    proactive resize as vision_analyze's native path (skipped when already under
    both caps; without Pillow it fails open to the raw bytes).
    r   )Ú_EMBED_MAX_DIMENSIONÚ _build_native_vision_tool_resultÚ_resize_image_for_vision)Úresolve_embed_target_bytesú	image/pngT)Ú	mime_typeÚmax_base64_bytesÚmax_dimensionÚ
force_jpeg)Ú	image_urlrD   Úimage_data_urlÚimage_size_bytesÚmetar   r&   r   ÚannotationsÚtext_summaryr    z Screenshot path: )Útools.vision_toolsrH   rI   rJ   Ú!tools.vision_tools_history_budgetrK   ÚstrÚstatÚst_sizeÚ
setdefaultr1   Ústrip)r   rD   r   rE   rF   rH   rI   rJ   rK   Údata_urlÚnative_resultrT   s               r   Ú_native_vision_resultr`   4   sî   € ÷ñ õ
 Má'¨À;Ù9SÓ9UØ6JÐW[ô]€Hñ 5¼sÀ?Ó?SÐ^fØDLØFU×FZÑFZÓF\×FdÑFdôf€Mð ×#Ñ# F¨BÓ/€DÜ! /Ó2€DÐ	ÑÙØ#6ˆÐÑ Ù�F—J‘J˜v rÓ*×.Ñ.¨}Ô=Ø$ V™n¨]Ñ;ˆˆ]ÑØ'4×'8Ñ'8¸ÈÓ'LÐ&MÐM_Ð`oÐ_pÐ$q×$wÑ$wÓ$y€M�.Ñ!ØÐr   c                 óÄ  — ddl }d|› d�}| j                  «       }|j                  |«      j                  d«      }d|› �}t	        j
                  «       }t        j                  j                  dt        |«      «       d}d	}		 dd
l	m
}
 t         |
«       ddi ¬«      }|j                  d«      �t        |d   «      }|j                  d«      �t        |d   «      }	ddlm} d|	|dd|dœdd|idœgdœgdœ}|r||d<   	  |d$i |¤Ž}dd"lm}  ||j0                  d   j2                  j4                  xs d#j7                  «       «      S # t        $ r Y Œww xY w# t        $ r�}ddlm}m}m}  ||«      rt        |«      |kD  s‚ t        j                  j+                  dt        |«      dz  |dz  «        || d¬«      }||d   d   d    d!   d   d<    |d$i |¤Ž}Y d}~ŒÕd}~ww xY w)%u@  One-shot aux vision-LLM analysis (not baked into history), secret-redacted.

    Full resolution first; on a size-related provider rejection the image is
    downscaled once and retried. ``auxiliary.vision.timeout/temperature`` â€” local
    vision models can take well over 30s, so the default timeout is generous.
    r   NzCYou are analyzing a screenshot of a web browser.

User's question: a"  

Provide a detailed and helpful answer based on what you see in the screenshot. If there are interactive elements, describe them. If there are verification challenges or CAPTCHAs, describe what type they are and what action might be needed. Focus on answering the user's specific question.Úasciizdata:image/png;base64,z/browser_vision: analysing screenshot (%d bytes)g      ^@gš™™™™™¹?)Úload_configÚ	auxiliaryÚvision)ÚdefaultÚtimeoutÚtemperature)Úcall_llmÚuserÚtext)Útyperk   rQ   Úurl)rl   rQ   )ÚroleÚcontent)Útaskrh   rg   ÚmessagesÚmodel)Ú_is_image_size_errorrJ   Ú_RESIZE_TARGET_BYTESzSVision API rejected screenshot (%.1f MB); auto-resizing to ~%.0f MB and retrying...i   rL   )rM   rq   ro   é   )Úredact_sensitive_textr    © )Úbase64Ú
read_bytesÚ	b64encodeÚdecoder)   Ú_get_vision_modelr*   r+   ÚlenÚhermes_cli.configrc   r   r1   ÚfloatÚ	ExceptionÚagent.auxiliary_clientri   rW   rs   rJ   rt   ÚinfoÚagent.redactrv   ÚchoicesÚmessagero   r]   )r   rD   rx   Úvision_promptÚ_screenshot_bytesÚ_screenshot_b64r^   Úvision_modelÚvision_timeoutÚvision_temperaturerc   Ú_vision_cfgri   Úcall_kwargsÚresponseÚ_api_errrs   rJ   rt   rv   s                       r   Ú _analyze_screenshot_with_aux_llmr�   U   s  € ó ðØ$˜:ð &;ð	<ð ð (×2Ñ2Ó4ÐØ×&Ñ&Ð'8Ó9×@Ñ@ÀÓI€OØ'¨Ð'8Ð9€HÜ×(Ñ(Ó*€LÜ‡J�J×ÑÐFÌÐL]ÓH^Ô_à€NØÐðÝ1Ü™k›m¨[¸(ÈBÔOˆØ�?‰?˜9Ó%Ð1Ü" ;¨yÑ#9Ó:ˆNØ�?‰?˜=Ó)Ð5Ü!& {°=Ñ'AÓ!BÐõ 0ð Ð);ÈØ$Ø ]Ñ3Ø °°xÐ/@ÑAð2
ñ ð ñ€Kñ Ø+ˆ�GÑð
+ÙÑ*˜kÑ*ˆõ 3Ù  (×"2Ñ"2°1Ñ"5×"=Ñ"=×"EÑ"EÒ"KÈ×!RÑ!RÓ!TÓUÐUøô7 ò Ùðûô  ò +ßkÑkÙ$ XÔ.´3°x³=ÐCWÒ3WØÜ�
‰
�‰ÐmÜ˜H›¨Ñ5Ð7KÈ{Ñ7[ô	]á+¨OÀ{ÔSˆØGOˆ�JÑ Ñ" 9Ñ-¨aÑ0°Ñ=¸eÑDÙÑ*˜kÑ*�ûð+ús,   ÂAE Ã=E Å	EÅEÅ	GÅA7GÇG)Ú__doc__r3   r:   Úpathlibr   Útypingr   r   r   r   r~   r   Útools.browser_tool_originr	   r)   Útoolsr
   r   r   r,   rY   r   ÚboolrC   r`   r�   rw   r   r   ú<module>r—      sÙ   ðñó
 
Û Ý ß -Ó -å %Ý 3Ý .Ý 9ðE˜Có Eð
DØðDØ&*ðDØ=AðDà
ˆ4�˜#‘ Ð$Ñ%óDð<ØðØ%(ðØ48ðà��c�‰Nðà19¸#±ðð 
ˆ#ˆsˆ(�^óðB;V°dð ;VÀcð ;VÈcô ;Vr   