§
    ­eîi‹k ã                   ó>	  — U d Z ddlZddlZddlZddlmZmZmZmZm	Z	m
Z
mZmZmZ ddlZddlmZ ddlZddlZddlZddlZddlZddlZ ej        d¦  «        Zej        ed<   d„ Z e¦   «         Z ed¦  «        Z G d	„ d
ej        ¦  «        Z G d„ dej        ¦  «        Z G d„ dej        ¦  «        Z  G d„ dej        ¦  «        Z! G d„ dej        ee         ¦  «        Z" G d„ dej        ¦  «        Z# G d„ dej        ¦  «        Z$ G d„ dej        ¦  «        Z% G d„ dej        ¦  «        Z& G d„ dej        ¦  «        Z' G d„ dej        ¦  «        Z( G d„ d ej        ¦  «        Z) G d!„ d"ej        ¦  «        Z* G d#„ d$ej        ¦  «        Z+ G d%„ d&ej        ¦  «        Z, G d'„ d(ej        ¦  «        Z- G d)„ d*ej        ¦  «        Z. G d+„ d,ej        ¦  «        Z/ G d-„ d.ej        ¦  «        Z0 G d/„ d0ej        ¦  «        Z1 G d1„ d2e&¦  «        Z2 G d3„ d4e"e         ee         ¦  «        Z3 G d5„ d6ej        ¦  «        Z4 G d7„ d8ej        ¦  «        Z5 G d9„ d:ej        ¦  «        Z6 G d;„ d<ej        ¦  «        Z7 G d=„ d>ej        ¦  «        Z8 G d?„ d@ej        ¦  «        Z9 G dA„ dBej        ¦  «        Z: G dC„ dDej        ¦  «        Z; G dE„ dFej        ¦  «        Z< G dG„ dHej        ¦  «        Z= G dI„ dJej        ee         ¦  «        Z> G dK„ dLej        ¦  «        Z? G dM„ dNej        ¦  «        Z@ G dO„ dPej        ¦  «        ZA G dQ„ dRej        ¦  «        ZB G dS„ dTej        ¦  «        ZC G dU„ dVej        ¦  «        ZD G dW„ dXej        ¦  «        ZE G dY„ dZej        ¦  «        ZF G d[„ d\ej        ¦  «        ZG G d]„ d^ej        ¦  «        ZH G d_„ d`ej        ¦  «        ZI G da„ dbej        ¦  «        ZJ G dc„ ddej        ¦  «        ZK G de„ dfej        ¦  «        ZL G dg„ dhej        ¦  «        ZM G di„ djej        ¦  «        ZN G dk„ dlej        ¦  «        ZO G dm„ dNej        ¦  «        Z@ G dn„ dHej        ¦  «        Z= G do„ dp¦  «        ZP G dq„ dr¦  «        ZQ G ds„ dteP¦  «        ZR G du„ dveQ¦  «        ZSdS )wa"  
Firecrawl v1 API Client - Legacy Implementation

This module provides the legacy v1 implementation of the Firecrawl SDK.
It contains the complete `V1FirecrawlApp` class with all v1 API methods and types
for backward compatibility. This is used by the unified client to provide
version-specific access patterns like app.v1.scrape_url().

Classes:
    - V1FirecrawlApp: Legacy v1 client for interacting with the Firecrawl API.
    - AsyncV1FirecrawlApp: Async version of the v1 client.
    - CrawlWatcher: WebSocket-based crawl monitoring for v1.
é    N)	ÚAnyÚDictÚOptionalÚListÚUnionÚCallableÚLiteralÚTypeVarÚGeneric)ÚdatetimeÚ	firecrawlÚloggerc                  ó¤  — 	 ddl m}  t          j                             t
          ¦  «        } | t          j                             |d¦  «        ¦  «                             ¦   «         }t          j	        d|t          j
        ¦  «        }|r'|                     d¦  «                             ¦   «         S d S # t          $ r t          d¦  «         Y d S w xY w)Nr   )ÚPathz__init__.pyz"^__version__ = ['\"]([^'\"]*)['\"]é   z&Failed to get version from __init__.py)Úpathlibr   ÚosÚpathÚdirnameÚ__file__ÚjoinÚ	read_textÚreÚsearchÚMÚgroupÚstripÚ	ExceptionÚprint)r   Úpackage_pathÚversion_fileÚversion_matchs       úW/home/div/.hermes/hermes-agent/venv/lib/python3.11/site-packages/firecrawl/v1/client.pyÚget_versionr$      sÒ   € ð	ØÐÐÐÐÐÝ”W—_’_¥XÑ.Ô.€lØ�T�"œ'Ÿ,š, |°]ÑCÔCÑDÔD×NÒNÑPÔP€lÝ”iÐ EÀ|ÕUWÔUYÑZÔZ€mØ	ð 0Ø×$Ò$ QÑ'Ô'×-Ò-Ñ/Ô/Ð
/ð0ð 0øå	ð ð ð ÝÐ4Ñ5Ô5Ð5ØˆTˆTðøøøs   ‚B-B2 Â2CÃCÚTc                   óH   — e Zd ZU dZdZed         ed<   dZee	         ed<   dS )ÚV1AgentOptionszConfiguration for the agent.úFIRE-1ÚmodelNÚprompt)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r)   r	   Ú__annotations__r*   r   Ústr© ó    r#   r'   r'   P   sA   € € € € € € Ø&Ð&Ø'€Eˆ7�8ÔÐ'Ð'Ñ'Ø €FˆH�SŒMÐ Ð Ñ Ð Ð r2   r'   c                   ó.   — e Zd ZU dZdZed         ed<   dS )ÚV1AgentOptionsExtractú2Configuration for the agent in extract operations.r(   r)   N©r+   r,   r-   r.   r)   r	   r/   r1   r2   r#   r4   r4   U   ó-   € € € € € € Ø<Ð<Ø'€Eˆ7�8ÔÐ'Ð'Ñ'Ð'Ð'r2   r4   c                   ó@   — e Zd ZU dZee         ed<   ee         ed<   dS )ÚV1ActionsResultz,Result of actions performed during scraping.ÚscreenshotsÚpdfsN)r+   r,   r-   r.   r   r0   r/   r1   r2   r#   r9   r9   Y   s3   € € € € € € Ø6Ð6Ø�c”ÐÐÑØ
ˆsŒ)€O€O�O€O€Or2   r9   c                   ó¦   — e Zd ZU dZdZee         ed<   eed<   eed<   dZee	ee
f                  ed<    ej        dd¬¦  «        Zee
         ed	<   dS )
ÚV1ChangeTrackingDataz.
    Data for the change tracking format.
    NÚpreviousScrapeAtÚchangeStatusÚ
visibilityÚdiffÚjson©ÚaliasÚ
json_field)r+   r,   r-   r.   r>   r   r0   r/   rA   r   r   ÚpydanticÚFieldrE   r1   r2   r#   r=   r=   ^   sŠ   € € € € € € ðð ð '+Ð�h˜s”mÐ*Ð*Ñ*ØÐÐÑØ€O€O�OØ%)€Dˆ(�4˜˜S˜”>Ô
"Ð)Ð)Ñ)Ø . ¤¨t¸6Ð BÑ BÔ B€J�˜”ÐBÐBÑBÐBÐBr2   r=   c                   ó’  — e Zd ZU dZdZee         ed<   dZee         ed<   dZ	ee         ed<   dZ
ee         ed<   dZeee                  ed<   dZee         ed<    ej        dd	¬
¦  «        Zee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dS )ÚV1FirecrawlDocumentz-Document retrieved or processed by Firecrawl.NÚurlÚmarkdownÚhtmlÚrawHtmlÚlinksÚextractrB   rC   rE   Ú
screenshotÚmetadataÚactionsÚtitleÚdescriptionÚchangeTracking)r+   r,   r-   r.   rJ   r   r0   r/   rK   rL   rM   rN   r   rO   r%   rF   rG   rE   rP   rQ   r   rR   r9   rS   rT   rU   r=   r1   r2   r#   rI   rI   h   s5  € € € € € € Ø7Ð7Ø€Cˆ�#ŒÐÐÑØ"€Hˆh�sŒmÐ"Ð"Ñ"Ø€Dˆ(�3Œ-ÐÐÑØ!€GˆX�cŒ]Ð!Ð!Ñ!Ø!%€Eˆ8�D˜”IÔÐ%Ð%Ñ%Ø€GˆX�aŒ[ÐÐÑØ,˜hœn¨T¸Ð@Ñ@Ô@€J�˜”Ð@Ð@Ñ@Ø $€J�˜”Ð$Ð$Ñ$Ø"€Hˆh�sŒmÐ"Ð"Ñ"Ø)-€GˆX�oÔ&Ð-Ð-Ñ-Ø€Eˆ8�CŒ=ÐÐÑØ!%€K�˜#”Ð%Ð%Ñ%Ø59€N�HÐ1Ô2Ð9Ð9Ñ9Ð9Ð9r2   rI   c                   óT   — e Zd ZU dZdZee         ed<   dZee	e                  ed<   dS )ÚV1LocationConfigz$Location configuration for scraping.NÚcountryÚ	languages)
r+   r,   r-   r.   rX   r   r0   r/   rY   r   r1   r2   r#   rW   rW   x   sE   € € € € € € Ø.Ð.Ø!€GˆX�cŒ]Ð!Ð!Ñ!Ø%)€Iˆx˜˜Sœ	Ô"Ð)Ð)Ñ)Ð)Ð)r2   rW   c                   ó¤   — e Zd ZU dZeed<   dZeeeef                  ed<   dZ	eeeef                  ed<   dZ
eeed                           ed<   dS )ÚV1WebhookConfigzConfiguration for webhooks.rJ   NÚheadersrQ   )Ú	completedÚfailedÚpageÚstartedÚevents)r+   r,   r-   r.   r0   r/   r\   r   r   rQ   ra   r   r	   r1   r2   r#   r[   r[   }   s{   € € € € € € Ø%Ð%Ø	€H€H�HØ(,€GˆX�d˜3 ˜8”nÔ%Ð,Ð,Ñ,Ø)-€Hˆh�t˜C ˜H”~Ô&Ð-Ð-Ñ-ØPT€FˆH�T˜'Ð"JÔKÔLÔMÐTÐTÑTÐTÐTr2   r[   c                   ó´   — e Zd ZU dZdZeeed                           ed<    e	j
        dd¬¦  «        Zee         ed<   dZee         ed<   dZee         ed	<   dS )
ÚV1ChangeTrackingOptionsz"Configuration for change tracking.N)zgit-diffrB   ÚmodesÚschemarC   Úschema_fieldr*   Útag)r+   r,   r-   r.   rd   r   r   r	   r/   rF   rG   rf   r   r*   r0   rg   r1   r2   r#   rc   rc   „   s…   € € € € € € Ø,Ð,Ø9=€Eˆ8�D˜Ð!3Ô4Ô5Ô6Ð=Ð=Ñ=Ø"0 (¤.°¸XÐ"FÑ"FÔ"F€L�(˜3”-ÐFÐFÑFØ €FˆH�SŒMÐ Ð Ñ Ø€Cˆ�#ŒÐÐÑÐÐr2   rc   c                   ó  — e Zd ZU dZdZeeed                           ed<   dZ	ee
eef                  ed<   dZeee                  ed<   dZeee                  ed<   dZee         ed<   dZee         ed	<   d
Zee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZeed                  ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dS )ÚV1ScrapeOptionsú#Parameters for scraping operations.N©
rK   rL   rM   ÚcontentrN   rP   úscreenshot@fullPagerO   rB   rU   Úformatsr\   ÚincludeTagsÚexcludeTagsÚonlyMainContentÚwaitForé0u  ÚtimeoutÚlocationÚmobileÚskipTlsVerificationÚremoveBase64ImagesÚblockAds©ÚbasicÚstealthÚenhancedÚautoÚproxyÚchangeTrackingOptionsÚmaxAgeÚstoreInCacheÚparsePDF)r+   r,   r-   r.   rn   r   r   r	   r/   r\   r   r0   ro   rp   rq   Úboolrr   Úintrt   ru   rW   rv   rw   rx   ry   r   r€   rc   r�   r‚   rƒ   r1   r2   r#   ri   ri   ‹   s²  € € € € € € Ø-Ð-ð ei€GˆX�d˜7ð  $_ô  `ô  aô  bð  ið  iñ  iØ(,€GˆX�d˜3 ˜8”nÔ%Ð,Ð,Ñ,Ø'+€K�˜$˜sœ)Ô$Ð+Ð+Ñ+Ø'+€K�˜$˜sœ)Ô$Ð+Ð+Ñ+Ø&*€O�X˜d”^Ð*Ð*Ñ*Ø!€GˆX�cŒ]Ð!Ð!Ñ!Ø"€GˆX�cŒ]Ð"Ð"Ñ"Ø+/€HˆhÐ'Ô(Ð/Ð/Ñ/Ø!€FˆH�TŒNÐ!Ð!Ñ!Ø*.Ð˜ $œÐ.Ð.Ñ.Ø)-Ð˜ œÐ-Ð-Ñ-Ø#€Hˆh�tŒnÐ#Ð#Ñ#ØGK€Eˆ8�GÐBÔCÔDÐKÐKÑKØ?CÐ˜8Ð$;Ô<ÐCÐCÑCØ €FˆH�SŒMÐ Ð Ñ Ø#'€L�(˜4”.Ð'Ð'Ñ'Ø#€Hˆh�tŒnÐ#Ð#Ñ#Ð#Ð#r2   ri   c                   ó^   — e Zd ZU dZed         ed<   dZee         ed<   dZ	ee
         ed<   dS )ÚV1WaitActionz'Wait action to perform during scraping.ÚwaitÚtypeNÚmillisecondsÚselector)r+   r,   r-   r.   r	   r/   rŠ   r   r…   r‹   r0   r1   r2   r#   r‡   r‡   Ÿ   sP   € € € € € € Ø1Ð1Ø
�&Œ/ÐÐÑØ"&€L�(˜3”-Ð&Ð&Ñ&Ø"€Hˆh�sŒmÐ"Ð"Ñ"Ð"Ð"r2   r‡   c                   ó^   — e Zd ZU dZed         ed<   dZee         ed<   dZ	ee
         ed<   dS )ÚV1ScreenshotActionz-Screenshot action to perform during scraping.rP   r‰   NÚfullPageÚquality)r+   r,   r-   r.   r	   r/   rŽ   r   r„   r�   r…   r1   r2   r#   r�   r�   ¥   sQ   € € € € € € Ø7Ð7Ø
�,Ô
ÐÐÑØ#€Hˆh�tŒnÐ#Ð#Ñ#Ø!€GˆX�cŒ]Ð!Ð!Ñ!Ð!Ð!r2   r�   c                   ó4   — e Zd ZU dZed         ed<   eed<   dS )ÚV1ClickActionz(Click action to perform during scraping.Úclickr‰   r‹   N©r+   r,   r-   r.   r	   r/   r0   r1   r2   r#   r‘   r‘   «   s0   € € € € € € Ø2Ð2Ø
�'Ô
ÐÐÑØ€M€M�M€M€Mr2   r‘   c                   ó4   — e Zd ZU dZed         ed<   eed<   dS )ÚV1WriteActionz(Write action to perform during scraping.Úwriter‰   ÚtextNr“   r1   r2   r#   r•   r•   °   s0   € € € € € € Ø2Ð2Ø
�'Ô
ÐÐÑØ
€I€I�I€I€Ir2   r•   c                   ó4   — e Zd ZU dZed         ed<   eed<   dS )ÚV1PressActionz(Press action to perform during scraping.Úpressr‰   ÚkeyNr“   r1   r2   r#   r™   r™   µ   s0   € € € € € € Ø2Ð2Ø
�'Ô
ÐÐÑØ	€H€H�H€H€Hr2   r™   c                   óZ   — e Zd ZU dZed         ed<   ed         ed<   dZee         ed<   dS )ÚV1ScrollActionz)Scroll action to perform during scraping.Úscrollr‰   )ÚupÚdownÚ	directionNr‹   )	r+   r,   r-   r.   r	   r/   r‹   r   r0   r1   r2   r#   r�   r�   º   sN   € € € € € € Ø3Ð3Ø
�(Ô
ÐÐÑØ�|Ô$Ð$Ð$Ñ$Ø"€Hˆh�sŒmÐ"Ð"Ñ"Ð"Ð"r2   r�   c                   ó*   — e Zd ZU dZed         ed<   dS )ÚV1ScrapeActionz)Scrape action to perform during scraping.Úscraper‰   N)r+   r,   r-   r.   r	   r/   r1   r2   r#   r£   r£   À   s)   € € € € € € Ø3Ð3Ø
�(Ô
ÐÐÑÐÐr2   r£   c                   ó4   — e Zd ZU dZed         ed<   eed<   dS )ÚV1ExecuteJavascriptActionz5Execute javascript action to perform during scraping.ÚexecuteJavascriptr‰   ÚscriptNr“   r1   r2   r#   r¦   r¦   Ä   s1   € € € € € € Ø?Ð?Ø
Ð%Ô
&Ð&Ð&Ñ&Ø€K€K�K€K€Kr2   r¦   c                   ó„   — e Zd ZU dZed         ed<   dZeed                  ed<   dZee	         ed<   dZ
ee         ed<   dS )	ÚV1PDFActionz&PDF action to perform during scraping.Úpdfr‰   N)ÚA0ÚA1ÚA2ÚA3ÚA4ÚA5ÚA6ÚLetterÚLegalÚTabloidÚLedgerÚformatÚ	landscapeÚscale)r+   r,   r-   r.   r	   r/   r·   r   r¸   r„   r¹   Úfloatr1   r2   r#   rª   rª   É   sk   € € € € € € Ø0Ð0Ø
�%Œ.ÐÐÑØrv€FˆH�WÐmÔnÔoÐvÐvÑvØ $€Iˆx˜Œ~Ð$Ð$Ñ$Ø!€Eˆ8�EŒ?Ð!Ð!Ñ!Ð!Ð!r2   rª   c                   ó.   — e Zd ZU dZdZed         ed<   dS )ÚV1ExtractAgentr5   r(   r)   Nr6   r1   r2   r#   r¼   r¼   Ð   r7   r2   r¼   c                   óœ   — e Zd ZU dZdZee         ed<    ej	        dd¬¦  «        Z
ee         ed<   dZee         ed<   dZee         ed<   dS )	ÚV1JsonConfigzConfiguration for extraction.Nr*   re   rC   rf   ÚsystemPromptÚagent)r+   r,   r-   r.   r*   r   r0   r/   rF   rG   rf   r   r¿   rÀ   r¼   r1   r2   r#   r¾   r¾   Ô   sz   € € € € € € Ø'Ð'Ø €FˆH�SŒMÐ Ð Ñ Ø"0 (¤.°¸XÐ"FÑ"FÔ"F€L�(˜3”-ÐFÐFÑFØ"&€L�(˜3”-Ð&Ð&Ñ&Ø&*€Eˆ8�NÔ#Ð*Ð*Ñ*Ð*Ð*r2   r¾   c                   óÀ   — e Zd ZU dZdZee         ed<   dZee         ed<   dZ	ee
eeeeeeeeeef	                           ed<   dZee         ed<   dZee         ed<   dS )ÚV1ScrapeParamsrj   NrO   ÚjsonOptionsrR   rÀ   Úwebhook)r+   r,   r-   r.   rO   r   r¾   r/   rÃ   rR   r   r   r‡   r�   r‘   r•   r™   r�   r£   r¦   rª   rÀ   r'   rÄ   r[   r1   r2   r#   rÂ   rÂ   Û   sÊ   € € € € € € Ø-Ð-Ø&*€GˆX�lÔ#Ð*Ð*Ñ*Ø*.€K�˜,Ô'Ð.Ð.Ñ.ð }A€GˆX�d˜5 Ð/AÀ=ÐR_ÐanÐp~ð  AOð  Qjð  lwð  "wô  xô  yô  zð  Að  Añ  AØ&*€Eˆ8�NÔ#Ð*Ð*Ñ*Ø)-€GˆX�oÔ&Ð-Ð-Ñ-Ð-Ð-r2   rÂ   c                   óV   — e Zd ZU dZdZeed<   dZee	         ed<   dZ
ee	         ed<   dS )ÚV1ScrapeResponsez"Response from scraping operations.TÚsuccessNÚwarningÚerror)r+   r,   r-   r.   rÇ   r„   r/   rÈ   r   r0   rÉ   r1   r2   r#   rÆ   rÆ   ã   sP   € € € € € € Ø,Ð,Ø€GˆTÐÐÑØ!€GˆX�cŒ]Ð!Ð!Ñ!Ø€Eˆ8�CŒ=ÐÐÑÐÐr2   rÆ   c                   ó–   — e Zd ZU dZdZee         ed<   dZee         ed<   dZ	e
ed<   dZee         ed<   dZeee                  ed<   dS )	ÚV1BatchScrapeResponsez&Response from batch scrape operations.NÚidrJ   TrÇ   rÉ   ÚinvalidURLs)r+   r,   r-   r.   rÌ   r   r0   r/   rJ   rÇ   r„   rÉ   rÍ   r   r1   r2   r#   rË   rË   é   s}   € € € € € € Ø0Ð0Ø€Bˆ�ŒÐÐÑØ€Cˆ�#ŒÐÐÑØ€GˆTÐÐÑØ€Eˆ8�CŒ=ÐÐÑØ'+€K�˜$˜sœ)Ô$Ð+Ð+Ñ+Ð+Ð+r2   rË   c                   ó�   — e Zd ZU dZdZeed<   ed         ed<   eed<   eed<   eed<   e	ed	<   d
Z
ee         ed<   ee         ed<   d
S )ÚV1BatchScrapeStatusResponsez)Response from batch scrape status checks.TrÇ   ©Úscrapingr]   r^   Ú	cancelledÚstatusr]   ÚtotalÚcreditsUsedÚ	expiresAtNÚnextÚdata©r+   r,   r-   r.   rÇ   r„   r/   r	   r…   r   r×   r   r0   r   rI   r1   r2   r#   rÏ   rÏ   ñ   sŠ   € € € € € € Ø3Ð3Ø€GˆTÐÐÑØÐBÔCÐCÐCÑCØ€N€N�NØ€J€J�JØÐÐÑØÐÐÑØ€Dˆ(�3Œ-ÐÐÑØ
Ð"Ô
#Ð#Ð#Ñ#Ð#Ð#r2   rÏ   c                   óö  — e Zd ZU dZdZeee                  ed<   dZ	eee                  ed<   dZ
ee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed	<   dZee         ed
<   dZee         ed<   dZee         ed<   dZeeeef                  ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dS )ÚV1CrawlParamsz#Parameters for crawling operations.NÚincludePathsÚexcludePathsÚmaxDepthÚmaxDiscoveryDepthÚlimitÚallowBackwardLinksÚcrawlEntireDomainÚallowExternalLinksÚignoreSitemapÚscrapeOptionsrÄ   ÚdeduplicateSimilarURLsÚignoreQueryParametersÚregexOnFullURLÚdelayÚmaxConcurrencyÚallowSubdomains)r+   r,   r-   r.   rÜ   r   r   r0   r/   rÝ   rÞ   r…   rß   rà   rá   r„   râ   rã   rä   rå   ri   rÄ   r   r[   ræ   rç   rè   ré   rê   rë   r1   r2   r#   rÛ   rÛ   ü   sˆ  € € € € € € Ø-Ð-Ø(,€L�(˜4 œ9Ô%Ð,Ð,Ñ,Ø(,€L�(˜4 œ9Ô%Ð,Ð,Ñ,Ø"€Hˆh�sŒmÐ"Ð"Ñ"Ø'+Ð�x ”}Ð+Ð+Ñ+Ø€Eˆ8�CŒ=ÐÐÑØ)-Ð˜ œÐ-Ð-Ñ-Ø(,Ð�x ”~Ð,Ð,Ñ,Ø)-Ð˜ œÐ-Ð-Ñ-Ø$(€M�8˜D”>Ð(Ð(Ñ(Ø/3€M�8˜OÔ,Ð3Ð3Ñ3Ø59€GˆX�e˜C Ð0Ô1Ô2Ð9Ð9Ñ9Ø-1Ð˜H TœNÐ1Ð1Ñ1Ø,0Ð˜8 Dœ>Ð0Ð0Ñ0Ø%)€N�H˜T”NÐ)Ð)Ñ)Ø€Eˆ8�CŒ=ÐÐÑØ$(€N�H˜S”MÐ(Ð(Ñ(Ø&*€O�X˜d”^Ð*Ð*Ñ*Ð*Ð*r2   rÛ   c                   óp   — e Zd ZU dZdZee         ed<   dZee         ed<   dZ	e
ed<   dZee         ed<   dS )ÚV1CrawlResponsez"Response from crawling operations.NrÌ   rJ   TrÇ   rÉ   )r+   r,   r-   r.   rÌ   r   r0   r/   rJ   rÇ   r„   rÉ   r1   r2   r#   rí   rí     sd   € € € € € € Ø,Ð,Ø€Bˆ�ŒÐÐÑØ€Cˆ�#ŒÐÐÑØ€GˆTÐÐÑØ€Eˆ8�CŒ=ÐÐÑÐÐr2   rí   c                   ó�   — e Zd ZU dZdZeed<   ed         ed<   eed<   eed<   eed<   e	ed	<   d
Z
ee         ed<   ee         ed<   d
S )ÚV1CrawlStatusResponsez"Response from crawl status checks.TrÇ   rÐ   rÓ   r]   rÔ   rÕ   rÖ   Nr×   rØ   rÙ   r1   r2   r#   rï   rï     sŠ   € € € € € € Ø,Ð,Ø€GˆTÐÐÑØÐBÔCÐCÐCÑCØ€N€N�NØ€J€J�JØÐÐÑØÐÐÑØ€Dˆ(�3Œ-ÐÐÑØ
Ð"Ô
#Ð#Ð#Ñ#Ð#Ð#r2   rï   c                   óf   — e Zd ZU dZeed<   dZee         ed<   eed<   dZ	ee         ed<   eed<   dS )ÚV1CrawlErrorzA crawl error.rÌ   NÚ	timestamprJ   ÚcoderÉ   )
r+   r,   r-   r.   r0   r/   rò   r   r   ró   r1   r2   r#   rñ   rñ   "  sZ   € € € € € € ØÐØ€G€G�GØ$(€Iˆx˜Ô!Ð(Ð(Ñ(Ø	€H€H�HØ€Dˆ(�3Œ-ÐÐÑØ€J€J�J€J€Jr2   rñ   c                   ó@   — e Zd ZU dZee         ed<   ee         ed<   dS )ÚV1CrawlErrorsResponsez2Response from crawl/batch scrape error monitoring.ÚerrorsÚrobotsBlockedN)r+   r,   r-   r.   r   rñ   r/   r0   r1   r2   r#   rõ   rõ   *  s9   € € € € € € Ø<Ð<Ø�ÔÐÐÑØ˜”9ÐÐÑÐÐr2   rõ   c                   óä   — e Zd ZU dZdZee         ed<   dZee	         ed<   dZ
ee	         ed<   dZee	         ed<   dZee         ed<   dZee         ed	<   dZee	         ed
<   dZee         ed<   dS )ÚV1MapParamsz"Parameters for mapping operations.Nr   rä   ÚincludeSubdomainsÚsitemapOnlyrà   rs   rt   ÚuseIndexru   )r+   r,   r-   r.   r   r   r0   r/   rä   r„   rú   rû   rà   r…   rt   rü   ru   rW   r1   r2   r#   rù   rù   /  s»   € € € € € € Ø,Ð,Ø €FˆH�SŒMÐ Ð Ñ Ø$(€M�8˜D”>Ð(Ð(Ñ(Ø(,Ð�x ”~Ð,Ð,Ñ,Ø"&€K�˜$”Ð&Ð&Ñ&Ø€Eˆ8�CŒ=ÐÐÑØ"€GˆX�cŒ]Ð"Ð"Ñ"Ø#€Hˆh�tŒnÐ#Ð#Ñ#Ø+/€HˆhÐ'Ô(Ð/Ð/Ñ/Ð/Ð/r2   rù   c                   ób   — e Zd ZU dZdZeed<   dZee	e
                  ed<   dZee
         ed<   dS )ÚV1MapResponsez!Response from mapping operations.TrÇ   NrN   rÉ   )r+   r,   r-   r.   rÇ   r„   r/   rN   r   r   r0   rÉ   r1   r2   r#   rþ   rþ   :  sU   € € € € € € Ø+Ð+Ø€GˆTÐÐÑØ!%€Eˆ8�D˜”IÔÐ%Ð%Ñ%Ø€Eˆ8�CŒ=ÐÐÑÐÐr2   rþ   c                   ó  — e Zd ZU dZdZee         ed<    ej	        dd¬¦  «        Z
ee         ed<   dZee         ed<   dZee         ed<   dZee         ed	<   dZee         ed
<   dZee         ed<   dZee         ed<   dZee         ed<   dS )ÚV1ExtractParamsz0Parameters for extracting information from URLs.Nr*   re   rC   rf   r¿   rã   ÚenableWebSearchrú   ÚoriginÚshowSourcesrå   )r+   r,   r-   r.   r*   r   r0   r/   rF   rG   rf   r   r¿   rã   r„   r  rú   r  r  rå   ri   r1   r2   r#   r   r   @  sà   € € € € € € Ø:Ð:Ø €FˆH�SŒMÐ Ð Ñ Ø"0 (¤.°¸XÐ"FÑ"FÔ"F€L�(˜3”-ÐFÐFÑFØ"&€L�(˜3”-Ð&Ð&Ñ&Ø)-Ð˜ œÐ-Ð-Ñ-Ø&*€O�X˜d”^Ð*Ð*Ñ*Ø(,Ð�x ”~Ð,Ð,Ñ,Ø €FˆH�SŒMÐ Ð Ñ Ø"&€K�˜$”Ð&Ð&Ñ&Ø/3€M�8˜OÔ,Ð3Ð3Ñ3Ð3Ð3r2   r   c                   ó  — e Zd ZU dZdZee         ed<   dZee	d                  ed<   dZ
ee         ed<   dZeed<   dZee         ed	<   dZee         ed
<   dZee         ed<   dZeeeef                  ed<   dZee         ed<   dS )ÚV1ExtractResponsez!Response from extract operations.NrÌ   ©Ú
processingr]   r^   rÓ   rÖ   TrÇ   rØ   rÉ   rÈ   ÚsourcesrÕ   )r+   r,   r-   r.   rÌ   r   r0   r/   rÓ   r	   rÖ   r   rÇ   r„   rØ   r%   rÉ   rÈ   r  r   r   rÕ   r…   r1   r2   r#   r  r  L  sÙ   € € € € € € Ø+Ð+Ø€Bˆ�ŒÐÐÑØEI€FˆH�WÐ@ÔAÔBÐIÐIÑIØ$(€Iˆx˜Ô!Ð(Ð(Ñ(Ø€GˆTÐÐÑØ€Dˆ(�1Œ+ÐÐÑØ€Eˆ8�CŒ=ÐÐÑØ!€GˆX�cŒ]Ð!Ð!Ñ!Ø(,€GˆX�d˜3 ˜8”nÔ%Ð,Ð,Ñ,Ø!%€K�˜#”Ð%Ð%Ñ%Ð%Ð%r2   r  c                   ó  — e Zd ZU eed<   dZee         ed<   dZee         ed<   dZ	ee         ed<   dZ
ee         ed<   d	Zee         ed
<   dZee         ed<   dZee         ed<   dZee         ed<   dZee         ed<   dS )ÚV1SearchParamsÚqueryé   rà   NÚtbsÚfilterÚenÚlangÚusrX   ru   Úapir  i`ê  rt   rå   )r+   r,   r-   r0   r/   rà   r   r…   r  r  r  rX   ru   r  rt   rå   ri   r1   r2   r#   r
  r
  X  sÐ   € € € € € € Ø€J€J�JØ€Eˆ8�CŒ=ÐÐÑØ€Cˆ�#ŒÐÐÑØ €FˆH�SŒMÐ Ð Ñ Ø€Dˆ(�3Œ-ÐÐÑØ!€GˆX�cŒ]Ð!Ð!Ñ!Ø"€Hˆh�sŒmÐ"Ð"Ñ"Ø!€FˆH�SŒMÐ!Ð!Ñ!Ø"€GˆX�cŒ]Ð"Ð"Ñ"Ø/3€M�8˜OÔ,Ð3Ð3Ñ3Ð3Ð3r2   r
  c                   ól   — e Zd ZU dZdZeed<   ee         ed<   dZ	e
e         ed<   dZe
e         ed<   dS )ÚV1SearchResponsez Response from search operations.TrÇ   rØ   NrÈ   rÉ   )r+   r,   r-   r.   rÇ   r„   r/   r   rI   rÈ   r   r0   rÉ   r1   r2   r#   r  r  d  sb   € € € € € € Ø*Ð*Ø€GˆTÐÐÑØ
Ð"Ô
#Ð#Ð#Ñ#Ø!€GˆX�cŒ]Ð!Ð!Ñ!Ø€Eˆ8�CŒ=ÐÐÑÐÐr2   r  c                   óh   — e Zd ZU eed<   dZee         ed<   dZee         ed<   dZ	ee         ed<   dS )ÚV1CreditUsageDataÚremaining_creditsNÚplan_creditsÚbilling_period_startÚbilling_period_end)
r+   r,   r-   r…   r/   r  r   r  r0   r  r1   r2   r#   r  r  k  s\   € € € € € € ØÐÐÑØ"&€L�(˜3”-Ð&Ð&Ñ&Ø*.Ð˜( 3œ-Ð.Ð.Ñ.Ø(,Ð˜ œÐ,Ð,Ñ,Ð,Ð,r2   r  c                   ó$   — e Zd ZU eed<   eed<   dS )ÚV1CreditUsageResponserÇ   rØ   N)r+   r,   r-   r„   r/   r  r1   r2   r#   r  r  q  s'   € € € € € € Ø€M€M�MØ
ÐÐÑÐÐr2   r  c                   óh   — e Zd ZU eed<   dZee         ed<   dZee         ed<   dZ	ee         ed<   dS )ÚV1TokenUsageDataÚremaining_tokensNÚplan_tokensr  r  )
r+   r,   r-   r…   r/   r   r   r  r0   r  r1   r2   r#   r  r  u  s\   € € € € € € ØÐÐÑØ!%€K�˜#”Ð%Ð%Ñ%Ø*.Ð˜( 3œ-Ð.Ð.Ñ.Ø(,Ð˜ œÐ,Ð,Ñ,Ð,Ð,r2   r  c                   ó$   — e Zd ZU eed<   eed<   dS )ÚV1TokenUsageResponserÇ   rØ   N)r+   r,   r-   r„   r/   r  r1   r2   r#   r"  r"  {  s'   € € € € € € Ø€M€M�MØ
ÐÐÑÐÐr2   r"  c                   óh   — e Zd ZU dZee         ed<   dZee         ed<   dZee         ed<   e	ed<   dS )ÚV1CreditUsageHistoricalPeriodNÚ	startDateÚendDateÚapiKeyrÕ   ©
r+   r,   r-   r%  r   r0   r/   r&  r'  r…   r1   r2   r#   r$  r$    sZ   € € € € € € Ø#€Iˆx˜Œ}Ð#Ð#Ñ#Ø!€GˆX�cŒ]Ð!Ð!Ñ!Ø €FˆH�SŒMÐ Ð Ñ ØÐÐÑÐÐr2   r$  c                   ó0   — e Zd ZU eed<   ee         ed<   dS )ÚV1CreditUsageHistoricalResponserÇ   ÚperiodsN)r+   r,   r-   r„   r/   r   r$  r1   r2   r#   r*  r*  …  s-   € € € € € € Ø€M€M�MØÐ/Ô0Ð0Ð0Ñ0Ð0Ð0r2   r*  c                   óh   — e Zd ZU dZee         ed<   dZee         ed<   dZee         ed<   e	ed<   dS )ÚV1TokenUsageHistoricalPeriodNr%  r&  r'  Ú
tokensUsedr(  r1   r2   r#   r-  r-  ‰  sU   € € € € € € Ø#€Iˆx˜Œ}Ð#Ð#Ñ#Ø!€GˆX�cŒ]Ð!Ð!Ñ!Ø €FˆH�SŒMÐ Ð Ñ Ø€O€O�O€O€Or2   r-  c                   ó0   — e Zd ZU eed<   ee         ed<   dS )ÚV1TokenUsageHistoricalResponserÇ   r+  N)r+   r,   r-   r„   r/   r   r-  r1   r2   r#   r0  r0  �  s-   € € € € € € Ø€M€M�MØÐ.Ô/Ð/Ð/Ñ/Ð/Ð/r2   r0  c                   ó|   — e Zd ZU dZdZee         ed<   dZee	         ed<   dZ
ee	         ed<   dZee	         ed	<   dS )
ÚV1GenerateLLMsTextParamsz;
    Parameters for the LLMs.txt generation operation.
    é
   ÚmaxUrlsFÚshowFullTextTÚcacheNÚ._V1GenerateLLMsTextParams__experimental_stream)r+   r,   r-   r.   r4  r   r…   r/   r5  r„   r6  r7  r1   r2   r#   r2  r2  “  so   € € € € € € ðð ð  €GˆX�cŒ]ÐÐÑØ#(€L�(˜4”.Ð(Ð(Ñ(Ø €Eˆ8�DŒ>Ð Ð Ñ Ø,0Ð˜8 Dœ>Ð0Ð0Ñ0Ð0Ð0r2   r2  c                   ó°   — e Zd ZU dZdZee         ed<   dZee         ed<   dZ	ee         ed<   dZ
ee         ed	<   dZee         ed
<   dZee         ed<   dS )ÚV1DeepResearchParamsz5
    Parameters for the deep research operation.
    é   rÞ   i  Ú	timeLimité   r4  NÚanalysisPromptr¿   Ú/_V1DeepResearchParams__experimental_streamSteps)r+   r,   r-   r.   rÞ   r   r…   r/   r;  r4  r=  r0   r¿   r>  r„   r1   r2   r#   r9  r9  œ  s—   € € € € € € ðð ð  €Hˆh�sŒmÐÐÑØ"€Iˆx˜Œ}Ð"Ð"Ñ"Ø€GˆX�cŒ]ÐÐÑØ$(€N�H˜S”MÐ(Ð(Ñ(Ø"&€L�(˜3”-Ð&Ð&Ñ&Ø15Ð ¨¤Ð5Ð5Ñ5Ð5Ð5r2   r9  c                   óB   — e Zd ZU dZeed<   eed<   dZee         ed<   dS )ÚV1DeepResearchResponsez4
    Response from the deep research operation.
    rÇ   rÌ   NrÉ   )	r+   r,   r-   r.   r„   r/   r0   rÉ   r   r1   r2   r#   r@  r@  §  sD   € € € € € € ðð ð €M€M�MØ€G€G�GØ€Eˆ8�CŒ=ÐÐÑÐÐr2   r@  c                   óì   — e Zd ZU dZeed<   dZeee	e
f                  ed<   e	ed<   dZee	         ed<   e	ed<   eed<   eed	<   eee	e
f                  ed
<   eee	e
f                  ed<   ee	         ed<   dS )ÚV1DeepResearchStatusResponsez;
    Status response from the deep research operation.
    rÇ   NrØ   rÓ   rÉ   rÖ   ÚcurrentDepthrÞ   Ú
activitiesr  Ú	summaries)r+   r,   r-   r.   r„   r/   rØ   r   r   r0   r   rÉ   r…   r   r1   r2   r#   rB  rB  ¯  sÁ   € € € € € € ðð ð €M€M�MØ%)€Dˆ(�4˜˜S˜”>Ô
"Ð)Ð)Ñ)Ø€K€K�KØ€Eˆ8�CŒ=ÐÐÑØ€N€N�NØÐÐÑØ€M€M�MØ�T˜#˜s˜(”^Ô$Ð$Ð$Ñ$Ø�$�s˜C�x”.Ô!Ð!Ð!Ñ!Ø�CŒyÐÐÑÐÐr2   rB  c                   óF   — e Zd ZU dZdZeed<   eed<   dZe	e         ed<   dS )ÚV1GenerateLLMsTextResponsez-Response from LLMs.txt generation operations.TrÇ   rÌ   NrÉ   )
r+   r,   r-   r.   rÇ   r„   r/   r0   rÉ   r   r1   r2   r#   rG  rG  ¾  sE   € € € € € € Ø7Ð7Ø€GˆTÐÐÑØ€G€G�GØ€Eˆ8�CŒ=ÐÐÑÐÐr2   rG  c                   ó4   — e Zd ZU eed<   dZee         ed<   dS )Ú$V1GenerateLLMsTextStatusResponseDataÚllmstxtNÚllmsfulltxt)r+   r,   r-   r0   r/   rK  r   r1   r2   r#   rI  rI  Ä  s/   € € € € € € Ø€L€L�LØ!%€K�˜#”Ð%Ð%Ñ%Ð%Ð%r2   rI  c                   óv   — e Zd ZU dZdZeed<   dZee	         ed<   e
d         ed<   dZee         ed<   eed	<   dS )
Ú V1GenerateLLMsTextStatusResponsez4Status response from LLMs.txt generation operations.TrÇ   NrØ   r  rÓ   rÉ   rÖ   )r+   r,   r-   r.   rÇ   r„   r/   rØ   r   rI  r	   rÉ   r0   r1   r2   r#   rM  rM  È  sk   € € € € € € Ø>Ð>Ø€GˆTÐÐÑØ;?€Dˆ(Ð7Ô
8Ð?Ð?Ñ?ØÐ7Ô8Ð8Ð8Ñ8Ø€Eˆ8�CŒ=ÐÐÑØ€N€N�N€N€Nr2   rM  c                   óx   — e Zd ZU dZeed<   eeee	f                  ed<   dZ
ee         ed<   dZee         ed<   dS )r  z-
    Response from the search operation.
    rÇ   rØ   NrÈ   rÉ   )r+   r,   r-   r.   r„   r/   r   r   r0   r   rÈ   r   rÉ   r1   r2   r#   r  r  Ð  sh   € € € € € € ðð ð €M€M�MØ
ˆt�C˜�HŒ~Ô
ÐÐÑØ!€GˆX�cŒ]Ð!Ð!Ñ!Ø€Eˆ8�CŒ=ÐÐÑÐÐr2   c                   ó  — e Zd ZU dZdZee         ed<    ej	        dd¬¦  «        Z
ee         ed<   dZee         ed<   dZee         ed	<   dZee         ed
<   dZee         ed<   dZee         ed<   dZeeeef                  ed<   dS )r   z/
    Parameters for the extract operation.
    Nr*   re   rC   rf   Úsystem_promptFÚallow_external_linksÚenable_web_searchr  Úshow_sourcesrÀ   )r+   r,   r-   r.   r*   r   r0   r/   rF   rG   rf   r   rP  rQ  r„   rR  r  rS  rÀ   r   r1   r2   r#   r   r   Ù  sÚ   € € € € € € ðð ð !€FˆH�SŒMÐ Ð Ñ Ø"0 (¤.°¸XÐ"FÑ"FÔ"F€L�(˜3”-ÐFÐFÑFØ#'€M�8˜C”=Ð'Ð'Ñ'Ø+0Ð˜( 4œ.Ð0Ð0Ñ0Ø(-Ð�x ”~Ð-Ð-Ñ-à&+€O�X˜d”^Ð+Ð+Ñ+Ø#(€L�(˜4”.Ð(Ð(Ñ(Ø&*€Eˆ8�D˜˜c˜”NÔ#Ð*Ð*Ñ*Ð*Ð*r2   c            0       óÈ  — e Zd ZdZdZd™dee         dee         ddfd„Zdddddddddddddddddddddd	œd
edeee	d                           dee
eef                  deee                  deee                  dee         dee         dee         dee         dee         dee         dee         dee         dee	d                  dee         dee         dee         deeeeeeeeeeeef	                           dee         dee         d ee         d!ee         dee         f.d"„Zddddddddd#œd$ed%ee         d&ee         d'ee         d(ee         d)ee         dee         dee         d*ee         defd+„Zde fd,„Z!de"fd-„Z#dšd/ede$fd0„Z%dšd/ede&fd1„Z'ddddddddddddddddddd2dd3œd
ed4eee                  d5eee                  d6ee         d7ee         d%ee         d8ee         d9ee         d:ee         d;ee         d*ee         d<eeee(f                  d=ee         d>ee         d?ee         d@ee         dAee         dBee         d!ee         dCee         dDee         de)f,dE„Z*ddddddddddddddddddddFœd
ed4eee                  d5eee                  d6ee         d7ee         d%ee         d8ee         d9ee         d:ee         d;ee         d*ee         d<eeee(f                  d=ee         d>ee         d?ee         d@ee         dAee         dBee         d!ee         dDee         de+f*dG„Z,dHede)fdI„Z-dHede.fdJ„Z/dHede
eef         fdK„Z0ddddddddddddddddddddFœd
ed4eee                  d5eee                  d6ee         d7ee         d%ee         d8ee         d9ee         d:ee         d;ee         d*ee         d<eeee(f                  d=ee         d>ee         d?ee         d@ee         dAee         dBee         d!ee         dDee         ddLf*dM„Z1dddddddddNœd
edOee         d;ee         dPee         dQee         d%ee         dee         dRee         dee         de2fdS„Z3dddddddddddddddddd2ddddTœdUee         deee	dV                           dee
eef                  deee                  deee                  dee         dee         dee         dee         dee         dee         dee         dee         dee	d                  dee         dee         deeeeeeeeeeeef	                           dWee4         dCee         dBee         d!ee         dDee         de5f.dX„Z6dddddddddddddddddddddYœdUee         deee	dV                           dee
eef                  deee                  deee                  dee         dee         dee         dee         dee         dee         dee         dee         dee	d                  dee         dee         deeeeeeeeeeeef	                           dWee4         dBee         dDee         d!ee         de7f,dZ„Z8ddddddddddddddddddddd[œdUee         deee	dV                           dee
eef                  deee                  deee                  dee         dee         dee         dee         dee         dee         dee         dee         dee	d                  dee         dee         deeeeeeeeeeeef	                           dWee4         dBee         d!ee         dDee         ddLf,d\„Z9dHede5fd]„Z:dHede.fd^„Z;	 d›dddd.d.d.dd_œdUeee                  d`ee         daee         dbee         d:ee         dcee         ddee         dWee
eef                  de<e         fde„Z=dfede<e         fdg„Z>	 d›dddd.d.d.dd_œdUeee                  d`ee         daee         dbee         d:ee         dcee         ddee         dWee
eef                  de<e         fdh„Z?dddddiœd
edjee         dkee         dlee         dmee         de@fdn„ZAdddddiœd
edjee         dkee         dlee         dmee         deBfdo„ZCdHede@fdp„ZD	 d›dDee         de
eef         fdq„ZE	 	 dœd
edte
eef         de
eef         duedveFdeGjH        fdw„ZI	 	 dœd
ede
eef         duedveFdeGjH        f
dx„ZJ	 	 dœd
ede
eef         duedveFdeGjH        f
dy„ZKdHede
eef         dCede)fdz„ZLd{eGjH        d|eddfd}„ZMd~ed|eded€edef
d�„ZNddddddddd‚œd$ed6ee         dƒee         djee         d„ee         dbee         d…ee         d†eeOe
eef         gdf                  d‡eeOe
eef         gdf                  dePfdˆ„ZQddddddd‰œd$ed6ee         dƒee         djee         d„ee         dbee         d…ee         de
eef         fdŠ„ZRdHedePfd‹„ZSdŒe
eef         d�eddfdŽ„ZTd�„ ZUd›d�„ZVd‘„ ZWd�d“„ZXd”„ ZYd•„ ZZd–„ Z[d›d—„Z\džd˜„Z]dS )ŸÚV1FirecrawlAppa  
    Legacy v1 Firecrawl client for backward compatibility.
    
    This class provides the complete v1 API implementation including:
    - URL scraping with various formats and options
    - Website crawling with monitoring capabilities
    - Batch scraping operations
    - Search functionality
    - Data extraction with LLM integration
    - Deep research capabilities
    - LLMs.txt generation
    
    This is used by the unified client to provide version-specific access
    through app.v1.method_name() patterns.
    a  Schema contains invalid structure for OpenAI: object type with no 'properties' defined but 'additionalProperties: true' (schema-less dictionary not supported by OpenAI). Please define specific properties for your object. Note: Recursive schemas using '$ref' are supported.NÚapi_keyÚapi_urlÚreturnc                 ó*  — |pt          j        d¦  «        | _        |pt          j        dd¦  «        | _        d| j        v r0| j        €)t                               d¦  «         t          d¦  «        ‚t                               d| j        › �¦  «         dS )	zû
        Initialize the V1FirecrawlApp instance with API key, API URL.

        Args:
            api_key (Optional[str]): API key for authenticating with the Firecrawl API.
            api_url (Optional[str]): Base URL for the Firecrawl API.
        ÚFIRECRAWL_API_KEYÚFIRECRAWL_API_URLúhttps://api.firecrawl.devzapi.firecrawl.devNz%No API key provided for cloud servicezNo API key providedz)Initialized V1FirecrawlApp with API URL: )r   ÚgetenvrV  rW  r   rÈ   Ú
ValueErrorÚdebug)ÚselfrV  rW  s      r#   Ú__init__zV1FirecrawlApp.__init__ÿ  s�   € ð Ð@¥"¤)Ð,?Ñ"@Ô"@ˆŒØÐ]¥"¤)Ð,?ÐA\Ñ"]Ô"]ˆŒð  $¤,Ð.Ð.°4´<Ð3GÝ�NŠNÐBÑCÔCÐCÝÐ2Ñ3Ô3Ð3å�ŠÐOÀÄÐOÐOÑPÔPÐPÐPÐPr2   rs   )rn   r\   Úinclude_tagsÚexclude_tagsÚonly_main_contentÚwait_forrt   ru   rv   Úskip_tls_verificationÚremove_base64_imagesÚ	block_adsr   Ú	parse_pdfrO   Újson_optionsrR   Úchange_tracking_optionsÚmax_ageÚstore_in_cacheÚzero_data_retentionrJ   rn   rk   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   rz   ri  rO   rj  rR   rk  rl  rm  rn  c                óæ  — |                       |d¦  «         |                      ¦   «         }|dt          › �dœ}|r||d<   |r||d<   |r||d<   |r||d<   |�||d	<   |r||d
<   |r||d<   |	r|	                     dd¬¦  «        |d<   |
�|
|d<   |�||d<   |�||d<   |�||d<   |r||d<   |�||d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     dd¬¦  «        |d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     dd¬¦  «        |d<   |rd„ |D ¦   «         |d<   |r1t          |t          ¦  «        r|n|                     dd¬¦  «        |d<   |�||d<   |�||d<   |�||d<   |                     |¦  «         d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   t          j        | j	        › d�|||�|dz  d z   nd¬!¦  «        }|j
        d"k    r‹	 |                     ¦   «         }|                     d#¦  «        rd$|v rt          d)i |d$         ¤ŽS d%|v rt          d&|d%         › �¦  «        ‚t          d&|› �¦  «        ‚# t          $ r t          d'¦  «        ‚w xY w|                      |d(¦  «         dS )*aW  
        Scrape and extract content from a URL.

        Args:
          url (str): Target URL to scrape
          formats (Optional[List[Literal["markdown", "html", "rawHtml", "content", "links", "screenshot", "screenshot@fullPage", "extract", "json"]]]): Content types to retrieve (markdown/html/etc)
          headers (Optional[Dict[str, str]]): Custom HTTP headers
          include_tags (Optional[List[str]]): HTML tags to include
          exclude_tags (Optional[List[str]]): HTML tags to exclude
          only_main_content (Optional[bool]): Extract main content only
          wait_for (Optional[int]): Wait for a specific element to appear
          timeout (Optional[int]): Request timeout (ms)
          location (Optional[LocationConfig]): Location configuration
          mobile (Optional[bool]): Use mobile user agent
          skip_tls_verification (Optional[bool]): Skip TLS verification
          remove_base64_images (Optional[bool]): Remove base64 images
          block_ads (Optional[bool]): Block ads
          proxy (Optional[Literal["basic", "stealth", "auto"]]): Proxy type (basic/stealth)
          extract (Optional[JsonConfig]): Content extraction settings
          json_options (Optional[JsonConfig]): JSON extraction settings
          actions (Optional[List[Union[WaitAction, ScreenshotAction, ClickAction, WriteAction, PressAction, ScrollAction, ScrapeAction, ExecuteJavascriptAction, PDFAction]]]): Actions to perform
          change_tracking_options (Optional[ChangeTrackingOptions]): Change tracking settings
          zero_data_retention (Optional[bool]): Whether to delete data after scrape is done


        Returns:
          ScrapeResponse with:
          * Requested content formats
          * Page metadata
          * Extraction results
          * Success/error status

        Raises:
          Exception: If scraping fails
        Ú
scrape_urlúpython-sdk@©rJ   r  rn   r\   ro   rp   Nrq   rr   rt   T©Úby_aliasÚexclude_noneru   rv   rw   rx   ry   r   rƒ   re   rO   rÃ   c                 ój   — g | ]0}t          |t          ¦  «        r|n|                     d d ¬¦  «        ‘Œ1S ©Trs  ©Ú
isinstanceÚdict©Ú.0Úactions     r#   ú
<listcomp>z-V1FirecrawlApp.scrape_url.<locals>.<listcomp>�  óX   € ð  (Uð  (Uð  (Uð  CIµ*¸VÅTÑ2JÔ2JÐ(}¨¨ÐPV×P[ÒP[ÐeiÐx|ÐP[ÑP}ÔP}ð  (Uð  (Uð  (Ur2   rR   r€   r�   r‚   ÚzeroDataRetentionú
/v1/scrapeç     @�@r  ©r\   rB   rt   éÈ   rÇ   rØ   rÉ   úFailed to scrape URL. Error: ú+Failed to parse Firecrawl response as JSON.z
scrape URLr1   )Ú_validate_kwargsÚ_prepare_headersÚversionrz  Ú_ensure_schema_dictry  ÚupdateÚrequestsÚpostrW  Ústatus_coderB   ÚgetrÆ   r   r^  Ú_handle_error)r`  rJ   rn   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   ri  rO   rj  rR   rk  rl  rm  rn  ÚkwargsÚ_headersÚscrape_paramsÚresponseÚresponse_jsons                               r#   rp  zV1FirecrawlApp.scrape_url  s  € ð| 	×Ò˜f lÑ3Ô3Ð3à×(Ò(Ñ*Ô*ˆð Ø-¥GÐ-Ð-ð
ð 
ˆð ð 	/Ø'.ˆM˜)Ñ$Øð 	/Ø'.ˆM˜)Ñ$Øð 	8Ø+7ˆM˜-Ñ(Øð 	8Ø+7ˆM˜-Ñ(ØÐ(Ø/@ˆMÐ+Ñ,Øð 	0Ø'/ˆM˜)Ñ$Øð 	/Ø'.ˆM˜)Ñ$Øð 	XØ(0¯ª¸tÐRV¨Ñ(WÔ(WˆM˜*Ñ%ØÐØ&,ˆM˜(Ñ#Ø Ð,Ø3HˆMÐ/Ñ0ØÐ+Ø2FˆMÐ.Ñ/ØÐ Ø(1ˆM˜*Ñ%Øð 	+Ø%*ˆM˜'Ñ"ØÐ Ø(1ˆM˜*Ñ%ØÐØ×.Ò.¨wÑ7Ô7ˆGÝ˜'¥4Ñ(Ô(ð P¨X¸Ð-@Ð-@Ø$(×$<Ò$<¸WÀXÔ=NÑ$OÔ$O�˜Ñ!Ý2<¸WÅdÑ2KÔ2KÐ' w wÐQX×Q]ÒQ]ÐgkÐz~ÐQ]ÑQÔQˆM˜)Ñ$ØÐ#Ø×3Ò3°LÑAÔAˆLÝ˜,­Ñ-Ô-ð Z°(¸lÐ2JÐ2JØ)-×)AÒ)AÀ,ÈxÔBXÑ)YÔ)Y�˜XÑ&Ý;EÀlÕTXÑ;YÔ;Yð  ,S¨<¨<Ð_k×_pÒ_pÐz~ð  NRÐ_pñ  `Sô  `SˆM˜-Ñ(Øð 	Uð (Uð  (Uð  MTð  (Uñ  (Uô  (UˆM˜)Ñ$Ø"ð 	~ÝPZÐ[rÕtxÑPyÔPyð  6~Ð5LÐ5Lð  @W÷  @\ò  @\ð  fjð  y}ð  @\ñ  @~ô  @~ˆMÐ1Ñ2ØÐØ&-ˆM˜(Ñ#ØÐ%Ø,:ˆM˜.Ñ)ØÐ*Ø1DˆMÐ-Ñ.à×Ò˜VÑ$Ô$Ð$à˜Ð%Ð%¨-¸	Ô*BÐ%ÀxÐS`ÐajÔSkÐGkÐGkØ15×1IÒ1IÈ-ÐXaÔJbÐckÔJlÑ1mÔ1mˆM˜)Ô$ XÑ.Ø˜MÐ)Ð)¨m¸MÔ.JÐ)ÈxÐ[hÐivÔ[wÐOwÐOwØ59×5MÒ5MÈmÐ\iÔNjÐksÔNtÑ5uÔ5uˆM˜-Ô(¨Ñ2õ ”=ØŒ|Ð'Ð'Ð'ØØØ-4Ð-@�W˜vÑ%¨Ñ)Ð)Àdð	
ñ 
ô 
ˆð Ô 3Ò&Ð&ð	OØ (§¢¡¤�Ø ×$Ò$ YÑ/Ô/ð U°F¸mÐ4KÐ4KÝ+ÐDÐD¨m¸FÔ.CÐDÐDÐDØ Ð-Ð-Ý#Ð$\ÀMÐRYÔDZÐ$\Ð$\Ñ]Ô]Ð]å#Ð$SÀMÐ$SÐ$SÑTÔTÐTøÝð Oð Oð OÝÐ MÑNÔNÐNðOøøøð ×Ò˜x¨Ñ6Ô6Ð6Ð6Ð6s   Ë>L> Ì.L> Ì>M)rà   r  r  r  rX   ru   rt   Úscrape_optionsr  rà   r  r  r  rX   r–  c                ó4  — |                       |
d¦  «         i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d	<   |	�|	                     d
d
¬¦  «        |d<   |                     |
¦  «         |                     d¦  «        }t	          dd|i|¤Ž}|                     d
d
¬¦  «        }dt
          › �|d<   |r||d<   t          j        | j        › d�dd| j	        › �i|¬¦  «        }|j
        dk    r…	 |                     ¦   «         }|                     d¦  «        rd|v rt          di |¤ŽS d|v rt          d|d         › �¦  «        ‚t          d|› �¦  «        ‚# t          $ r t          d¦  «        ‚w xY w|                      |d¦  «         dS )aS  
        Search for content using Firecrawl.

        Args:
            query (str): Search query string
            limit (Optional[int]): Max results (default: 5)
            tbs (Optional[str]): Time filter (e.g. "qdr:d")
            filter (Optional[str]): Custom result filter
            lang (Optional[str]): Language code (default: "en")
            country (Optional[str]): Country code (default: "us") 
            location (Optional[str]): Geo-targeting
            timeout (Optional[int]): Request timeout in milliseconds
            scrape_options (Optional[ScrapeOptions]): Result scraping configuration
            **kwargs: Additional keyword arguments for future compatibility

        Returns:
            SearchResponse: Response containing:
                * success (bool): Whether request succeeded
                * data (List[FirecrawlDocument]): Search results
                * warning (Optional[str]): Warning message if any
                * error (Optional[str]): Error message if any

        Raises:
            Exception: If search fails or response cannot be parsed
        r   Nrà   r  r  r  rX   ru   rt   Trs  rå   Úintegrationr  rq  r  ú
/v1/searchÚAuthorizationúBearer ©r\   rB   r„  rÇ   rØ   rÉ   zSearch failed. Error: r†  r1   )r‡  rz  r‹  r�  r
  r‰  rŒ  r�  rW  rV  rŽ  rB   r  r   r^  r�  )r`  r  rà   r  r  r  rX   ru   rt   r–  r‘  Úsearch_paramsÚ_integrationÚfinal_paramsÚparams_dictr”  r•  s                    r#   r   zV1FirecrawlApp.search¨  sT  € ðN 	×Ò˜f hÑ/Ô/Ð/ð ˆð ÐØ%*ˆM˜'Ñ"Øˆ?Ø#&ˆM˜%Ñ ØÐØ&,ˆM˜(Ñ#ØÐØ$(ˆM˜&Ñ!ØÐØ'.ˆM˜)Ñ$ØÐØ(0ˆM˜*Ñ%ØÐØ'.ˆM˜)Ñ$ØÐ%Ø-;×-@Ò-@È$Ð]aÐ-@Ñ-bÔ-bˆM˜/Ñ*ð 	×Ò˜VÑ$Ô$Ð$Ø$×(Ò(¨Ñ7Ô7ˆõ &ÐCÐC¨EÐC°]ÐCÐCˆØ"×'Ò'°ÀDÐ'ÑIÔIˆØ 7­gÐ 7Ð 7ˆ�HÑàð 	6Ø)5ˆK˜Ñ&õ ”=ØŒ|Ð'Ð'Ð'Ø$Ð&>°´Ð&>Ð&>Ð?Øð
ñ 
ô 
ˆð Ô 3Ò&Ð&ð	OØ (§¢¡¤�Ø ×$Ò$ YÑ/Ô/ð N°F¸mÐ4KÐ4KÝ+Ð<Ð<¨mÐ<Ð<Ð<Ø Ð-Ð-Ý#Ð$U¸]È7Ô=SÐ$UÐ$UÑVÔVÐVå#Ð$L¸]Ð$LÐ$LÑMÔMÐMøÝð Oð Oð OÝÐ MÑNÔNÐNðOøøøð ×Ò˜x¨Ñ2Ô2Ð2Ð2Ð2s   Ã>8E% Ä7.E% Å%E?c                 ó¶  — |                       ¦   «         }|                      | j        › d�|¦  «        }|j        dk    r…	 |                     ¦   «         }|                     d¦  «        rd|v rt          d
i |¤ŽS d|v rt          d|d         › �¦  «        ‚t          d|› �¦  «        ‚# t          $ r t          d¦  «        ‚w xY w|  	                    |d¦  «         d	S )z1Get current credit usage and billing period (v1).ú/v1/team/credit-usager„  rÇ   rØ   rÉ   z#Failed to get credit usage. Error: r†  zget credit usageNr1   )
rˆ  Ú_get_requestrW  rŽ  rB   r�  r  r   r^  r�  ©r`  r’  r”  r•  s       r#   Úget_credit_usagezV1FirecrawlApp.get_credit_usage  s  € à×(Ò(Ñ*Ô*ˆØ×$Ò$ØŒ|Ð2Ð2Ð2Øñ
ô 
ˆð
 Ô 3Ò&Ð&ð	OØ (§¢¡¤�Ø ×$Ò$ YÑ/Ô/ð [°F¸mÐ4KÐ4KÝ0ÐAÐA°=ÐAÐAÐAØ Ð-Ð-Ý#Ð$bÈ-ÐX_ÔJ`Ð$bÐ$bÑcÔcÐcå#Ð$YÈ-Ð$YÐ$YÑZÔZÐZøÝð Oð Oð OÝÐ MÑNÔNÐNðOøøøð ×Ò˜xÐ);Ñ<Ô<Ð<Ð<Ð<ó   ¿8B& Á8.B& Â&C c                 ó¶  — |                       ¦   «         }|                      | j        › d�|¦  «        }|j        dk    r…	 |                     ¦   «         }|                     d¦  «        rd|v rt          d
i |¤ŽS d|v rt          d|d         › �¦  «        ‚t          d|› �¦  «        ‚# t          $ r t          d¦  «        ‚w xY w|  	                    |d¦  «         d	S )z0Get current token usage and billing period (v1).ú/v1/team/token-usager„  rÇ   rØ   rÉ   z"Failed to get token usage. Error: r†  zget token usageNr1   )
rˆ  r£  rW  rŽ  rB   r�  r"  r   r^  r�  r¤  s       r#   Úget_token_usagezV1FirecrawlApp.get_token_usage  s  € à×(Ò(Ñ*Ô*ˆØ×$Ò$ØŒ|Ð1Ð1Ð1Øñ
ô 
ˆð
 Ô 3Ò&Ð&ð	OØ (§¢¡¤�Ø ×$Ò$ YÑ/Ô/ð Z°F¸mÐ4KÐ4KÝ/Ð@Ð@°-Ð@Ð@Ð@Ø Ð-Ð-Ý#Ð$aÈÐW^ÔI_Ð$aÐ$aÑbÔbÐbå#Ð$XÈÐ$XÐ$XÑYÔYÐYøÝð Oð Oð OÝÐ MÑNÔNÐNðOøøøð ×Ò˜xÐ):Ñ;Ô;Ð;Ð;Ð;r¦  FÚ
by_api_keyc                 óÈ  — |                       ¦   «         }| j        › d�|rdndz   }|                      ||¦  «        }|j        dk    r…	 |                     ¦   «         }|                     d¦  «        rd|v rt          di |¤ŽS d|v rt          d|d         › �¦  «        ‚t          d|› �¦  «        ‚# t          $ r t          d	¦  «        ‚w xY w|  	                    |d
¦  «         dS )z!Get historical credit usage (v1).z /v1/team/credit-usage/historicalú?byApiKey=trueÚ r„  rÇ   r+  rÉ   z.Failed to get historical credit usage. Error: r†  zget credit usage historicalNr1   )
rˆ  rW  r£  rŽ  rB   r�  r*  r   r^  r�  ©r`  rª  r’  rJ   r”  r•  s         r#   Úget_credit_usage_historicalz*V1FirecrawlApp.get_credit_usage_historical3  s.  € à×(Ò(Ñ*Ô*ˆØ”Ð?Ð?Ð?ÐWaÐCiÐCSÐCSÐgiÑjˆØ×$Ò$ S¨(Ñ3Ô3ˆàÔ 3Ò&Ð&ð	OØ (§¢¡¤�Ø ×$Ò$ YÑ/Ô/ð f°IÀÐ4NÐ4NÝ:ÐKÐK¸]ÐKÐKÐKØ Ð-Ð-Ý#Ð$mÐUbÐcjÔUkÐ$mÐ$mÑnÔnÐnå#Ð$dÐUbÐ$dÐ$dÑeÔeÐeøÝð Oð Oð OÝÐ MÑNÔNÐNðOøøøð ×Ò˜xÐ)FÑGÔGÐGÐGÐGó   Á8B/ Â.B/ Â/C	c                 óÈ  — |                       ¦   «         }| j        › d�|rdndz   }|                      ||¦  «        }|j        dk    r…	 |                     ¦   «         }|                     d¦  «        rd|v rt          di |¤ŽS d|v rt          d|d         › �¦  «        ‚t          d|› �¦  «        ‚# t          $ r t          d	¦  «        ‚w xY w|  	                    |d
¦  «         dS )z Get historical token usage (v1).z/v1/team/token-usage/historicalr¬  r­  r„  rÇ   r+  rÉ   z-Failed to get historical token usage. Error: r†  zget token usage historicalNr1   )
rˆ  rW  r£  rŽ  rB   r�  r0  r   r^  r�  r®  s         r#   Úget_token_usage_historicalz)V1FirecrawlApp.get_token_usage_historicalG  s.  € à×(Ò(Ñ*Ô*ˆØ”Ð>Ð>Ð>ÐV`ÐBhÐBRÐBRÐfhÑiˆØ×$Ò$ S¨(Ñ3Ô3ˆàÔ 3Ò&Ð&ð	OØ (§¢¡¤�Ø ×$Ò$ YÑ/Ô/ð e°IÀÐ4NÐ4NÝ9ÐJÐJ¸MÐJÐJÐJØ Ð-Ð-Ý#Ð$lÐTaÐbiÔTjÐ$lÐ$lÑmÔmÐmå#Ð$cÐTaÐ$cÐ$cÑdÔdÐdøÝð Oð Oð OÝÐ MÑNÔNÐNðOøøøð ×Ò˜xÐ)EÑFÔFÐFÐFÐFr°  é   )Úinclude_pathsÚexclude_pathsÚ	max_depthÚmax_discovery_depthrà   Úallow_backward_linksÚcrawl_entire_domainrQ  Úignore_sitemapr–  rÄ   Údeduplicate_similar_urlsÚignore_query_parametersÚregex_on_full_urlré   Úallow_subdomainsÚmax_concurrencyrn  Úpoll_intervalÚidempotency_keyr´  rµ  r¶  r·  r¸  r¹  rQ  rº  rÄ   r»  r¼  r½  ré   r¾  r¿  rÀ  rÁ  c                ó|  — |                       |d¦  «         i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   n|�||d	<   |	�|	|d
<   |
�|
|d<   |�|                     dd¬¦  «        |d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |                     |¦  «         |                     d¦  «        }t	          d i |¤Ž}|                     dd¬¦  «        }||d<   dt
          › �|d<   |r||d<   |                      |¦  «        }|                      | j        › d�||¦  «        }|j	        dk    rT	 | 
                    ¦   «                              d¦  «        }n#  t          d¦  «        ‚xY w|                      |||¦  «        S |                      |d¦  «         dS )!a´  
        Crawl a website starting from a URL.

        Args:
            url (str): Target URL to start crawling from
            include_paths (Optional[List[str]]): Patterns of URLs to include
            exclude_paths (Optional[List[str]]): Patterns of URLs to exclude
            max_depth (Optional[int]): Maximum crawl depth
            max_discovery_depth (Optional[int]): Maximum depth for finding new URLs
            limit (Optional[int]): Maximum pages to crawl
            allow_backward_links (Optional[bool]): DEPRECATED: Use crawl_entire_domain instead
            crawl_entire_domain (Optional[bool]): Follow parent directory links
            allow_external_links (Optional[bool]): Follow external domain links
            ignore_sitemap (Optional[bool]): Skip sitemap.xml processing
            scrape_options (Optional[ScrapeOptions]): Page scraping configuration
            webhook (Optional[Union[str, WebhookConfig]]): Notification webhook settings
            deduplicate_similar_urls (Optional[bool]): Remove similar URLs
            ignore_query_parameters (Optional[bool]): Ignore URL parameters
            regex_on_full_url (Optional[bool]): Apply regex to full URLs
            delay (Optional[int]): Delay in seconds between scrapes
            allow_subdomains (Optional[bool]): Follow subdomains
            max_concurrency (Optional[int]): Maximum number of concurrent scrapes
            zero_data_retention (Optional[bool]): Whether to delete data after 24 hours
            poll_interval (Optional[int]): Seconds between status checks (default: 2)
            idempotency_key (Optional[str]): Unique key to prevent duplicate requests
            **kwargs: Additional parameters to pass to the API

        Returns:
            CrawlStatusResponse with:
            * Crawling status and progress
            * Crawled page contents
            * Success/error information

        Raises:
            Exception: If crawl fails
        Ú	crawl_urlNrÜ   rÝ   rÞ   rß   rà   râ   rá   rã   rä   Trs  rå   rÄ   ræ   rç   rè   ré   rë   rê   r€  r˜  rJ   rq  r  ú	/v1/crawlr„  rÌ   r†  ústart crawl jobr1   )r‡  rz  r‹  r�  rÛ   r‰  rˆ  Ú_post_requestrW  rŽ  rB   r   Ú_monitor_job_statusr�  )r`  rJ   r´  rµ  r¶  r·  rà   r¸  r¹  rQ  rº  r–  rÄ   r»  r¼  r½  ré   r¾  r¿  rn  rÀ  rÁ  r‘  Úcrawl_paramsrž  rŸ  r   r\   r”  rÌ   s                                 r#   rÃ  zV1FirecrawlApp.crawl_url[  s›  € ð~ 	×Ò˜f kÑ2Ô2Ð2àˆð Ð$Ø+8ˆL˜Ñ(ØÐ$Ø+8ˆL˜Ñ(ØÐ Ø'0ˆL˜Ñ$ØÐ*Ø0CˆLÐ,Ñ-ØÐØ$)ˆL˜Ñ!ØÐ*Ø0CˆLÐ,Ñ-Ð-Ø!Ð-Ø1EˆLÐ-Ñ.ØÐ+Ø1EˆLÐ-Ñ.ØÐ%Ø,:ˆL˜Ñ)ØÐ%Ø,:×,?Ò,?ÈÐ\`Ð,?Ñ,aÔ,aˆL˜Ñ)ØÐØ&-ˆL˜Ñ#Ø#Ð/Ø5MˆLÐ1Ñ2Ø"Ð.Ø4KˆLÐ0Ñ1ØÐ(Ø->ˆLÐ)Ñ*ØÐØ$)ˆL˜Ñ!ØÐ'Ø.>ˆLÐ*Ñ+ØÐ&Ø-<ˆLÐ)Ñ*ØÐ*Ø0CˆLÐ,Ñ-à×Ò˜FÑ#Ô#Ð#Ø#×'Ò'¨Ñ6Ô6ˆõ %Ð4Ð4 |Ð4Ð4ˆØ"×'Ò'°ÀDÐ'ÑIÔIˆØ ˆ�EÑØ 7­gÐ 7Ð 7ˆ�HÑàð 	6Ø)5ˆK˜Ñ&ð ×'Ò'¨Ñ8Ô8ˆØ×%Ò%¨¬Ð&@Ð&@Ð&@À+ÈwÑWÔWˆàÔ 3Ò&Ð&ðPØ—]’]‘_”_×(Ò(¨Ñ.Ô.��øðPÝÐ NÑOÔOÐOøøøØ×+Ò+¨B°¸ÑGÔGÐGà×Ò˜xÐ):Ñ;Ô;Ð;Ð;Ð;s   Å'E; Å;F)r´  rµ  r¶  r·  rà   r¸  r¹  rQ  rº  r–  rÄ   r»  r¼  r½  ré   r¾  r¿  rn  rÁ  c                ó  — |                       |d¦  «         i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   n|�||d	<   |	�|	|d
<   |
�|
|d<   |�|                     dd¬¦  «        |d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |                     |¦  «         t          di |¤Ž}|                     dd¬¦  «        }||d<   dt          › �|d<   |                      |¦  «        }|                      | j        › d�||¦  «        }|j        dk    r3	 t          di | 
                    ¦   «         ¤ŽS #  t          d¦  «        ‚xY w|                      |d¦  «         dS )aÇ  
        Start an asynchronous crawl job.

        Args:
            url (str): Target URL to start crawling from
            include_paths (Optional[List[str]]): Patterns of URLs to include
            exclude_paths (Optional[List[str]]): Patterns of URLs to exclude
            max_depth (Optional[int]): Maximum crawl depth
            max_discovery_depth (Optional[int]): Maximum depth for finding new URLs
            limit (Optional[int]): Maximum pages to crawl
            allow_backward_links (Optional[bool]): DEPRECATED: Use crawl_entire_domain instead
            crawl_entire_domain (Optional[bool]): Follow parent directory links
            allow_external_links (Optional[bool]): Follow external domain links
            ignore_sitemap (Optional[bool]): Skip sitemap.xml processing
            scrape_options (Optional[V1ScrapeOptions]): Page scraping configuration
            webhook (Optional[Union[str, V1WebhookConfig]]): Notification webhook settings
            deduplicate_similar_urls (Optional[bool]): Remove similar URLs
            ignore_query_parameters (Optional[bool]): Ignore URL parameters
            regex_on_full_url (Optional[bool]): Apply regex to full URLs
            delay (Optional[int]): Delay in seconds between scrapes
            allow_subdomains (Optional[bool]): Follow subdomains
            max_concurrency (Optional[int]): Maximum number of concurrent scrapes
            zero_data_retention (Optional[bool]): Whether to delete data after 24 hours
            idempotency_key (Optional[str]): Unique key to prevent duplicate requests
            **kwargs: Additional parameters to pass to the API

        Returns:
            V1CrawlResponse with:
            * success - Whether crawl started successfully
            * id - Unique identifier for the crawl job
            * url - Status check URL for the crawl
            * error - Error message if start failed

        Raises:
            Exception: If crawl initiation fails
        Úasync_crawl_urlNrÜ   rÝ   rÞ   rß   rà   râ   rá   rã   rä   Trs  rå   rÄ   ræ   rç   rè   ré   rë   rê   r€  rJ   rq  r  rÄ  r„  r†  rÅ  r1   )r‡  rz  r‹  rÛ   r‰  rˆ  rÆ  rW  rŽ  rí   rB   r   r�  )r`  rJ   r´  rµ  r¶  r·  rà   r¸  r¹  rQ  rº  r–  rÄ   r»  r¼  r½  ré   r¾  r¿  rn  rÁ  r‘  rÈ  rŸ  r   r\   r”  s                              r#   rÊ  zV1FirecrawlApp.async_crawl_urlÝ  s^  € ð| 	×Ò˜fÐ&7Ñ8Ô8Ð8àˆð Ð$Ø+8ˆL˜Ñ(ØÐ$Ø+8ˆL˜Ñ(ØÐ Ø'0ˆL˜Ñ$ØÐ*Ø0CˆLÐ,Ñ-ØÐØ$)ˆL˜Ñ!ØÐ*Ø0CˆLÐ,Ñ-Ð-Ø!Ð-Ø1EˆLÐ-Ñ.ØÐ+Ø1EˆLÐ-Ñ.ØÐ%Ø,:ˆL˜Ñ)ØÐ%Ø,:×,?Ò,?ÈÐ\`Ð,?Ñ,aÔ,aˆL˜Ñ)ØÐØ&-ˆL˜Ñ#Ø#Ð/Ø5MˆLÐ1Ñ2Ø"Ð.Ø4KˆLÐ0Ñ1ØÐ(Ø->ˆLÐ)Ñ*ØÐØ$)ˆL˜Ñ!ØÐ'Ø.>ˆLÐ*Ñ+ØÐ&Ø-<ˆLÐ)Ñ*ØÐ*Ø0CˆLÐ,Ñ-à×Ò˜FÑ#Ô#Ð#õ %Ð4Ð4 |Ð4Ð4ˆØ"×'Ò'°ÀDÐ'ÑIÔIˆØ ˆ�EÑØ 7­gÐ 7Ð 7ˆ�HÑð ×'Ò'¨Ñ8Ô8ˆØ×%Ò%¨¬Ð&@Ð&@Ð&@À+ÈwÑWÔWˆàÔ 3Ò&Ð&ðPÝ&Ð9Ð9¨¯ª©¬Ð9Ð9Ð9øðPÝÐ NÑOÔOÐOøøøà×Ò˜xÐ):Ñ;Ô;Ð;Ð;Ð;s   Ä7E ÅE&rÌ   c                 óò  — d|› �}|                       ¦   «         }|                      | j        › |› �|¦  «        }|j        dk    �r	 |                     ¦   «         }n#  t          d¦  «        ‚xY w|d         dk    �r8d|v �r3|d         }d|v �r!t          |d         ¦  «        dk    r�n|                     d¦  «        }|st           	                    d	¦  «         nÔ	 |                      ||¦  «        }|j        dk    r#t           
                    d
|j        › �¦  «         n�	 |                     ¦   «         }	n#  t          d¦  «        ‚xY w|                     |	                     dg ¦  «        ¦  «         |	}n4# t
          $ r'}
t           
                    d|
› �¦  «         Y d}
~
nd}
~
ww xY wd|v �°!||d<   |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        dœ}d|v r|d         |d<   d|v r|d         |d<   t          ddd|v rdndi|¤ŽS |                      |d¦  «         dS )a$  
        Check the status and results of a crawl job.

        Args:
            id: Unique identifier for the crawl job

        Returns:
            V1CrawlStatusResponse containing:

            Status Information:
            * status - Current state (scraping/completed/failed/cancelled)
            * completed - Number of pages crawled
            * total - Total pages to crawl
            * creditsUsed - API credits consumed
            * expiresAt - Data expiration timestamp
            
            Results:
            * data - List of crawled documents
            * next - URL for next page of results (if paginated)
            * success - Whether status check succeeded
            * error - Error message if failed

        Raises:
            Exception: If status check fails
        ú
/v1/crawl/r„  r†  rÓ   r]   rØ   r×   r   úExpected 'next' URL is missing.úFailed to fetch next page: ú!Error during pagination request: NrÔ   rÕ   rÖ   ©rÓ   rÔ   r]   rÕ   rÖ   rØ   rÉ   rÇ   FTúcheck crawl statusr1   )rˆ  r£  rW  rŽ  rB   r   Úlenr�  r   rÈ   rÉ   Úextendrï   r�  ©r`  rÌ   Úendpointr\   r”  Ústatus_datarØ   Únext_urlÚstatus_responseÚ	next_dataÚes              r#   Úcheck_crawl_statusz!V1FirecrawlApp.check_crawl_statusY  sì  € ð4 % Ð$Ð$ˆà×'Ò'Ñ)Ô)ˆØ×$Ò$¨¬Ð%@°hÐ%@Ð%@À'ÑJÔJˆØÔ 3Ò&Ñ&ðPØ&Ÿmšm™oœo��øðPÝÐ NÑOÔOÐOøøøØ˜8Ô$¨Ò3Ñ3Ø˜[Ð(Ñ(Ø& vÔ.�DØ  KÐ/Ñ/Ý˜{¨6Ô2Ñ3Ô3°qÒ8Ð8Ù!Ø#.§?¢?°6Ñ#:Ô#:˜Ø'ð "Ý"ŸNšNÐ+LÑMÔMÐMØ!ð"Ø.2×.?Ò.?ÀÈ'Ñ.RÔ.R˜OØ.Ô:¸cÒAÐAÝ &§¢Ð-hÈ?ÔKfÐ-hÐ-hÑ iÔ iÐ iØ %ð`Ø,;×,@Ò,@Ñ,BÔ,B 	 	øð`Ý&/Ð0^Ñ&_Ô&_Ð _øøøØ ŸKšK¨	¯ª°f¸bÑ(AÔ(AÑBÔBÐBØ*3˜K˜KøÝ(ð "ð "ð "Ý"ŸLšLÐ)PÈQÐ)PÐ)PÑQÔQÐQØ!˜E˜E˜E˜Eøøøøð"øøøð% ! KÐ/Ñ/ð* +/�K Ñ'ð &Ÿ/š/¨(Ñ3Ô3Ø$Ÿš¨Ñ1Ô1Ø(Ÿ_š_¨[Ñ9Ô9Ø*Ÿš¨}Ñ=Ô=Ø(Ÿ_š_¨[Ñ9Ô9Ø#Ÿš¨Ñ/Ô/ðð ˆHð ˜+Ð%Ð%Ø$/°Ô$8�˜Ñ!à˜Ð$Ð$Ø#.¨vÔ#6�˜Ñ å(ð ð Ø!(¨KÐ!7Ð!7˜˜¸Tðàðð ð ð
 ×Ò˜xÐ)=Ñ>Ô>Ð>Ð>Ð>ó=   ÁA ÁA,ÃAE6 Ä!D6 Ä5E6 Ä6EÅ.E6 Å6
F'Æ F"Æ"F'c                 ó  — |                       ¦   «         }|                      | j        › d|› d�|¦  «        }|j        dk    r3	 t	          di |                     ¦   «         ¤ŽS #  t          d¦  «        ‚xY w|                      |d¦  «         dS )aL  
        Returns information about crawl errors.

        Args:
            id (str): The ID of the crawl job

        Returns:
            V1CrawlErrorsResponse containing:
            * errors (List[Dict[str, str]]): List of errors with fields:
                - id (str): Error ID
                - timestamp (str): When the error occurred
                - url (str): URL that caused the error
                - error (str): Error message
            * robotsBlocked (List[str]): List of URLs blocked by robots.txt

        Raises:
            Exception: If error check fails
        rÌ  ú/errorsr„  r†  zcheck crawl errorsNr1   ©rˆ  r£  rW  rŽ  rõ   rB   r   r�  ©r`  rÌ   r\   r”  s       r#   Úcheck_crawl_errorsz!V1FirecrawlApp.check_crawl_errors¬  s£   € ð& ×'Ò'Ñ)Ô)ˆØ×$Ò$¨¬Ð%KÐ%KÀÐ%KÐ%KÐ%KÈWÑUÔUˆØÔ 3Ò&Ð&ðPÝ,Ð?Ð?¨x¯}ª}©¬Ð?Ð?Ð?øðPÝÐ NÑOÔOÐOøøøà×Ò˜xÐ)=Ñ>Ô>Ð>Ð>Ð>ó   ÁA  Á A1c                 ó  — |                       ¦   «         }|                      | j        › d|› �|¦  «        }|j        dk    r)	 |                     ¦   «         S #  t          d¦  «        ‚xY w|                      |d¦  «         dS )á}  
        Cancel an asynchronous crawl job.

        Args:
            id (str): The ID of the crawl job to cancel

        Returns:
            Dict[str, Any] containing:
            * success (bool): Whether cancellation was successful
            * error (str, optional): Error message if cancellation failed

        Raises:
            Exception: If cancellation fails
        rÌ  r„  r†  zcancel crawl jobN)rˆ  Ú_delete_requestrW  rŽ  rB   r   r�  rà  s       r#   Úcancel_crawlzV1FirecrawlApp.cancel_crawlÉ  s’   € ð ×'Ò'Ñ)Ô)ˆØ×'Ò'¨4¬<Ð(GÐ(GÀ2Ð(GÐ(GÈÑQÔQˆØÔ 3Ò&Ð&ðPØ—}’}‘”Ð&øðPÝÐ NÑOÔOÐOøøøà×Ò˜xÐ);Ñ<Ô<Ð<Ð<Ð<s   ÁA ÁA&ÚV1CrawlWatcherc                óô   —  | j         |fi d|“d|“d|“d|“d|“d|“d|“d|	“d	|
“d
|“d|“d|“d|“d|“d|“d|“d|“d|“d|“|¤Ž}|j        r|j        rt          |j        | ¦  «        S t	          d¦  «        ‚)aM  
        Initiate a crawl job and return a CrawlWatcher to monitor the job via WebSocket.

        Args:
            url (str): Target URL to start crawling from
            include_paths (Optional[List[str]]): Patterns of URLs to include
            exclude_paths (Optional[List[str]]): Patterns of URLs to exclude
            max_depth (Optional[int]): Maximum crawl depth
            max_discovery_depth (Optional[int]): Maximum depth for finding new URLs
            limit (Optional[int]): Maximum pages to crawl
            allow_backward_links (Optional[bool]): DEPRECATED: Use crawl_entire_domain instead
            crawl_entire_domain (Optional[bool]): Follow parent directory links
            allow_external_links (Optional[bool]): Follow external domain links
            ignore_sitemap (Optional[bool]): Skip sitemap.xml processing
            scrape_options (Optional[V1ScrapeOptions]): Page scraping configuration
            webhook (Optional[Union[str, V1WebhookConfig]]): Notification webhook settings
            deduplicate_similar_urls (Optional[bool]): Remove similar URLs
            ignore_query_parameters (Optional[bool]): Ignore URL parameters
            regex_on_full_url (Optional[bool]): Apply regex to full URLs
            delay (Optional[int]): Delay in seconds between scrapes
            allow_subdomains (Optional[bool]): Follow subdomains
            max_concurrency (Optional[int]): Maximum number of concurrent scrapes
            zero_data_retention (Optional[bool]): Whether to delete data after 24 hours
            idempotency_key (Optional[str]): Unique key to prevent duplicate requests
            **kwargs: Additional parameters to pass to the API

        Returns:
            V1CrawlWatcher: An instance to monitor the crawl job via WebSocket

        Raises:
            Exception: If crawl job fails to start
        r´  rµ  r¶  r·  rà   r¸  r¹  rQ  rº  r–  rÄ   r»  r¼  r½  ré   r¾  r¿  rn  rÁ  úCrawl job failed to start)rÊ  rÇ   rÌ   rç  r   )r`  rJ   r´  rµ  r¶  r·  rà   r¸  r¹  rQ  rº  r–  rÄ   r»  r¼  r½  ré   r¾  r¿  rn  rÁ  r‘  Úcrawl_responses                          r#   Úcrawl_url_and_watchz"V1FirecrawlApp.crawl_url_and_watchâ  sM  € ðr .˜Ô-Øð
ð 
ð 
à'˜-ð
ð (˜-ð
ð  �ið	
ð
 !4Ð 3ð
ð �%ð
ð "6Ð!5ð
ð !4Ð 3ð
ð "6Ð!5ð
ð *˜>ð
ð *˜>ð
ð �Gð
ð &>Ð%=ð
ð %<Ð$;ð
ð 0Ð/ð
ð  �%ð!
ð" .Ð-ð#
ð$ ,˜Oð%
ð& !4Ð 3ð'
ð( ,˜OØð+
ð 
ˆð. Ô!ð 	9 nÔ&7ð 	9Ý! .Ô"3°TÑ:Ô:Ð:åÐ7Ñ8Ô8Ð8r2   )r   rº  Úinclude_subdomainsÚsitemap_onlyrà   rt   Ú	use_indexru   r   rì  rí  rî  c                ó:  — |                       |
d¦  «         i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d	<   |	�|	                     d
d
¬¦  «        |d<   |                     |
¦  «         |                     d¦  «        }t	          di |¤Ž}|                     d
d
¬¦  «        }||d<   dt
          › �|d<   |r||d<   t          j        | j        › d�dd| j	        › �i|¬¦  «        }|j
        dk    r…	 |                     ¦   «         }|                     d¦  «        rd|v rt          di |¤ŽS d|v rt          d|d         › �¦  «        ‚t          d|› �¦  «        ‚# t          $ r t          d¦  «        ‚w xY w|                      |d¦  «         dS )a  
        Map and discover links from a URL.

        Args:
            url (str): Target URL to map
            search (Optional[str]): Filter pattern for URLs
            ignore_sitemap (Optional[bool]): Skip sitemap.xml processing
            include_subdomains (Optional[bool]): Include subdomain links
            sitemap_only (Optional[bool]): Only use sitemap.xml
            limit (Optional[int]): Maximum URLs to return
            timeout (Optional[int]): Request timeout in milliseconds
            **kwargs: Additional parameters to pass to the API

        Returns:
            V1MapResponse: Response containing:
                * success (bool): Whether request succeeded
                * links (List[str]): Discovered URLs
                * error (Optional[str]): Error message if any

        Raises:
            Exception: If mapping fails or response cannot be parsed
        Úmap_urlNr   rä   rú   rû   rà   rt   rü   Trs  ru   r˜  rJ   rq  r  ú/v1/maprš  r›  rœ  r„  rÇ   rN   rÉ   zMap failed. Error: r†  Úmapr1   )r‡  rz  r‹  r�  rù   r‰  rŒ  r�  rW  rV  rŽ  rB   rþ   r   r^  r�  )r`  rJ   r   rº  rì  rí  rà   rt   rî  ru   r‘  Ú
map_paramsrž  rŸ  r   r”  r•  s                    r#   rð  zV1FirecrawlApp.map_url7  sU  € ðH 	×Ò˜f iÑ0Ô0Ð0ð ˆ
ð ÐØ#)ˆJ�xÑ ØÐ%Ø*8ˆJ�Ñ'ØÐ)Ø.@ˆJÐ*Ñ+ØÐ#Ø(4ˆJ�}Ñ%ØÐØ"'ˆJ�wÑØÐØ$+ˆJ�yÑ!ØÐ Ø%.ˆJ�zÑ"ØÐØ%-§]¢]¸DÈt ]Ñ%TÔ%TˆJ�zÑ"ð 	×Ò˜&Ñ!Ô!Ð!Ø!—~’~ mÑ4Ô4ˆõ #Ð0Ð0 ZÐ0Ð0ˆØ"×'Ò'°ÀDÐ'ÑIÔIˆØ ˆ�EÑØ 7­gÐ 7Ð 7ˆ�HÑàð 	6Ø)5ˆK˜Ñ&õ ”=ØŒ|Ð$Ð$Ð$Ø$Ð&>°´Ð&>Ð&>Ð?Øð
ñ 
ô 
ˆð Ô 3Ò&Ð&ð	OØ (§¢¡¤�Ø ×$Ò$ YÑ/Ô/ð K°G¸}Ð4LÐ4LÝ(Ð9Ð9¨=Ð9Ð9Ð9Ø Ð-Ð-Ý#Ð$R¸-ÈÔ:PÐ$RÐ$RÑSÔSÐSå#Ð$I¸-Ð$IÐ$IÑJÔJÐJøÝð Oð Oð OÝÐ MÑNÔNÐNðOøøøð ×Ò˜x¨Ñ/Ô/Ð/Ð/Ð/s   Ä8E( Ä:.E( Å(F)rn   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   rO   rj  rR   rÀ   rÀ  r¿  rn  rÁ  Úurls©	rK   rL   rM   rl   rN   rP   rm   rO   rB   rÀ   c                ón  — |                       |d¦  «         i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d	<   |	�|	                     d
d
¬¦  «        |d<   |
�|
|d<   |�||d<   |�||d<   |�||d<   |�||d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     d
d
¬¦  «        |d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     d
d
¬¦  «        |d<   |rd„ |D ¦   «         |d<   |�|                     d
d
¬¦  «        |d<   |�||d<   |�||d<   |                     |¦  «         t          d"i |¤Ž}|                     d
d
¬¦  «        }||d<   dt          › �|d<   d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   |                      |¦  «        }|                      | j	        › d�||¦  «        }|j
        dk    rT	 |                     ¦   «                              d¦  «        }n#  t          d ¦  «        ‚xY w|                      |||¦  «        S |                      |d!¦  «         dS )#aH  
        Batch scrape multiple URLs and monitor until completion.

        Args:
            urls (List[str]): URLs to scrape
            formats (Optional[List[Literal]]): Content formats to retrieve
            headers (Optional[Dict[str, str]]): Custom HTTP headers
            include_tags (Optional[List[str]]): HTML tags to include
            exclude_tags (Optional[List[str]]): HTML tags to exclude
            only_main_content (Optional[bool]): Extract main content only
            wait_for (Optional[int]): Wait time in milliseconds
            timeout (Optional[int]): Request timeout in milliseconds
            location (Optional[LocationConfig]): Location configuration
            mobile (Optional[bool]): Use mobile user agent
            skip_tls_verification (Optional[bool]): Skip TLS verification
            remove_base64_images (Optional[bool]): Remove base64 encoded images
            block_ads (Optional[bool]): Block advertisements
            proxy (Optional[Literal]): Proxy type to use
            extract (Optional[JsonConfig]): Content extraction config
            json_options (Optional[JsonConfig]): JSON extraction config
            actions (Optional[List[Union]]): Actions to perform
            agent (Optional[AgentOptions]): Agent configuration
            max_concurrency (Optional[int]): Maximum number of concurrent scrapes
            poll_interval (Optional[int]): Seconds between status checks (default: 2)
            idempotency_key (Optional[str]): Unique key to prevent duplicate requests
            **kwargs: Additional parameters to pass to the API

        Returns:
            V1BatchScrapeStatusResponse with:
            * Scraping status and progress
            * Scraped content for each URL
            * Success/error information

        Raises:
            Exception: If batch scrape fails
        Úbatch_scrape_urlsNrn   r\   ro   rp   rq   rr   rt   Trs  ru   rv   rw   rx   ry   r   re   rO   rÃ   c                 ój   — g | ]0}t          |t          ¦  «        r|n|                     d d ¬¦  «        ‘Œ1S rw  rx  r{  s     r#   r~  z4V1FirecrawlApp.batch_scrape_urls.<locals>.<listcomp>þ  r  r2   rR   rÀ   rê   r€  rô  rq  r  ú/v1/batch/scraper„  rÌ   r†  ústart batch scrape jobr1   )r‡  rz  rŠ  ry  r‹  rÂ   r‰  rˆ  rÆ  rW  rŽ  rB   r�  r   rÇ  r�  )r`  rô  rn   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   rO   rj  rR   rÀ   rÀ  r¿  rn  rÁ  r‘  r“  rŸ  r   r”  rÌ   s                                r#   r÷  z V1FirecrawlApp.batch_scrape_urls”  sM  € ð@ 	×Ò˜fÐ&9Ñ:Ô:Ð:àˆð ÐØ'.ˆM˜)Ñ$ØÐØ'.ˆM˜)Ñ$ØÐ#Ø+7ˆM˜-Ñ(ØÐ#Ø+7ˆM˜-Ñ(ØÐ(Ø/@ˆMÐ+Ñ,ØÐØ'/ˆM˜)Ñ$ØÐØ'.ˆM˜)Ñ$ØÐØ(0¯ª¸tÐRV¨Ñ(WÔ(WˆM˜*Ñ%ØÐØ&,ˆM˜(Ñ#Ø Ð,Ø3HˆMÐ/Ñ0ØÐ+Ø2FˆMÐ.Ñ/ØÐ Ø(1ˆM˜*Ñ%ØÐØ%*ˆM˜'Ñ"ØÐØ×.Ò.¨wÑ7Ô7ˆGÝ˜'¥4Ñ(Ô(ð P¨X¸Ð-@Ð-@Ø$(×$<Ò$<¸WÀXÔ=NÑ$OÔ$O�˜Ñ!Ý2<¸WÅdÑ2KÔ2KÐ' w wÐQX×Q]ÒQ]ÐgkÐz~ÐQ]ÑQÔQˆM˜)Ñ$ØÐ#Ø×3Ò3°LÑAÔAˆLÝ˜,­Ñ-Ô-ð Z°(¸lÐ2JÐ2JØ)-×)AÒ)AÀ,ÈxÔBXÑ)YÔ)Y�˜XÑ&Ý;EÀlÕTXÑ;YÔ;Yð  ,S¨<¨<Ð_k×_pÒ_pÐz~ð  NRÐ_pñ  `Sô  `SˆM˜-Ñ(Øð 	Uð (Uð  (Uð  MTð  (Uñ  (Uô  (UˆM˜)Ñ$ØÐØ%*§Z¢Z¸ÈD ZÑ%QÔ%QˆM˜'Ñ"ØÐ&Ø.=ˆMÐ*Ñ+ØÐ*Ø1DˆMÐ-Ñ.ð 	×Ò˜VÑ$Ô$Ð$õ &Ð6Ð6¨Ð6Ð6ˆØ"×'Ò'°ÀDÐ'ÑIÔIˆØ"ˆ�FÑØ 7­gÐ 7Ð 7ˆ�HÑà˜Ð#Ð#¨°IÔ(>Ð#À8È{Ð[dÔOeÐCeÐCeØ/3×/GÒ/GÈÐT]ÔH^Ð_gÔHhÑ/iÔ/iˆK˜	Ô" 8Ñ,Ø˜KÐ'Ð'¨K¸Ô,FÐ'È8ÐWbÐcpÔWqÐKqÐKqØ37×3KÒ3KÈKÐXeÔLfÐgoÔLpÑ3qÔ3qˆK˜Ô& xÑ0ð ×'Ò'¨Ñ8Ô8ˆØ×%Ò%¨¬Ð&GÐ&GÐ&GÈÐV]Ñ^Ô^ˆàÔ 3Ò&Ð&ðPØ—]’]‘_”_×(Ò(¨Ñ.Ô.��øðPÝÐ NÑOÔOÐOøøøØ×+Ò+¨B°¸ÑGÔGÐGà×Ò˜xÐ)AÑBÔBÐBÐBÐBs   Ë'K4 Ë4L)rn   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   rO   rj  rR   rÀ   r¿  rÁ  rn  c                ó,  — |                       |d¦  «         i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d	<   |	�|	                     d
d
¬¦  «        |d<   |
�|
|d<   |�||d<   |�||d<   |�||d<   |�||d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     d
d
¬¦  «        |d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     d
d
¬¦  «        |d<   |rd„ |D ¦   «         |d<   |�|                     d
d
¬¦  «        |d<   |�||d<   |�||d<   |                     |¦  «         t          d!i |¤Ž}|                     d
d
¬¦  «        }||d<   dt          › �|d<   d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   |                      |¦  «        }|                      | j	        › d�||¦  «        }|j
        dk    r3	 t          d!i |                     ¦   «         ¤ŽS #  t          d¦  «        ‚xY w|                      |d ¦  «         dS )"a~  
        Initiate a batch scrape job asynchronously.

        Args:
            urls (List[str]): URLs to scrape
            formats (Optional[List[Literal]]): Content formats to retrieve
            headers (Optional[Dict[str, str]]): Custom HTTP headers
            include_tags (Optional[List[str]]): HTML tags to include
            exclude_tags (Optional[List[str]]): HTML tags to exclude
            only_main_content (Optional[bool]): Extract main content only
            wait_for (Optional[int]): Wait time in milliseconds
            timeout (Optional[int]): Request timeout in milliseconds
            location (Optional[LocationConfig]): Location configuration
            mobile (Optional[bool]): Use mobile user agent
            skip_tls_verification (Optional[bool]): Skip TLS verification
            remove_base64_images (Optional[bool]): Remove base64 encoded images
            block_ads (Optional[bool]): Block advertisements
            proxy (Optional[Literal]): Proxy type to use
            extract (Optional[JsonConfig]): Content extraction config
            json_options (Optional[JsonConfig]): JSON extraction config
            actions (Optional[List[Union]]): Actions to perform
            agent (Optional[AgentOptions]): Agent configuration
            max_concurrency (Optional[int]): Maximum number of concurrent scrapes
            zero_data_retention (Optional[bool]): Whether to delete data after 24 hours
            idempotency_key (Optional[str]): Unique key to prevent duplicate requests
            **kwargs: Additional parameters to pass to the API

        Returns:
            V1BatchScrapeResponse with:
            * success - Whether job started successfully
            * id - Unique identifier for the job
            * url - Status check URL
            * error - Error message if start failed

        Raises:
            Exception: If job initiation fails
        Úasync_batch_scrape_urlsNrn   r\   ro   rp   rq   rr   rt   Trs  ru   rv   rw   rx   ry   r   re   rO   rÃ   c                 ój   — g | ]0}t          |t          ¦  «        r|n|                     d d ¬¦  «        ‘Œ1S rw  rx  r{  s     r#   r~  z:V1FirecrawlApp.async_batch_scrape_urls.<locals>.<listcomp>‹  r  r2   rR   rÀ   rê   r€  rô  rq  r  rù  r„  r†  rú  r1   )r‡  rz  rŠ  ry  r‹  rÂ   r‰  rˆ  rÆ  rW  rŽ  rË   rB   r   r�  )r`  rô  rn   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   rO   rj  rR   rÀ   r¿  rÁ  rn  r‘  r“  rŸ  r   r”  s                              r#   rü  z&V1FirecrawlApp.async_batch_scrape_urls!  s4  € ð@ 	×Ò˜fÐ&?Ñ@Ô@Ð@àˆð ÐØ'.ˆM˜)Ñ$ØÐØ'.ˆM˜)Ñ$ØÐ#Ø+7ˆM˜-Ñ(ØÐ#Ø+7ˆM˜-Ñ(ØÐ(Ø/@ˆMÐ+Ñ,ØÐØ'/ˆM˜)Ñ$ØÐØ'.ˆM˜)Ñ$ØÐØ(0¯ª¸tÐRV¨Ñ(WÔ(WˆM˜*Ñ%ØÐØ&,ˆM˜(Ñ#Ø Ð,Ø3HˆMÐ/Ñ0ØÐ+Ø2FˆMÐ.Ñ/ØÐ Ø(1ˆM˜*Ñ%ØÐØ%*ˆM˜'Ñ"ØÐØ×.Ò.¨wÑ7Ô7ˆGÝ˜'¥4Ñ(Ô(ð P¨X¸Ð-@Ð-@Ø$(×$<Ò$<¸WÀXÔ=NÑ$OÔ$O�˜Ñ!Ý2<¸WÅdÑ2KÔ2KÐ' w wÐQX×Q]ÒQ]ÐgkÐz~ÐQ]ÑQÔQˆM˜)Ñ$ØÐ#Ø×3Ò3°LÑAÔAˆLÝ˜,­Ñ-Ô-ð Z°(¸lÐ2JÐ2JØ)-×)AÒ)AÀ,ÈxÔBXÑ)YÔ)Y�˜XÑ&Ý;EÀlÕTXÑ;YÔ;Yð  ,S¨<¨<Ð_k×_pÒ_pÐz~ð  NRÐ_pñ  `Sô  `SˆM˜-Ñ(Øð 	Uð (Uð  (Uð  MTð  (Uñ  (Uô  (UˆM˜)Ñ$ØÐØ%*§Z¢Z¸ÈD ZÑ%QÔ%QˆM˜'Ñ"ØÐ&Ø.=ˆMÐ*Ñ+ØÐ*Ø1DˆMÐ-Ñ.ð 	×Ò˜VÑ$Ô$Ð$õ &Ð6Ð6¨Ð6Ð6ˆØ"×'Ò'°ÀDÐ'ÑIÔIˆØ"ˆ�FÑØ 7­gÐ 7Ð 7ˆ�HÑà˜Ð#Ð#¨°IÔ(>Ð#À8È{Ð[dÔOeÐCeÐCeØ/3×/GÒ/GÈÐT]ÔH^Ð_gÔHhÑ/iÔ/iˆK˜	Ô" 8Ñ,Ø˜KÐ'Ð'¨K¸Ô,FÐ'È8ÐWbÐcpÔWqÐKqÐKqØ37×3KÒ3KÈKÐXeÔLfÐgoÔLpÑ3qÔ3qˆK˜Ô& xÑ0ð ×'Ò'¨Ñ8Ô8ˆØ×%Ò%¨¬Ð&GÐ&GÐ&GÈÐV]Ñ^Ô^ˆàÔ 3Ò&Ð&ðPÝ,Ð?Ð?¨x¯}ª}©¬Ð?Ð?Ð?øðPÝÐ NÑOÔOÐOøøøà×Ò˜xÐ)AÑBÔBÐBÐBÐBs   ËK* Ë*K;)rn   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   rO   rj  rR   rÀ   r¿  rn  rÁ  c                ó�  — |                       |d¦  «         i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d	<   |	�|	                     d
d
¬¦  «        |d<   |
�|
|d<   |�||d<   |�||d<   |�||d<   |�||d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     d
d
¬¦  «        |d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     d
d
¬¦  «        |d<   |rd„ |D ¦   «         |d<   |�|                     d
d
¬¦  «        |d<   |�||d<   |�||d<   |                     |¦  «         t          d"i |¤Ž}|                     d
d
¬¦  «        }||d<   dt          › �|d<   d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   |                      |¦  «        }|                      | j	        › d�||¦  «        }|j
        dk    re	 t          d"i |                     ¦   «         ¤Ž}|j        r|j        rt          |j        | ¦  «        S t!          d¦  «        ‚#  t!          d ¦  «        ‚xY w|                      |d!¦  «         dS )#a   
        Initiate a batch scrape job and return a CrawlWatcher to monitor the job via WebSocket.

        Args:
            urls (List[str]): URLs to scrape
            formats (Optional[List[Literal]]): Content formats to retrieve
            headers (Optional[Dict[str, str]]): Custom HTTP headers
            include_tags (Optional[List[str]]): HTML tags to include
            exclude_tags (Optional[List[str]]): HTML tags to exclude
            only_main_content (Optional[bool]): Extract main content only
            wait_for (Optional[int]): Wait time in milliseconds
            timeout (Optional[int]): Request timeout in milliseconds
            location (Optional[LocationConfig]): Location configuration
            mobile (Optional[bool]): Use mobile user agent
            skip_tls_verification (Optional[bool]): Skip TLS verification
            remove_base64_images (Optional[bool]): Remove base64 encoded images
            block_ads (Optional[bool]): Block advertisements
            proxy (Optional[Literal]): Proxy type to use
            extract (Optional[JsonConfig]): Content extraction config
            json_options (Optional[JsonConfig]): JSON extraction config
            actions (Optional[List[Union]]): Actions to perform
            agent (Optional[AgentOptions]): Agent configuration
            max_concurrency (Optional[int]): Maximum number of concurrent scrapes
            zero_data_retention (Optional[bool]): Whether to delete data after 24 hours
            idempotency_key (Optional[str]): Unique key to prevent duplicate requests
            **kwargs: Additional parameters to pass to the API

        Returns:
            V1CrawlWatcher: An instance to monitor the batch scrape job via WebSocket

        Raises:
            Exception: If batch scrape job fails to start
        Úbatch_scrape_urls_and_watchNrn   r\   ro   rp   rq   rr   rt   Trs  ru   rv   rw   rx   ry   r   re   rO   rÃ   c                 ój   — g | ]0}t          |t          ¦  «        r|n|                     d d ¬¦  «        ‘Œ1S rw  rx  r{  s     r#   r~  z>V1FirecrawlApp.batch_scrape_urls_and_watch.<locals>.<listcomp>  r  r2   rR   rÀ   rê   r€  rô  rq  r  rù  r„  ú Batch scrape job failed to startr†  rú  r1   )r‡  rz  rŠ  ry  r‹  rÂ   r‰  rˆ  rÆ  rW  rŽ  rË   rB   rÇ   rÌ   rç  r   r�  )r`  rô  rn   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   rO   rj  rR   rÀ   r¿  rn  rÁ  r‘  r“  rŸ  r   r”  rê  s                               r#   rÿ  z*V1FirecrawlApp.batch_scrape_urls_and_watch­  sl  € ðx 	×Ò˜fÐ&CÑDÔDÐDàˆð ÐØ'.ˆM˜)Ñ$ØÐØ'.ˆM˜)Ñ$ØÐ#Ø+7ˆM˜-Ñ(ØÐ#Ø+7ˆM˜-Ñ(ØÐ(Ø/@ˆMÐ+Ñ,ØÐØ'/ˆM˜)Ñ$ØÐØ'.ˆM˜)Ñ$ØÐØ(0¯ª¸tÐRV¨Ñ(WÔ(WˆM˜*Ñ%ØÐØ&,ˆM˜(Ñ#Ø Ð,Ø3HˆMÐ/Ñ0ØÐ+Ø2FˆMÐ.Ñ/ØÐ Ø(1ˆM˜*Ñ%ØÐØ%*ˆM˜'Ñ"ØÐØ×.Ò.¨wÑ7Ô7ˆGÝ˜'¥4Ñ(Ô(ð P¨X¸Ð-@Ð-@Ø$(×$<Ò$<¸WÀXÔ=NÑ$OÔ$O�˜Ñ!Ý2<¸WÅdÑ2KÔ2KÐ' w wÐQX×Q]ÒQ]ÐgkÐz~ÐQ]ÑQÔQˆM˜)Ñ$ØÐ#Ø×3Ò3°LÑAÔAˆLÝ˜,­Ñ-Ô-ð Z°(¸lÐ2JÐ2JØ)-×)AÒ)AÀ,ÈxÔBXÑ)YÔ)Y�˜XÑ&Ý;EÀlÕTXÑ;YÔ;Yð  ,S¨<¨<Ð_k×_pÒ_pÐz~ð  NRÐ_pñ  `Sô  `SˆM˜-Ñ(Øð 	Uð (Uð  (Uð  MTð  (Uñ  (Uô  (UˆM˜)Ñ$ØÐØ%*§Z¢Z¸ÈD ZÑ%QÔ%QˆM˜'Ñ"ØÐ&Ø.=ˆMÐ*Ñ+ØÐ*Ø1DˆMÐ-Ñ.ð 	×Ò˜VÑ$Ô$Ð$õ &Ð6Ð6¨Ð6Ð6ˆØ"×'Ò'°ÀDÐ'ÑIÔIˆØ"ˆ�FÑØ 7­gÐ 7Ð 7ˆ�HÑà˜Ð#Ð#¨°IÔ(>Ð#À8È{Ð[dÔOeÐCeÐCeØ/3×/GÒ/GÈÐT]ÔH^Ð_gÔHhÑ/iÔ/iˆK˜	Ô" 8Ñ,Ø˜KÐ'Ð'¨K¸Ô,FÐ'È8ÐWbÐcpÔWqÐKqÐKqØ37×3KÒ3KÈKÐXeÔLfÐgoÔLpÑ3qÔ3qˆK˜Ô& xÑ0ð ×'Ò'¨Ñ8Ô8ˆØ×%Ò%¨¬Ð&GÐ&GÐ&GÈÐV]Ñ^Ô^ˆàÔ 3Ò&Ð&ðPÝ!6Ð!IÐ!I¸¿º¹¼Ð!IÐ!I�Ø!Ô)ð H¨nÔ.?ð HÝ)¨.Ô*;¸TÑBÔBÐBå#Ð$FÑGÔGÐGøðPÝÐ NÑOÔOÐOøøøà×Ò˜xÐ)AÑBÔBÐBÐBÐBs   ËA L ÌL ÌL-c                 ó   — d|› �}|                       ¦   «         }|                      | j        › |› �|¦  «        }|j        dk    �r#	 |                     ¦   «         }n#  t          d¦  «        ‚xY w|d         dk    �r8d|v �r3|d         }d|v �r!t          |d         ¦  «        dk    r�n|                     d¦  «        }|st           	                    d	¦  «         nÔ	 |                      ||¦  «        }|j        dk    r#t           
                    d
|j        › �¦  «         n�	 |                     ¦   «         }	n#  t          d¦  «        ‚xY w|                     |	                     dg ¦  «        ¦  «         |	}n4# t
          $ r'}
t           
                    d|
› �¦  «         Y d}
~
nd}
~
ww xY wd|v �°!||d<   t          di d|v rdnd|                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        |                     d¦  «        dœ	¤ŽS |                      |d¦  «         dS )a@  
        Check the status of a batch scrape job using the Firecrawl API.

        Args:
            id (str): The ID of the batch scrape job.

        Returns:
            V1BatchScrapeStatusResponse: The status of the batch scrape job.

        Raises:
            Exception: If the status check request fails.
        ú/v1/batch/scrape/r„  r†  rÓ   r]   rØ   r×   r   rÍ  rÎ  rÏ  NrÉ   FTrÔ   rÕ   rÖ   )	rÇ   rÓ   rÔ   r]   rÕ   rÖ   rØ   r×   rÉ   zcheck batch scrape statusr1   )rˆ  r£  rW  rŽ  rB   r   rÒ  r�  r   rÈ   rÉ   rÓ  rÏ   r�  rÔ  s              r#   Úcheck_batch_scrape_statusz(V1FirecrawlApp.check_batch_scrape_status9  sÈ  € ð , rÐ+Ð+ˆà×'Ò'Ñ)Ô)ˆØ×$Ò$¨¬Ð%@°hÐ%@Ð%@À'ÑJÔJˆØÔ 3Ò&Ñ&ðPØ&Ÿmšm™oœo��øðPÝÐ NÑOÔOÐOøøøØ˜8Ô$¨Ò3Ñ3Ø˜[Ð(Ñ(Ø& vÔ.�DØ  KÐ/Ñ/Ý˜{¨6Ô2Ñ3Ô3°qÒ8Ð8Ù!Ø#.§?¢?°6Ñ#:Ô#:˜Ø'ð "Ý"ŸNšNÐ+LÑMÔMÐMØ!ð"Ø.2×.?Ò.?ÀÈ'Ñ.RÔ.R˜OØ.Ô:¸cÒAÐAÝ &§¢Ð-hÈ?ÔKfÐ-hÐ-hÑ iÔ iÐ iØ %ð`Ø,;×,@Ò,@Ñ,BÔ,B 	 	øð`Ý&/Ð0^Ñ&_Ô&_Ð _øøøØ ŸKšK¨	¯ª°f¸bÑ(AÔ(AÑBÔBÐBØ*3˜K˜KøÝ(ð "ð "ð "Ý"ŸLšLÐ)PÈQÐ)PÐ)PÑQÔQÐQØ!˜E˜E˜E˜Eøøøøð"øøøð% ! KÐ/Ñ/ð* +/�K Ñ'å.ð 
ð 
Ø$+¨{Ð$:Ð$:˜5˜5ÀØ%Ÿ/š/¨(Ñ3Ô3Ø$Ÿš¨Ñ1Ô1Ø(Ÿ_š_¨[Ñ9Ô9Ø*Ÿš¨}Ñ=Ô=Ø(Ÿ_š_¨[Ñ9Ô9Ø#Ÿš¨Ñ/Ô/Ø#Ÿš¨Ñ/Ô/Ø$Ÿš¨Ñ1Ô1ð
2ð 
2ð 
ð 
ð 
ð ×Ò˜xÐ)DÑEÔEÐEÐEÐErÜ  c                 ó  — |                       ¦   «         }|                      | j        › d|› d�|¦  «        }|j        dk    r3	 t	          di |                     ¦   «         ¤ŽS #  t          d¦  «        ‚xY w|                      |d¦  «         dS )aX  
        Returns information about batch scrape errors.

        Args:
            id (str): The ID of the crawl job.

        Returns:
            V1CrawlErrorsResponse containing:
            * errors (List[Dict[str, str]]): List of errors with fields:
              * id (str): Error ID
              * timestamp (str): When the error occurred
              * url (str): URL that caused the error
              * error (str): Error message
            * robotsBlocked (List[str]): List of URLs blocked by robots.txt

        Raises:
            Exception: If the error check request fails
        r  rÞ  r„  r†  zcheck batch scrape errorsNr1   rß  rà  s       r#   Úcheck_batch_scrape_errorsz(V1FirecrawlApp.check_batch_scrape_errorsw  s¤   € ð& ×'Ò'Ñ)Ô)ˆØ×$Ò$¨¬Ð%RÐ%RÀrÐ%RÐ%RÐ%RÐT[Ñ\Ô\ˆØÔ 3Ò&Ð&ðPÝ,Ð?Ð?¨x¯}ª}©¬Ð?Ð?Ð?øðPÝÐ NÑOÔOÐOøøøà×Ò˜xÐ)DÑEÔEÐEÐEÐErâ  ©r*   re   rP  rQ  rR  rS  rÀ   r*   re   rP  rR  rS  c                ó
  — ddl }
|
                     dt          d¬¦  «         |                      |	d¦  «         |                      ¦   «         }|s|st          d¦  «        ‚|s|st          d¦  «        ‚|r|                      |¦  «        }|pg ||||d	t          ¦   «         › �d
œ}|r||d<   |r||d<   |r||d<   |                     |	¦  «         	 |  	                    | j
        › d�||¦  «        }|j        dk    �r5	 |                     ¦   «         }n#  t          d¦  «        ‚xY w|d         rë|                     d¦  «        }|st          d¦  «        ‚	 |                      | j
        › d|› �|¦  «        }|j        dk    rn	 |                     ¦   «         }n#  t          d¦  «        ‚xY w|d         dk    rt!          d"i |¤ŽS |d         dv r!t          d|d         › d|d         › �¦  «        ‚n|                      |d¦  «         t%          j        d¦  «         ŒÄt          d|d         › �¦  «        ‚|                      |d¦  «         n/# t          $ r"}t          t)          |¦  «        d¦  «        ‚d}~ww xY wt!          dd ¬!¦  «        S )#aÆ  
        Extract structured information from URLs.

        .. deprecated::
            The extract endpoint is in maintenance mode and its use is discouraged.
            Review https://docs.firecrawl.dev/developer-guides/usage-guides/choosing-the-data-extractor
            to find a replacement.

        Args:
            urls (Optional[List[str]]): URLs to extract from
            prompt (Optional[str]): Custom extraction prompt
            schema (Optional[Any]): JSON schema/Pydantic model
            system_prompt (Optional[str]): System context
            allow_external_links (Optional[bool]): Follow external links
            enable_web_search (Optional[bool]): Enable web search
            show_sources (Optional[bool]): Include source URLs
            agent (Optional[Dict[str, Any]]): Agent configuration
            **kwargs: Additional parameters to pass to the API

        Returns:
            V1ExtractResponse[Any] with:
            * success (bool): Whether request succeeded
            * data (Optional[Any]): Extracted data matching schema
            * error (Optional[str]): Error message if any

        Raises:
            ValueError: If prompt/schema missing or extraction fails
        r   NúºThe extract endpoint is in maintenance mode and its use is discouraged. Review https://docs.firecrawl.dev/developer-guides/usage-guides/choosing-the-data-extractor to find a replacement.r³  ©Ú
stacklevelrO   ú#Either prompt or schema is requiredú!Either urls or prompt is requiredrq  ©rô  rã   r  r  re   r  r*   r¿   rÀ   ú/v1/extractr„  r†  rÇ   rÌ   ú)Job ID not returned from extract request.Tú/v1/extract/rÓ   r]   ©r^   rÒ   úExtract job ú	. Error: rÉ   zextract-statusúFailed to extract. Error: éô  FzInternal server error.©rÇ   rÉ   r1   )ÚwarningsÚwarnÚDeprecationWarningr‡  rˆ  r^  rŠ  r$   r‹  rÆ  rW  rŽ  rB   r   r�  r£  r  r�  ÚtimeÚsleepr0   )r`  rô  r*   re   rP  rQ  rR  rS  rÀ   r‘  r  r\   Úrequest_datar”  rØ   Újob_idrØ  rÖ  rÚ  s                      r#   rO   zV1FirecrawlApp.extract”  s\  € ðP 	ˆˆˆØ�Šð%õ Øð 	ñ 	
ô 	
ð 	
ð 	×Ò˜f iÑ0Ô0Ð0à×'Ò'Ñ)Ô)ˆàð 	D˜fð 	DÝÐBÑCÔCÐCàð 	B˜Fð 	BÝÐ@ÑAÔAÐAàð 	6Ø×-Ò-¨fÑ5Ô5ˆFð �J˜BØ"6Ø0Ø'ØØ3¥K¡M¤MÐ3Ð3ð
ð 
ˆð ð 	,Ø%+ˆL˜Ñ"Øð 	9Ø+8ˆL˜Ñ(àð 	*Ø$)ˆL˜Ñ!ð 	×Ò˜FÑ#Ô#Ð#ð)	*à×)Ò)Ø”<Ð,Ð,Ð,ØØñô ˆHð
 Ô# sÒ*Ñ*ðTØ#Ÿ=š=™?œ?�D�DøðTÝ#Ð$RÑSÔSÐSøøøØ˜	”?ð RØ!ŸXšX d™^œ^�FØ!ð UÝ'Ð(SÑTÔTÐTð&Ø*.×*;Ò*;Ø#œ|ÐAÐA¸ÐAÐAØ#ñ+ô +˜ð +Ô6¸#Ò=Ð=ð`Ø.=×.BÒ.BÑ.DÔ.D  øð`Ý&/Ð0^Ñ&_Ô&_Ð _øøøØ*¨8Ô4¸ÒCÐCÝ'8Ð'GÐ'G¸;Ð'GÐ'GÐ GØ!,¨XÔ!6Ð:QÐ!QÐ!QÝ&/Ð0u¸{È8Ô?TÐ0uÐ0uÐ_jÐkrÔ_sÐ0uÐ0uÑ&vÔ&vÐ vð "Rð !×.Ò.¨Ð@PÑQÔQÐQåœ
 1™œ˜ð#&õ& $Ð$PÀÀgÄÐ$PÐ$PÑQÔQÐQà×"Ò" 8¨YÑ7Ô7Ð7Ð7øÝð 	*ð 	*ð 	*Ý�S ™VœV SÑ)Ô)Ð)øøøøð	*øøøõ !¨Ð6NÐOÑOÔOÐOsP   Ã+I Ã:D ÄI ÄD Ä AI Å>F ÆI ÆF$Æ$I Æ?BI É
I1ÉI,É,I1r  c                 ó¸  — ddl }|                     dt          d¬¦  «         |                      ¦   «         }	 |                      | j        › d|› �|¦  «        }|j        dk    r3	 t          di |                     ¦   «         ¤ŽS #  t          d¦  «        ‚xY w|  
                    |d	¦  «         dS # t          $ r"}t          t          |¦  «        d
¦  «        ‚d}~ww xY w)a  
        Retrieve the status of an extract job.

        .. deprecated::
            The extract endpoint is in maintenance mode and its use is discouraged.
            Review https://docs.firecrawl.dev/developer-guides/usage-guides/choosing-the-data-extractor
            to find a replacement.

        Args:
            job_id (str): The ID of the extract job.

        Returns:
            ExtractResponse[Any]: The status of the extract job.

        Raises:
            ValueError: If there is an error retrieving the status.
        r   Nr	  r³  r
  r  r„  r†  zget extract statusr  r1   )r  r  r  rˆ  r£  rW  rŽ  r  rB   r   r�  r^  r0   )r`  r  r  r\   r”  rÚ  s         r#   Úget_extract_statusz!V1FirecrawlApp.get_extract_status  s  € ð$ 	ˆˆˆØ�Šð%õ Øð 	ñ 	
ô 	
ð 	
ð ×'Ò'Ñ)Ô)ˆð
	*Ø×(Ò(¨D¬LÐ)NÐ)NÀfÐ)NÐ)NÐPWÑXÔXˆHØÔ# sÒ*Ð*ðTÝ,Ð?Ð?¨x¯}ª}©¬Ð?Ð?Ð?øðTÝ#Ð$RÑSÔSÐSøøøà×"Ò" 8Ð-AÑBÔBÐBÐBÐBøÝð 	*ð 	*ð 	*Ý�S ™VœV SÑ)Ô)Ð)øøøøð	*øøøs)   ·+B- Á#B ÂBÂB- Â-
CÂ7CÃCc                ó4  — ddl }	|	                     dt          d¬¦  «         |                      ¦   «         }
|}|r|                      |¦  «        }|||||dt
          › �dœ}|r||d<   |r||d	<   |r||d
<   	 |                      | j        › d�||
¦  «        }|j        dk    r3	 t          di | 
                    ¦   «         ¤ŽS #  t          d¦  «        ‚xY w|                      |d¦  «         dS # t          $ r"}t          t          |¦  «        d¦  «        ‚d}~ww xY w)aÄ  
        Initiate an asynchronous extract job.

        .. deprecated::
            The extract endpoint is in maintenance mode and its use is discouraged.
            Review https://docs.firecrawl.dev/developer-guides/usage-guides/choosing-the-data-extractor
            to find a replacement.

        Args:
            urls (List[str]): URLs to extract information from
            prompt (Optional[str]): Custom extraction prompt
            schema (Optional[Any]): JSON schema/Pydantic model
            system_prompt (Optional[str]): System context
            allow_external_links (Optional[bool]): Follow external links
            enable_web_search (Optional[bool]): Enable web search
            show_sources (Optional[bool]): Include source URLs
            agent (Optional[Dict[str, Any]]): Agent configuration
            idempotency_key (Optional[str]): Unique key to prevent duplicate requests

        Returns:
            ExtractResponse[Any] with:
            * success (bool): Whether request succeeded
            * data (Optional[Any]): Extracted data matching schema
            * error (Optional[str]): Error message if any

        Raises:
            ValueError: If job initiation fails
        r   Nr	  r³  r
  rq  r  r*   r¿   rÀ   r  r„  r†  zasync extractr  r1   )r  r  r  rˆ  rŠ  r‰  rÆ  rW  rŽ  r  rB   r   r�  r^  r0   )r`  rô  r*   re   rP  rQ  rR  rS  rÀ   r  r\   r  r”  rÚ  s                 r#   Úasync_extractzV1FirecrawlApp.async_extract;  s‹  € ðN 	ˆˆˆØ�Šð%õ Øð 	ñ 	
ô 	
ð 	
ð ×'Ò'Ñ)Ô)ˆàˆØð 	6Ø×-Ò-¨fÑ5Ô5ˆFð Ø"6Ø0Ø'ØØ-¥GÐ-Ð-ð
ð 
ˆð ð 	,Ø%+ˆL˜Ñ"Øð 	9Ø+8ˆL˜Ñ(Øð 	*Ø$)ˆL˜Ñ!ð
	*Ø×)Ò)¨T¬\Ð*FÐ*FÐ*FÈÐV]Ñ^Ô^ˆHØÔ# sÒ*Ð*ðTÝ,Ð?Ð?¨x¯}ª}©¬Ð?Ð?Ð?øðTÝ#Ð$RÑSÔSÐSøøøà×"Ò" 8¨_Ñ=Ô=Ð=Ð=Ð=øÝð 	*ð 	*ð 	*Ý�S ™VœV SÑ)Ô)Ð)øøøøð	*øøøs*   Á6*C+ Â!B? Â?CÃC+ Ã+
DÃ5DÄD©Úmax_urlsÚshow_full_textr6  Úexperimental_streamr$  r%  r6  r&  c                ór  — t          ||||¬¦  «        }|                      |||||¬¦  «        }|j        r|j        st	          dddd¬¦  «        S |j        }	 |                      |¦  «        }	|	j        d	k    r|	S |	j        dk    r|	S |	j        d
k    rt	          dddd¬¦  «        S t          j        d¦  «         Œb)a  
        Generate LLMs.txt for a given URL and poll until completion.

        Args:
            url (str): Target URL to generate LLMs.txt from
            max_urls (Optional[int]): Maximum URLs to process (default: 10)
            show_full_text (Optional[bool]): Include full text in output (default: False)
            cache (Optional[bool]): Whether to use cached content if available (default: True)
            experimental_stream (Optional[bool]): Enable experimental streaming

        Returns:
            GenerateLLMsTextStatusResponse with:
            * Generated LLMs.txt content
            * Full version if requested
            * Generation status
            * Success/error information

        Raises:
            Exception: If generation fails
        ©r4  r5  r6  Ú__experimental_streamr#  Fz#Failed to start LLMs.txt generationr^   r­  ©rÇ   rÉ   rÓ   rÖ   Tr]   r  ú/LLMs.txt generation job terminated unexpectedlyr³  )	r2  Úasync_generate_llms_textrÇ   rÌ   rM  Úcheck_generate_llms_text_statusrÓ   r  r  )
r`  rJ   r$  r%  r6  r&  Úparamsr”  r  rÓ   s
             r#   Úgenerate_llms_textz!V1FirecrawlApp.generate_llms_textŒ  s  € õ8 *ØØ'ØØ"5ð	
ñ 
ô 
ˆð ×0Ò0ØØØ)ØØ 3ð 1ñ 
ô 
ˆð Ôð 	 x¤{ð 	Ý3ØØ;ØØð	ñ ô ð ð ”ˆð	Ø×9Ò9¸&ÑAÔAˆFàŒ} Ò+Ð+Ø�Ø” (Ò*Ð*Ø�Ø” ,Ò.Ð.Ý7Ø!ØKØ#Ø ð	ñ ô ð õ ŒJ�q‰MŒMˆMð	r2   c                ó`  — t          ||||¬¦  «        }|                      ¦   «         }d|i|                     dd¬¦  «        ¥}dt          › �|d<   	 |                      | j        › d�||¦  «        }	|	                     ¦   «         }
t          d|¦  «         t          d	|
¦  «         |
                     d
¦  «        r!	 t          di |
¤ŽS #  t          d¦  «        ‚xY w|                      |
d¦  «         n.# t          $ r!}t          t          |¦  «        ¦  «        ‚d}~ww xY wt          dd¬¦  «        S )a‰  
        Initiate an asynchronous LLMs.txt generation operation.

        Args:
            url (str): The target URL to generate LLMs.txt from. Must be a valid HTTP/HTTPS URL.
            max_urls (Optional[int]): Maximum URLs to process (default: 10)
            show_full_text (Optional[bool]): Include full text in output (default: False)
            cache (Optional[bool]): Whether to use cached content if available (default: True)
            experimental_stream (Optional[bool]): Enable experimental streaming

        Returns:
            GenerateLLMsTextResponse: A response containing:
            * success (bool): Whether the generation initiation was successful
            * id (str): The unique identifier for the generation job
            * error (str, optional): Error message if initiation failed

        Raises:
            Exception: If the generation job initiation fails.
        r(  rJ   Trs  rq  r  ú/v1/llmstxtÚ	json_datar”  rÇ   r†  zstart LLMs.txt generationNFúInternal server errorr  r1   )r2  rˆ  rz  r‰  rÆ  rW  rB   r   r�  rG  r   r�  r^  r0   )r`  rJ   r$  r%  r6  r&  r.  r\   r2  Úreqr”  rÚ  s               r#   r,  z'V1FirecrawlApp.async_generate_llms_textÑ  sp  € õ6 *ØØ'ØØ"5ð	
ñ 
ô 
ˆð ×'Ò'Ñ)Ô)ˆØ˜CÐQ 6§;¢;¸È4 ;Ñ#PÔ#PÐQˆ	Ø5­GÐ5Ð5ˆ	�(Ñð	%Ø×$Ò$¨¬Ð%AÐ%AÐ%AÀ9ÈgÑVÔVˆCØ—x’x‘z”zˆHÝ�+˜yÑ)Ô)Ð)Ý�*˜hÑ'Ô'Ð'Ø�|Š|˜IÑ&Ô&ð JðSÝ5ÐAÐA¸ÐAÐAÐAøðSÝ#Ð$QÑRÔRÐRøøøà×"Ò" 8Ð-HÑIÔIÐIÐIøÝð 	%ð 	%ð 	%Ý�S ™VœVÑ$Ô$Ð$øøøøð	%øøøõ *ØØ)ð
ñ 
ô 
ð 	
s+   ÁA(C1 Â:C ÃCÃC1 Ã1
DÃ;DÄDc                 ó
  — |                       ¦   «         }	 |                      | j        › d|› �|¦  «        }|j        dk    rR	 |                     ¦   «         }t          di |¤ŽS # t          $ r$}t          dt          |¦  «        › �¦  «        ‚d}~ww xY w|j        dk    rt          d¦  «        ‚|                      |d¦  «         n.# t          $ r!}t          t          |¦  «        ¦  «        ‚d}~ww xY wt          dd	d
d¬¦  «        S )a;  
        Check the status of a LLMs.txt generation operation.

        Args:
            id (str): The unique identifier of the LLMs.txt generation job to check status for.

        Returns:
            GenerateLLMsTextStatusResponse: A response containing:
            * success (bool): Whether the generation was successful
            * status (str): Status of generation ("processing", "completed", "failed")
            * data (Dict[str, str], optional): Generated text with fields:
              * llmstxt (str): Generated LLMs.txt content
              * llmsfulltxt (str, optional): Full version if requested
            * error (str, optional): Error message if generation failed
            * expiresAt (str): When the generated data expires

        Raises:
            Exception: If the status check fails.
        ú/v1/llmstxt/r„  zFFailed to parse Firecrawl response as GenerateLLMsTextStatusResponse: Né”  z!LLMs.txt generation job not foundz check LLMs.txt generation statusFr3  r^   r­  r*  r1   )
rˆ  r£  rW  rŽ  rB   rM  r   r0   r�  r^  )r`  rÌ   r\   r”  r2  rÚ  s         r#   r-  z.V1FirecrawlApp.check_generate_llms_text_status	  s>  € ð( ×'Ò'Ñ)Ô)ˆð	%Ø×(Ò(¨D¬LÐ)JÐ)JÀbÐ)JÐ)JÈGÑTÔTˆHØÔ# sÒ*Ð*ðwØ (§¢¡¤�IÝ;ÐHÐH¸iÐHÐHÐHøÝ ð wð wð wÝ#Ð$uÕmpÐqrÑmsÔmsÐ$uÐ$uÑvÔvÐvøøøøðwøøøàÔ%¨Ò,Ð,ÝÐ CÑDÔDÐDà×"Ò" 8Ð-OÑPÔPÐPÐPøÝð 	%ð 	%ð 	%Ý�S ™VœVÑ$Ô$Ð$øøøøð	%øøøõ 0¸ÐE\ÐemÐy{Ð|Ñ|Ô|Ð|s5   –+C ÁA" Á"
BÁ,BÂBÂ3C Ã
C/ÃC*Ã*C/c                 ó<   — |rdd| j         › �|dœS dd| j         › �dœS )a$  
        Prepare the headers for API requests.

        Args:
            idempotency_key (Optional[str]): A unique key to ensure idempotency of requests.

        Returns:
            Dict[str, str]: The headers including content type, authorization, and optionally idempotency key.
        zapplication/jsonr›  )úContent-Typerš  zx-idempotency-key)r9  rš  )rV  )r`  rÁ  s     r#   rˆ  zV1FirecrawlApp._prepare_headers1	  sO   € ð ð 	à 2Ø!9¨4¬<Ð!9Ð!9Ø%4ðð ð ð /Ø5 t¤|Ð5Ð5ð
ð 
ð 	
r2   é   ç      à?rØ   ÚretriesÚbackoff_factorc                 óà   — t          |¦  «        D ]]}t          j        |||d|v r|d         �|d         dz  dz   nd¬¦  «        }|j        dk    rt	          j        |d|z  z  ¦  «         ŒZ|c S |S )a^  
        Make a POST request with retries.

        Args:
            url (str): The URL to send the POST request to.
            data (Dict[str, Any]): The JSON data to include in the POST request.
            headers (Dict[str, str]): The headers to include in the POST request.
            retries (int): Number of retries for the request.
            backoff_factor (float): Backoff factor for retries.

        Returns:
            requests.Response: The response from the POST request.

        Raises:
            requests.RequestException: If the request fails after the specified retries.
        rt   Nr‚  r  rƒ  éö  r³  )ÚrangerŒ  r�  rŽ  r  r  )r`  rJ   rØ   r\   r<  r=  Úattemptr”  s           r#   rÆ  zV1FirecrawlApp._post_requestI	  sÃ   € õ. ˜W‘~”~ð 	 ð 	 ˆGÝ”} S°'ÀÐqzð  Cð  rCð  rCð  HLð  MVô  HWð  HcÐPTÐU^ÔP_ÐbhÑPhÐklÑPlÐPlð  imð  oñ  oô  oˆHØÔ# sÒ*Ð*Ý”
˜>¨Q°'©\Ñ:Ñ;Ô;Ð;Ð;à���Øˆr2   c                 ó¨   — t          |¦  «        D ]A}t          j        ||¬¦  «        }|j        dk    rt	          j        |d|z  z  ¦  «         Œ>|c S |S )a	  
        Make a GET request with retries.

        Args:
            url (str): The URL to send the GET request to.
            headers (Dict[str, str]): The headers to include in the GET request.
            retries (int): Number of retries for the request.
            backoff_factor (float): Backoff factor for retries.

        Returns:
            requests.Response: The response from the GET request.

        Raises:
            requests.RequestException: If the request fails after the specified retries.
        ©r\   r?  r³  )r@  rŒ  r�  rŽ  r  r  ©r`  rJ   r\   r<  r=  rA  r”  s          r#   r£  zV1FirecrawlApp._get_requesth	  se   € õ* ˜W‘~”~ð 	 ð 	 ˆGÝ”| C°Ð9Ñ9Ô9ˆHØÔ# sÒ*Ð*Ý”
˜>¨Q°'©\Ñ:Ñ;Ô;Ð;Ð;à���Øˆr2   c                 ó¨   — t          |¦  «        D ]A}t          j        ||¬¦  «        }|j        dk    rt	          j        |d|z  z  ¦  «         Œ>|c S |S )a  
        Make a DELETE request with retries.

        Args:
            url (str): The URL to send the DELETE request to.
            headers (Dict[str, str]): The headers to include in the DELETE request.
            retries (int): Number of retries for the request.
            backoff_factor (float): Backoff factor for retries.

        Returns:
            requests.Response: The response from the DELETE request.

        Raises:
            requests.RequestException: If the request fails after the specified retries.
        rC  r?  r³  )r@  rŒ  ÚdeleterŽ  r  r  rD  s          r#   rå  zV1FirecrawlApp._delete_request…	  se   € õ* ˜W‘~”~ð 	 ð 	 ˆGÝ” s°GÐ<Ñ<Ô<ˆHØÔ# sÒ*Ð*Ý”
˜>¨Q°'©\Ñ:Ñ;Ô;Ð;Ð;à���Øˆr2   c                 ó  — 	 | j         › d|› �}|                      ||¦  «        }|j        dk    �r:	 |                     ¦   «         }n#  t	          d¦  «        ‚xY w|d         dk    r½d|v rª|d         }d|v r�t          |d         ¦  «        d	k    rns|                      |d         |¦  «        }	 |                     ¦   «         }n#  t	          d¦  «        ‚xY w|                     |                     dg ¦  «        ¦  «         d|v °�||d<   t          di |¤ŽS t	          d
¦  «        ‚|d         dv r%t          |d¦  «        }t          j        |¦  «         n.t	          d|d         › �¦  «        ‚|                      |d¦  «         �Œ€)aë  
        Monitor the status of a crawl job until completion.

        Args:
            id (str): The ID of the crawl job.
            headers (Dict[str, str]): The headers to include in the status check requests.
            poll_interval (int): Seconds between status checks.

        Returns:
            CrawlStatusResponse: The crawl results if the job is completed successfully.

        Raises:
            Exception: If the job fails or an error occurs during status checks.
        TrÌ  r„  r†  rÓ   r]   rØ   r×   r   z,Crawl job completed but no data was returned©ÚactiveÚpausedÚpendingÚqueuedÚwaitingrÑ   r³  z)Crawl job failed or was stopped. Status: rÑ  Nr1   )rW  r£  rŽ  rB   r   rÒ  rÓ  r�  rï   Úmaxr  r  r�  )r`  rÌ   r\   rÀ  rW  rØ  rÖ  rØ   s           r#   rÇ  z"V1FirecrawlApp._monitor_job_status¢	  sÔ  € ð&	JØœÐ5Ð5°Ð5Ð5ˆGà"×/Ò/°¸ÑAÔAˆOØÔ*¨cÒ1Ñ1ðTØ"1×"6Ò"6Ñ"8Ô"8�K�KøðTÝ#Ð$RÑSÔSÐSøøøØ˜xÔ(¨KÒ7Ð7Ø Ð,Ð,Ø*¨6Ô2˜Ø$¨Ð3Ð3Ý" ;¨vÔ#6Ñ7Ô7¸1Ò<Ð<Ø %Ø.2×.?Ò.?ÀÈFÔ@SÐU\Ñ.]Ô.]˜Oð`Ø.=×.BÒ.BÑ.DÔ.D  øð`Ý&/Ð0^Ñ&_Ô&_Ð _øøøØ ŸKšK¨¯ª¸ÀÑ(CÔ(CÑDÔDÐDð %¨Ð3Ð3ð /3˜ FÑ+Ý4ÐCÐC°{ÐCÐCÐCå'Ð(VÑWÔWÐWØ  Ô*Ð.nÐnÐnÝ"% m°AÑ"6Ô"6�MÝ”J˜}Ñ-Ô-Ð-Ð-å#Ð$gÐP[Ð\dÔPeÐ$gÐ$gÑhÔhÐhà×"Ò" ?Ð4HÑIÔIÐIñ?	Js   ±A ÁAÂ-C ÃCr”  r}  c                 óÊ  — 	 |                      ¦   «         }|                     dd¦  «        }|                     dd¦  «        }nd#  	 |j        dd…         }|                     ¦   «         rd|› �}d|j        › �}nd	|j        › �}d
}n# t
          $ r d|j        › �}d
}Y nw xY wY nxY w|                      |j        |||¦  «        }t          j         	                    ||¬¦  «        ‚)ah  
        Handle errors from API responses.

        Args:
            response (requests.Response): The response object from the API request.
            action (str): Description of the action that was being performed.

        Raises:
            Exception: An exception with a message containing the status code and error details from the response.
        rÉ   úNo error message provided.Údetailsú%No additional error details provided.Nr  z#Server returned non-JSON response: zFull response status: z+Server returned empty response with status zNo additional details availablez0Server returned unreadable response with status )r”  )
rB   r�  r—   r   rŽ  r^  Ú_get_error_messagerŒ  Ú
exceptionsÚ	HTTPError)r`  r”  r}  r•  Úerror_messageÚerror_detailsÚresponse_textÚmessages           r#   r�  zV1FirecrawlApp._handle_errorÖ	  s&  € ð	BØ$ŸMšM™OœOˆMØ)×-Ò-¨gÐ7SÑTÔTˆMØ)×-Ò-¨iÐ9`ÑaÔaˆMˆMøð	Bð
BØ (¤¨d¨s¨dÔ 3�Ø ×&Ò&Ñ(Ô(ð FØ$YÈ-Ð$YÐ$Y�MØ$S¸XÔ=QÐ$SÐ$S�M�Mà$hÐRZÔRfÐ$hÐ$h�MØ$E�MøøÝð Bð Bð BØ iÐS[ÔSgÐ iÐ i�Ø A���ðBøøøøøøøøð ×)Ò)¨(Ô*>ÀÈÐWdÑeÔeˆõ Ô!×+Ò+¨G¸hÐ+ÑGÔGÐGs0   ‚A A ÁB$Á?BÂB$ÂBÂB$ÂBÂB$rŽ  rV  rW  c                 óÈ   — |dk    rd|› d|› d|› �S |dk    rd|› d|› d|› �S |dk    rd|› d	|› d|› �S |d
k    rd|› d|› d|› �S |dk    rd|› d|› d|› �S d|› d|› d|› d|› �S )aÞ  
        Generate a standardized error message based on HTTP status code.
        
        Args:
            status_code (int): The HTTP status code from the response
            action (str): Description of the action that was being performed
            error_message (str): The error message from the API response
            error_details (str): Additional error details from the API response
            
        Returns:
            str: A formatted error message
        i’  zPayment Required: Failed to z. z - i“  z!Website Not Supported: Failed to i˜  zRequest Timeout: Failed to z as the request timed out. i™  zConflict: Failed to z due to a conflict. r  z!Internal Server Error: Failed to zUnexpected error during z: Status code r1   ©r`  rŽ  r}  rV  rW  s        r#   rS  z!V1FirecrawlApp._get_error_messageû	  sþ   € ð ˜#ÒÐØ]°&Ð]Ð]¸MÐ]Ð]ÈmÐ]Ð]Ð]Ø˜CÒÐØb°vÐbÐbÀÐbÐbÐS`ÐbÐbÐbØ˜CÒÐØu°ÐuÐuÐTaÐuÐuÐfsÐuÐuÐuØ˜CÒÐØg¨&ÐgÐgÀmÐgÐgÐXeÐgÐgÐgØ˜CÒÐØb°vÐbÐbÀÐbÐbÐS`ÐbÐbÐbàt¨fÐtÐtÀKÐtÐtÐS`ÐtÐtÐerÐtÐtÐtr2   )r¶  Ú
time_limitr$  Úanalysis_promptrP  Ú*_V1FirecrawlApp__experimental_stream_stepsÚon_activityÚ	on_sourcer\  r]  r^  r_  r`  c                óÚ  — i }
|�||
d<   |�||
d<   |�||
d<   |�||
d<   |�||
d<   |�||
d<   t          di |
¤Ž}
|                      ||||||¬¦  «        }|                     d	¦  «        rd
|vr|S |d
         }d}d}	 |                      |¦  «        }|r9d|v r5|d         |d…         }|D ]} ||¦  «         Œt	          |d         ¦  «        }|	r9d|v r5|d         |d…         }|D ]} |	|¦  «         Œt	          |d         ¦  «        }|d         dk    r|S |d         dk    r%t          d|                     d¦  «        › �¦  «        ‚|d         dk    rnt          j        d¦  «         ŒìdddœS ©aÏ  
        Initiates a deep research operation on a given query and polls until completion.

        Args:
            query (str): Research query or topic to investigate
            max_depth (Optional[int]): Maximum depth of research exploration
            time_limit (Optional[int]): Time limit in seconds for research
            max_urls (Optional[int]): Maximum number of URLs to process
            analysis_prompt (Optional[str]): Custom prompt for analysis
            system_prompt (Optional[str]): Custom system prompt
            __experimental_stream_steps (Optional[bool]): Enable experimental streaming
            on_activity (Optional[Callable]): Progress callback receiving {type, status, message, timestamp, depth}
            on_source (Optional[Callable]): Source discovery callback receiving {url, title, description}

        Returns:
            DeepResearchStatusResponse containing:
            * success (bool): Whether research completed successfully
            * status (str): Current state (processing/completed/failed)
            * error (Optional[str]): Error message if failed
            * id (str): Unique identifier for the research job
            * data (Any): Research findings and analysis
            * sources (List[Dict]): List of discovered sources
            * activities (List[Dict]): Research progress log
            * summaries (List[str]): Generated research summaries

        Raises:
            Exception: If research fails
        NrÞ   r;  r4  r=  r¿   Ú__experimental_streamSteps)r¶  r\  r$  r]  rP  rÇ   rÌ   r   TrD  r  rÓ   r]   r^   zDeep research failed. Error: rÉ   r  r³  Fz)Deep research job terminated unexpectedlyr  r1   )r9  Úasync_deep_researchr�  Úcheck_deep_research_statusrÒ  r   r  r  )r`  r  r¶  r\  r$  r]  rP  r^  r_  r`  Úresearch_paramsr”  r  Úlast_activity_countÚlast_source_countrÓ   Únew_activitiesÚactivityÚnew_sourcesÚsources                       r#   Údeep_researchzV1FirecrawlApp.deep_research
  s6  € ðP ˆØÐ Ø*3ˆO˜JÑ'ØÐ!Ø+5ˆO˜KÑ(ØÐØ)1ˆO˜IÑ&ØÐ&Ø0?ˆOÐ,Ñ-ØÐ$Ø.;ˆO˜NÑ+Ø&Ð2Ø<WˆOÐ8Ñ9Ý.ÐAÐA°ÐAÐAˆà×+Ò+ØØØ!ØØ+Ø'ð ,ñ 
ô 
ˆð �|Š|˜IÑ&Ô&ð 	¨$°hÐ*>Ð*>ØˆOà˜$”ˆØÐØÐð	Ø×4Ò4°VÑ<Ô<ˆFàð @˜|¨vÐ5Ð5Ø!'¨Ô!5Ð6IÐ6JÐ6JÔ!K�Ø .ð *ð *�HØ�K Ñ)Ô)Ð)Ð)Ý&)¨&°Ô*>Ñ&?Ô&?Ð#àð ;˜Y¨&Ð0Ð0Ø$ YÔ/Ð0AÐ0BÐ0BÔC�Ø)ð &ð &�FØ�I˜fÑ%Ô%Ð%Ð%Ý$'¨¨yÔ(9Ñ$:Ô$:Ð!à�hÔ ;Ò.Ð.Ø�Ø˜Ô! XÒ-Ð-ÝÐ UÀÇ
Â
È7Ñ@SÔ@SÐ UÐ UÑVÔVÐVØ˜Ô! \Ò1Ð1ØåŒJ�q‰MŒMˆMð-	ð0 !Ð+VÐWÐWÐWr2   )r¶  r\  r$  r]  rP  r^  c                ó¼  — i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   t          di |¤Ž}|                      ¦   «         }	d|i|                     d	d	¬
¦  «        ¥}
dt          › �|
d<   d|
v rG|
d         }|r=d|v r9t	          |d         d¦  «        r#|d                              ¦   «         |
d         d<   	 |                      | j        › d�|
|	¦  «        }|j        dk    r)	 | 	                    ¦   «         S #  t          d¦  «        ‚xY w|                      |d¦  «         n.# t          $ r!}t          t          |¦  «        ¦  «        ‚d}~ww xY wdddœS )áº  
        Initiates an asynchronous deep research operation.

        Args:
            query (str): Research query or topic to investigate
            max_depth (Optional[int]): Maximum depth of research exploration
            time_limit (Optional[int]): Time limit in seconds for research
            max_urls (Optional[int]): Maximum number of URLs to process
            analysis_prompt (Optional[str]): Custom prompt for analysis
            system_prompt (Optional[str]): Custom system prompt
            __experimental_stream_steps (Optional[bool]): Enable experimental streaming

        Returns:
            Dict[str, Any]: A response containing:
            * success (bool): Whether the research initiation was successful
            * id (str): The unique identifier for the research job
            * error (str, optional): Error message if initiation failed

        Raises:
            Exception: If the research initiation fails.
        NrÞ   r;  r4  r=  r¿   rc  r  Trs  rq  r  rÃ   re   ú/v1/deep-researchr„  r†  zstart deep researchFr3  r  r1   )r9  rˆ  rz  r‰  Úhasattrre   rÆ  rW  rŽ  rB   r   r�  r^  r0   )r`  r  r¶  r\  r$  r]  rP  r^  rf  r\   r2  Ú	json_optsr”  rÚ  s                 r#   rd  z"V1FirecrawlApp.async_deep_researchu
  sä  € ð> ˆØÐ Ø*3ˆO˜JÑ'ØÐ!Ø+5ˆO˜KÑ(ØÐØ)1ˆO˜IÑ&ØÐ&Ø0?ˆOÐ,Ñ-ØÐ$Ø.;ˆO˜NÑ+Ø&Ð2Ø<WˆOÐ8Ñ9Ý.ÐAÐA°ÐAÐAˆà×'Ò'Ñ)Ô)ˆà˜eÐ^ ×';Ò';ÀTÐX\Ð';Ñ']Ô']Ð^ˆ	Ø5­GÐ5Ð5ˆ	�(Ñð ˜IÐ%Ð%Ø! -Ô0ˆIØð R˜X¨Ð2Ð2µw¸yÈÔ?RÐT\Ñ7]Ô7]Ð2Ø5>¸xÔ5H×5OÒ5OÑ5QÔ5Q�	˜-Ô(¨Ñ2ð
	%Ø×)Ò)¨T¬\Ð*LÐ*LÐ*LÈiÐY`ÑaÔaˆHØÔ# sÒ*Ð*ðSØ#Ÿ=š=™?œ?Ð*øðSÝ#Ð$QÑRÔRÐRøøøà×"Ò" 8Ð-BÑCÔCÐCÐCøÝð 	%ð 	%ð 	%Ý�S ™VœVÑ$Ô$Ð$øøøøð	%øøøð !Ð+BÐCÐCÐCs*   Ã*D+ Ã,D  Ä DÄD+ Ä+
EÄ5EÅEc                 óœ  — |                       ¦   «         }	 |                      | j        › d|› �|¦  «        }|j        dk    r)	 |                     ¦   «         S #  t          d¦  «        ‚xY w|j        dk    rt          d¦  «        ‚|                      |d¦  «         n.# t
          $ r!}t          t          |¦  «        ¦  «        ‚d}~ww xY wdd	d
œS )áÿ  
        Check the status of a deep research operation.

        Args:
            id (str): The ID of the deep research operation.

        Returns:
            DeepResearchResponse containing:

            Status:
            * success - Whether research completed successfully
            * status - Current state (processing/completed/failed)
            * error - Error message if failed
            
            Results:
            * id - Unique identifier for the research job
            * data - Research findings and analysis
            * sources - List of discovered sources
            * activities - Research progress log
            * summaries - Generated research summaries

        Raises:
            Exception: If the status check fails.
        ú/v1/deep-research/r„  r†  r7  zDeep research job not foundzcheck deep research statusNFr3  r  )	rˆ  r£  rW  rŽ  rB   r   r�  r^  r0   )r`  rÌ   r\   r”  rÚ  s        r#   re  z)V1FirecrawlApp.check_deep_research_status¼
  sö   € ð2 ×'Ò'Ñ)Ô)ˆð	%Ø×(Ò(¨D¬LÐ)PÐ)PÈBÐ)PÐ)PÐRYÑZÔZˆHØÔ# sÒ*Ð*ðSØ#Ÿ=š=™?œ?Ð*øðSÝ#Ð$QÑRÔRÐRøøøØÔ%¨Ò,Ð,ÝÐ =Ñ>Ô>Ð>à×"Ò" 8Ð-IÑJÔJÐJÐJøÝð 	%ð 	%ð 	%Ý�S ™VœVÑ$Ô$Ð$øøøøð	%øøøð !Ð+BÐCÐCÐCs)   –+B ÁA ÁA'Á'3B Â
CÂ%CÃCr‘  Úmethod_namec           	      ó&  — |sdS h d£h d£h d£h d£h d£h d£h d£h d£dœ}|                      |t          ¦   «         ¦  «        }t          |                     ¦   «         ¦  «        |z
  }|r)t          d	|› d
d                     |¦  «        › d�¦  «        ‚dS )a¨  
        Validate additional keyword arguments before they are passed to the API.
        This provides early validation before the Pydantic model validation.

        Args:
            kwargs (Dict[str, Any]): Additional keyword arguments to validate
            method_name (str): Name of the method these kwargs are for

        Raises:
            ValueError: If kwargs contain invalid or unsupported parameters
        N>   r   rv   rR   rO   rn   rl  rt   ru   re  rh  r˜  rc  rb  rj  rd  rg  rf  rk  >	   r  r  rà   r  rX   rt   ru   r˜  r–  >   rà   rÄ   r¶  r˜  rµ  r´  rº  r–  r½  r·  r¸  rQ  r¼  r»  >   rà   r   rt   r˜  rí  rº  rì  >   rÀ   r*   re   r˜  rS  rP  rR  rQ  >   rÀ   r   rv   rR   rO   rn   r\   rt   rÄ   ru   re  rh  rc  rb  rj  rd  rg  rf  )rp  r   rÃ  rð  rO   r÷  rü  rÿ  zUnsupported parameter(s) for z: z, zC. Please refer to the API documentation for the correct parameters.)r�  ÚsetÚkeysr^  r   )r`  r‘  rv  Úmethod_paramsÚallowed_paramsÚunknown_paramss         r#   r‡  zV1FirecrawlApp._validate_kwargsæ
  s7  € ð ð 	ØˆFðKð Kð Kð |Ð{Ð{ðð ð ð }Ð|Ð|ð Rð  Rð  Rð"@ð "@ð "@ð(Fð (Fð (Fð,Jð ,Jð ,Jð%
ð 
ˆð2 '×*Ò*¨;½¹¼Ñ>Ô>ˆõ ˜VŸ[š[™]œ]Ñ+Ô+¨nÑ<ˆØð 	lÝð  k¸[ð  kð  kÈDÏIÊIÐVdÑLeÔLeð  kð  kð  kñ  lô  lð  lð	lð 	lr2   c                 óˆ  ‡ — |€|S t          |t          ¦  «        rHt          |d¦  «        r|                     ¦   «         S t          |d¦  «        r|                     ¦   «         S t          |t
          ¦  «        r ˆ fd„|                     ¦   «         D ¦   «         S t          |t          t          f¦  «        rˆ fd„|D ¦   «         S |S )zw
        Utility to ensure a schema is a dict, not a Pydantic model class. Recursively checks dicts and lists.
        NÚmodel_json_schemare   c                 óB   •— i | ]\  }}|‰                      |¦  «        “ŒS r1   ©rŠ  )r|  ÚkÚvr`  s      €r#   ú
<dictcomp>z6V1FirecrawlApp._ensure_schema_dict.<locals>.<dictcomp>&  s-   ø€ ÐNÐNÐN±t°q¸!�A�t×/Ò/°Ñ2Ô2ÐNÐNÐNr2   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r1   r€  )r|  r‚  r`  s     €r#   r~  z6V1FirecrawlApp._ensure_schema_dict.<locals>.<listcomp>(  s'   ø€ Ð@Ð@Ð@°A�D×,Ò,¨QÑ/Ô/Ð@Ð@Ð@r2   )	ry  r‰   rq  r~  re   rz  ÚitemsÚlistÚtuple©r`  re   s   ` r#   rŠ  z"V1FirecrawlApp._ensure_schema_dict  sÑ   ø€ ð ˆ>ØˆMÝ�f�dÑ#Ô#ð 	'å�vÐ2Ñ3Ô3ð 'Ø×/Ò/Ñ1Ô1Ð1Ý˜ Ñ*Ô*ð 'Ø—}’}‘”Ð&Ý�f�dÑ#Ô#ð 	OØNÐNÐNÐN¸v¿|º|¹~¼~ÐNÑNÔNÐNÝ�f�t¥U˜mÑ,Ô,ð 	AØ@Ð@Ð@Ð@¸Ð@Ñ@Ô@Ð@Øˆr2   c                 ó
  — |rt          |t          t          f¦  «        sdS |€t          ¦   «         }ddl} |j        |dt          ¬¦  «        }||v rdS |                     |¦  «         	 t          |t          ¦  «        �r
d|v r¾t          |d         t          ¦  «        r£|d                              d¦  «        }t          |¦  «        dk    ru|d         d	k    ri|d
         dk    r]|d         }||k    r	 | 
                    |¦  «         dS ||v r3|                      ||         |||¦  «        | 
                    |¦  «         S |                     ¦   «         D ]2}	|                      |	|||¦  «        r | 
                    |¦  «         dS Œ3nJt          |t          ¦  «        r5|D ]2}
|                      |
|||¦  «        r | 
                    |¦  «         dS Œ3| 
                    |¦  «         n# | 
                    |¦  «         w xY wdS )a­  
        Check if an object contains a recursive reference to a specific definition.
        
        Args:
            obj: Object to check
            target_def_name: Name of the definition to check for recursion
            defs: Dictionary of definitions
            visited: Set of visited object keys to detect cycles
            
        Returns:
            True if recursive reference is found, False otherwise
        FNr   T)Ú	sort_keysÚdefaultú$refú/r:  ú#r   ú$defséÿÿÿÿ)ry  rz  r†  rx  rB   Údumpsr0   ÚaddÚsplitrÒ  ÚdiscardÚ_contains_recursive_refÚvalues)r`  ÚobjÚtarget_def_nameÚdefsÚvisitedrB   Úobj_keyÚref_pathÚdef_nameÚvalueÚitems              r#   r•  z&V1FirecrawlApp._contains_recursive_ref+  sT  € ð ð 	�* S­4µ¨,Ñ7Ô7ð 	Ø�5àˆ?Ý‘e”eˆGàˆˆˆØ�$”*˜S¨D½#Ð>Ñ>Ô>ˆØ�gÐÐØ�5Ø�Š�GÑÔÐð	%Ý˜#�tÑ$Ô$ñ $Ø˜S�=�=¥Z°°F´½SÑ%AÔ%A�=Ø" 6œ{×0Ò0°Ñ5Ô5�HÝ˜8‘}”}¨Ò)Ð)¨h°q¬k¸SÒ.@Ð.@ÀXÈaÄ[ÐT[ÒE[ÐE[Ø#+¨B¤<˜Ø# Ò6Ð6Ø#'ð �OŠO˜GÑ$Ô$Ð$Ð$Ð$ð $ tÐ+Ð+Ø#'×#?Ò#?ÀÀXÄÐP_ÐaeÐgnÑ#oÔ#oð �OŠO˜GÑ$Ô$Ð$Ð$ð !ŸZšZ™\œ\ð $ð $�EØ×3Ò3°E¸?ÈDÐRYÑZÔZð $Ø#ð �OŠO˜GÑ$Ô$Ð$Ð$Ð$ð$ð$õ ˜C¥Ñ&Ô&ð $Øð $ð $�DØ×3Ò3°D¸/È4ÐQXÑYÔYð $Ø#ð �OŠO˜GÑ$Ô$Ð$Ð$Ð$ð	$ð �OŠO˜GÑ$Ô$Ð$Ð$øˆG�OŠO˜GÑ$Ô$Ð$Ð$øøøàˆus%   Á)B	G) Ä
!G) Å/G) Æ4G) ÇG) Ç)H c                 óv   — |sdS |                      ¦   «         D ]\  }}|                      |||¦  «        r dS Œ dS )zê
        Check if $defs contain circular references.
        
        Args:
            defs: Dictionary of definitions to check
            
        Returns:
            True if circular references are found, False otherwise
        FT)r…  r•  )r`  r™  r�  Ú	def_values       r#   Ú_check_for_circular_defsz'V1FirecrawlApp._check_for_circular_defs]  sZ   € ð ð 	Ø�5à#'§:¢:¡<¤<ð 	ð 	ÑˆH�iØ×+Ò+¨I°xÀÑFÔFð Ø�t�tðð ˆur2   r   c                 ó  ‡ ‡‡‡— |r"t          |t          t          f¦  «        r‰dk    r|S ‰€t          ¦   «         Št	          |¦  «        }|‰v r|S ‰                     |¦  «         	 t          |t          ¦  «        �r#d|v rÇt          |d         t          ¦  «        r¬|d                              d¦  «        }t          |¦  «        dk    rg|d         dk    r[|d         d	k    rO|d
         }|‰v rC‰  	                    t          ‰|         ¦  «        ‰‰‰dz   ¦  «        ‰ 
                    |¦  «         S |‰ 
                    |¦  «         S i }|                     ¦   «         D ]*\  }	}
|	d	k    rŒ‰  	                    |
‰‰‰dz   ¦  «        ||	<   Œ+|‰ 
                    |¦  «         S t          |t          ¦  «        r&ˆˆˆ ˆfd„|D ¦   «         ‰ 
                    |¦  «         S 	 ‰ 
                    |¦  «         n# ‰ 
                    |¦  «         w xY w|S )a|  
        Resolve $ref references in a JSON schema object.
        
        Args:
            obj: Object to resolve references in
            defs: Dictionary of definitions
            visited: Set to track visited objects and prevent infinite recursion
            depth: Current recursion depth
            
        Returns:
            Object with resolved references
        r3  NrŒ  r�  r:  r   rŽ  r   r�  r�  c           	      óF   •— g | ]}‰                      |‰‰‰d z   ¦  «        ‘ŒS )r   )Ú_resolve_refs)r|  rŸ  r™  Údepthr`  rš  s     €€€€r#   r~  z0V1FirecrawlApp._resolve_refs.<locals>.<listcomp>›  s1   ø€ Ð[Ð[Ð[Èt˜×*Ò*¨4°°wÀÈÁ	ÑJÔJÐ[Ð[Ð[r2   )ry  rz  r†  rx  rÌ   r’  r0   r“  rÒ  r¥  r”  r…  )r`  r—  r™  rš  r¦  Úobj_idrœ  r�  Úresolvedr›   rž  s   ` ```      r#   r¥  zV1FirecrawlApp._resolve_refsp  sL  øøøø€ ð ð 	�* S­4µ¨,Ñ7Ô7ð 	¸5À2º:¸:ØˆJàˆ?Ý‘e”eˆGå�C‘”ˆØ�WÐÐØˆJà�Š�FÑÔÐð	$Ý˜#�tÑ$Ô$ñ \Ø˜S�=�=¥Z°°F´½SÑ%AÔ%A�=Ø" 6œ{×0Ò0°Ñ5Ô5�HÝ˜8‘}”}¨Ò)Ð)¨h°q¬k¸SÒ.@Ð.@ÀXÈaÄ[ÐT[ÒE[ÐE[Ø#+¨B¤<˜Ø# tÐ+Ð+Ø#'×#5Ò#5µd¸4À¼>Ñ6JÔ6JÈDÐRYÐ[`ÐcdÑ[dÑ#eÔ#eð �OŠO˜FÑ#Ô#Ð#Ð#ð ð �OŠO˜FÑ#Ô#Ð#Ð#ð �Ø"%§)¢)¡+¤+ð Xð X‘J�C˜Ø˜g’~�~Ø Ø$(×$6Ò$6°u¸dÀGÈUÐUVÉYÑ$WÔ$W�H˜S‘M�MØð �OŠO˜FÑ#Ô#Ð#Ð#õ	 ˜C¥Ñ&Ô&ð \Ø[Ð[Ð[Ð[Ð[Ð[Ð[ÐWZÐ[Ñ[Ô[ð �OŠO˜FÑ#Ô#Ð#Ð#ð	\ð �OŠO˜FÑ#Ô#Ð#Ð#øˆG�OŠO˜FÑ#Ô#Ð#Ð#øøøàˆ
s    Á&B4G1 Ä0G1 ÅAG1 Æ%G1 Ç1Hc                 óv   ‡‡— |rt          |t          ¦  «        s|S t          ¦   «         Šˆˆfd„Š ‰|¦  «        S )zÚ
        Normalize a schema for OpenAI compatibility by handling recursive references.
        
        Args:
            schema: Schema to normalize
            
        Returns:
            Normalized schema
        c                 óÚ  •‡— t          | t          ¦  «        s%t          | t          ¦  «        rˆ	fd„| D ¦   «         S | S t          | ¦  «        }|‰
v r| S ‰
                     |¦  «         t          | ¦  «        Šd‰v r‰
                     |¦  «         ‰S d‰v r›‰                     d¦  «        }i }‰                     ¦   «         D ]2\  }}t          |t          ¦  «        rd|vr ‰	|¦  «        ||<   Œ-|||<   Œ3i |¥dˆ	fd„|                     ¦   «         D ¦   «         i¥}‰
                     |¦  «         |S ‰                     d¦  «        dk    rd‰v r‰                     d¦  «        d	u r‰d= ‰                     d¦  «        dk    rad
‰v r]d‰v rYt          ‰d
         t          ¦  «        r;t          ‰d         t          ¦  «        r ˆfd„‰d
         D ¦   «         }|r|‰d
<   n‰d
= n‰d
= t          ‰                     ¦   «         ¦  «        D ]S\  }}t          |t          ¦  «        rd|vr ‰	|¦  «        ‰|<   Œ-t          |t          ¦  «        rˆ	fd„|D ¦   «         ‰|<   ŒT‰
                     |¦  «         ‰S )Nc                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r1   r1   ©r|  rŸ  Únormalize_objects     €r#   r~  zYV1FirecrawlApp._normalize_schema_for_openai.<locals>.normalize_object.<locals>.<listcomp>´  s%   ø€ ÐCÐCÐC°tÐ,Ð,¨TÑ2Ô2ÐCÐCÐCr2   rŒ  r�  c                 ó.   •— i | ]\  }}| ‰|¦  «        “ŒS r1   r1   )r|  r�  r‚  r­  s      €r#   rƒ  zYV1FirecrawlApp._normalize_schema_for_openai.<locals>.normalize_object.<locals>.<dictcomp>Î  s.   ø€ Ð5fÐ5fÐ5fÑQUÐQRÐTU°aÐ9IÐ9IÈ!Ñ9LÔ9LÐ5fÐ5fÐ5fr2   r‰   ÚobjectÚ
propertiesÚadditionalPropertiesTÚrequiredc                 ó(   •— g | ]}|‰d          v ¯|‘ŒS )r°  r1   )r|  ÚfieldÚ
normalizeds     €r#   r~  zYV1FirecrawlApp._normalize_schema_for_openai.<locals>.normalize_object.<locals>.<listcomp>Ý  s5   ø€ ð &Ið &Ið &I°Ø&+¨z¸,Ô/GÐ&GÐ&Gð ',Ø&GÐ&GÐ&Gr2   c                 óT   •— g | ]$}t          |t          ¦  «        r ‰|¦  «        n|‘Œ%S r1   rx  r¬  s     €r#   r~  zYV1FirecrawlApp._normalize_schema_for_openai.<locals>.normalize_object.<locals>.<listcomp>ì  s<   ø€ Ð&tÐ&tÐ&tÐfjÅÈDÕRVÑAWÔAWÐ'aÐ'7Ð'7¸Ñ'=Ô'=Ð'=Ð]aÐ&tÐ&tÐ&tr2   )	ry  rz  r†  rÌ   r’  r”  Úpopr…  r�  )r—  r§  r™  Úprocessed_restr›   rž  ÚresultÚvalid_requiredrµ  r­  rš  s           @€€r#   r­  zEV1FirecrawlApp._normalize_schema_for_openai.<locals>.normalize_object±  s  øø€ Ý˜c¥4Ñ(Ô(ð Ý˜c¥4Ñ(Ô(ð DØCÐCÐCÐC¸sÐCÑCÔCÐCØ�
õ ˜‘W”WˆFØ˜Ð Ð Ø�
Ø�KŠK˜ÑÔÐå˜c™œˆJð ˜Ð#Ð#Ø—’ Ñ'Ô'Ð'Ø!Ð!à˜*Ð$Ð$Ø!—~’~ gÑ.Ô.�Ø!#�à",×"2Ò"2Ñ"4Ô"4ð 4ð 4‘J�C˜Ý" 5­$Ñ/Ô/ð 4°FÀ%Ð4GÐ4GØ.>Ð.>¸uÑ.EÔ.E˜ sÑ+Ð+à.3˜ sÑ+Ð+àg˜NÐg¨GÐ5fÐ5fÐ5fÐ5fÐY]×YcÒYcÑYeÔYeÐ5fÑ5fÔ5fÐgÐg�Ø—’ Ñ'Ô'Ð'Ø�ð —’˜vÑ&Ô&¨(Ò2Ð2Ø 
Ð*Ð*Ø—’Ð5Ñ6Ô6¸$Ð>Ð>ØÐ5Ð6à—’˜vÑ&Ô&¨(Ò2Ð2Ø˜jÐ(Ð(Ø 
Ð*Ð*Ý˜z¨*Ô5µtÑ<Ô<ð 	/Ý˜z¨,Ô7½Ñ>Ô>ð	/ð&Ið &Ið &Ið &I¸ÀJÔ9Oð &Iñ &Iô &I�Nà%ð 3Ø1?˜
 :Ñ.Ð.à& zÐ2Ð2à" :Ð.õ # :×#3Ò#3Ñ#5Ô#5Ñ6Ô6ð uð u‘
��UÝ˜e¥TÑ*Ô*ð u¨v¸UÐ/BÐ/BØ&6Ð&6°uÑ&=Ô&=�J˜s‘O�OÝ ¥tÑ,Ô,ð uà&tÐ&tÐ&tÐ&tÐnsÐ&tÑ&tÔ&t�J˜s‘Oøà�OŠO˜FÑ#Ô#Ð#ØÐr2   ©ry  rz  rx  )r`  re   r­  rš  s     @@r#   Ú_normalize_schema_for_openaiz+V1FirecrawlApp._normalize_schema_for_openai¢  s_   øø€ ð ð 	�Z¨µÑ5Ô5ð 	ØˆMå‘%”%ˆð>	ð >	ð >	ð >	ð >	ð >	ð@  Ð Ñ'Ô'Ð'r2   c                 óx   ‡‡— |rt          |t          ¦  «        sdS t          ¦   «         Šˆˆfd„Š ‰|¦  «         S )zÌ
        Validate schema for OpenAI compatibility.
        
        Args:
            schema: Schema to validate
            
        Returns:
            True if schema is valid, False otherwise
        Tc                 óÞ  •— t          | t          ¦  «        sdS t          | ¦  «        }|‰v rdS ‰                     |¦  «         d| v r‰                     |¦  «         dS |                      d¦  «        dk    r6d| vr2d| vr.|                      d¦  «        du r‰                     |¦  «         dS |                      ¦   «         D ]–}t          |t          ¦  «        r(d|vr$ ‰|¦  «        r‰                     |¦  «          dS Œ?t          |t          ¦  «        rB|D ]?}t          |t          ¦  «        r(d|vr$ ‰|¦  «        r‰                     |¦  «           dS Œ@Œ—‰                     |¦  «         dS )	NFrŒ  r‰   r¯  r°  ÚpatternPropertiesr±  T)ry  rz  rÌ   r’  r”  r�  r–  r†  )r—  r§  rž  rŸ  Úhas_invalid_structurerš  s       €€r#   rÀ  zIV1FirecrawlApp._validate_schema_for_openai.<locals>.has_invalid_structure  s­  ø€ Ý˜c¥4Ñ(Ô(ð Ø�uå˜‘W”WˆFØ˜Ð Ð Ø�uØ�KŠK˜ÑÔÐà˜ˆ}ˆ}Ø—’ Ñ'Ô'Ð'Ø�uà—’˜‘” 8Ò+Ð+Ø CÐ'Ð'Ø#¨3Ð.Ð.Ø—’Ð.Ñ/Ô/°4Ð7Ð7Ø—’ Ñ'Ô'Ð'Ø�tð Ÿš™œð ,ð ,�Ý˜e¥TÑ*Ô*ð 
,¨v¸UÐ/BÐ/BØ,Ð,¨UÑ3Ô3ð $ØŸš¨Ñ/Ô/Ð/Ø#˜t˜tð$õ   ¥tÑ,Ô,ð ,à %ð ,ð ,˜Ý% d­DÑ1Ô1ð ,°fÀDÐ6HÐ6HØ4Ð4°TÑ:Ô:ð ,Ø '§¢°Ñ 7Ô 7Ð 7Ø'+ t t tøøà�OŠO˜FÑ#Ô#Ð#Ø�5r2   r»  )r`  re   rÀ  rš  s     @@r#   Ú_validate_schema_for_openaiz*V1FirecrawlApp._validate_schema_for_openaió  sb   øø€ ð ð 	�Z¨µÑ5Ô5ð 	Ø�4å‘%”%ˆð#	ð #	ð #	ð #	ð #	ð #	ðJ )Ð(¨Ñ0Ô0Ð0Ð0r2   c                 óê   — |rt          |t          ¦  «        sdS ddl} |j        |¦  «        }d|v pd|v pd|v }t	          |                     d¦  «        p|                     d¦  «        ¦  «        }|p|S )	zá
        Detect if a schema contains recursive references.
        
        Args:
            schema: Schema to analyze
            
        Returns:
            True if schema has recursive patterns, False otherwise
        Fr   Nú"$ref"ú#/$defs/z#/definitions/r�  Údefinitions)ry  rz  rB   r‘  r„   r�  )r`  re   rB   Úschema_stringÚhas_refsÚhas_defss         r#   Ú_detect_recursive_schemaz'V1FirecrawlApp._detect_recursive_schema)  sš   € ð ð 	�Z¨µÑ5Ô5ð 	Ø�5àˆˆˆØ"˜œ
 6Ñ*Ô*ˆà˜Ð%ð .Ø˜-Ð'ð.à Ð-ð 	õ
 ˜Ÿ
š
 7Ñ+Ô+ÐH¨v¯zªz¸-Ñ/HÔ/HÑIÔIˆàÐ#˜8Ð#r2   c                 óN   — |sdddœS |                       |¦  «        rdddœS dddœS )zÌ
        Select appropriate model based on schema complexity.
        
        Args:
            schema: Schema to analyze
            
        Returns:
            Dict with modelName and reason
        zgpt-4o-miniÚ	no_schema)Ú	modelNameÚreasonzgpt-4oÚrecursive_schema_detectedÚsimple_schema)rÉ  rˆ  s     r#   Ú_select_model_for_schemaz'V1FirecrawlApp._select_model_for_schemaA  sO   € ð ð 	GØ!.¸+ÐFÐFÐFà×(Ò(¨Ñ0Ô0ð 	RØ!)Ð5PÐQÐQÐQà*°oÐFÐFÐFr2   c                 ó  — t          |t          ¦  «        �rh||v �rc|                      ||         ¦  «        }|�rt          |t          ¦  «        rí|                     di ¦  «        }ddl} |j        |¦  «        }|                     d¦  «        pd|v pd|v }|r`	 |                      ||¦  «        } |j        |¦  «        }	d|	v pd|	v }
|
s|}t          |t          ¦  «        rd|v r|d= nT# t          $ r Y nHw xY w	 |                      ||¦  «        }t          |t          ¦  «        rd|v r|d= n# t          $ r Y nw xY w|                      |¦  «        }|  	                    |¦  «        st          | j        ¦  «        ‚|||<   |S )a1  
        Process and validate a schema container (like extract or json_options).
        
        Args:
            schema_container: Dict containing schema
            schema_key: Key where schema is stored (default: "schema")
            
        Returns:
            Processed schema container
        r�  r   NrÃ  rÄ  )ry  rz  rŠ  r�  rB   r‘  r¥  r   r¼  rÁ  r^  ÚOPENAI_SCHEMA_ERROR_MESSAGE)r`  Úschema_containerÚ
schema_keyre   r™  rB   rÆ  Úhas_any_refsÚresolved_schemaÚresolved_stringÚhas_remaining_refss              r#   Ú_process_schema_with_validationz.V1FirecrawlApp._process_schema_with_validationS  sù  € õ Ð&­Ñ-Ô-ñ *	2°*Ð@PÐ2PÑ2PØ×-Ò-Ð.>¸zÔ.JÑKÔKˆFð ñ  �* V­TÑ2Ô2ð  Ø—z’z '¨2Ñ.Ô.�Ø���Ø * ¤
¨6Ñ 2Ô 2�à—J’J˜wÑ'Ô'ð 0Ø Ð-ð0à -Ð/ð ð  ð ðØ*.×*<Ò*<¸VÀTÑ*JÔ*J˜Ø*4¨$¬*°_Ñ*EÔ*E˜Ø-5¸Ð-HÐ-iÈJÐZiÐLiÐ*à1ð 4Ø%4˜Få)¨&µ$Ñ7Ô7ð 4¸GÀvÐ<MÐ<MØ$*¨7 Oøøå$ð ð ð à˜ðøøøð
Ø!%×!3Ò!3°F¸DÑ!AÔ!A˜Ý% f­dÑ3Ô3ð 0¸À6Ð8IÐ8IØ & w øøÝ$ð ð ð Ø˜ðøøøð ×6Ò6°vÑ>Ô>ˆFØ×3Ò3°FÑ;Ô;ð CÝ  Ô!AÑBÔBÐBà+1Ð˜ZÑ(ØÐs%   ÂAC( Ã(
C5Ã4C5Ã92D, Ä,
D9Ä8D9©NN)F©N©r:  r;  )Nr   )re   )^r+   r,   r-   r.   rÒ  r   r0   ra  r   r	   r   r„   r…   rW   r¾   r   r‡   r�   r‘   r•   r™   r�   r£   r¦   rª   rc   rÆ   r   rp  ri   r  r   r  r¥  r"  r©  r*  r¯  r0  r²  r[   rï   rÃ  rí   rÊ  rÛ  rõ   rá  ræ  rë  rþ   rð  r'   rÏ   r÷  rË   rü  rÿ  r  r  r  rO   r   r"  rM  r/  rG  r,  r-  rˆ  rº   rŒ  ÚResponserÆ  r£  rå  rÇ  r�  rS  r   rB  rm  rd  re  r‡  rŠ  r•  r¢  r¥  r¼  rÁ  rÉ  rÐ  rÙ  r1   r2   r#   rU  rU  ç  sˆ  € € € € € ðð ð$	qð  ðQð Q ¨¤ð Q¸xÈ¼}ð QÐX\ð Qð Qð Qð Qð, mqØ04Ø04Ø04Ø04Ø&*Ø%*Ø37Ø%)Ø48Ø37Ø(,ØOSØ(,Ø.2Ø37ð EIØIMØ%)Ø-1Ø26ð1U7ð U7ð U7àðU7ð ˜d 7ð  ,gô  $hô  iô  jð	U7ð
 ˜d 3¨ 8œnÔ-ðU7ð # 4¨¤9Ô-ðU7ð # 4¨¤9Ô-ðU7ð  (¨œ~ðU7ð ˜s”mðU7ð ˜c”]ðU7ð Ð/Ô0ðU7ð ˜T”NðU7ð $,¨D¤>ðU7ð #+¨4¤.ðU7ð   ”~ðU7ð  ˜GÐ$JÔKÔLð!U7ð"   ”~ð#U7ð$ ˜lÔ+ð%U7ð& # <Ô0ð'U7ð( ˜d 5¨Ð7IÈ=ÐZgÐivð  yGð  IWð  Yrð  tð  *ô  $@ô  Aô  Bð)U7ð* &.Ð.EÔ%Fð+U7ð, ˜c”]ð-U7ð. % TœNð/U7ð0 "*¨$¤ð1U7ð2 *¨#Ô.ð3U7ð U7ð U7ð U7ðv $(Ø!%Ø$(Ø"&Ø%)Ø&*Ø%*Ø8<ð]3ð ]3ð ]3àð]3ð ˜C”=ð	]3ð
 ˜#”ð]3ð ˜S”Mð]3ð ˜3”-ð]3ð ˜c”]ð]3ð ˜s”mð]3ð ˜c”]ð]3ð % _Ô5ð]3ð *ð]3ð ]3ð ]3ð ]3ð~=Ð"7ð =ð =ð =ð =ð,<Ð!5ð <ð <ð <ð <ð,Hð H°dð HÐGfð Hð Hð Hð Hð(Gð G°Tð GÐFdð Gð Gð Gð Gð0 .2Ø-1Ø#'Ø-1Ø#Ø/3Ø.2Ø/3Ø)-Ø48Ø9=Ø37Ø26Ø,0Ø#Ø+/Ø)-Ø.2Ø'(Ø)-ð/@<ð @<ð @<àð@<ð    S¤	Ô*ð	@<ð
    S¤	Ô*ð@<ð ˜C”=ð@<ð & cœ]ð@<ð ˜Œ}ð@<ð ' tœnð@<ð & dœ^ð@<ð ' tœnð@<ð ! œð@<ð ! Ô1ð@<ð ˜%  _Ð 4Ô5Ô6ð@<ð #+¨4¤.ð@<ð  "*¨$¤ð!@<ð" $ Dœ>ð#@<ð$ ˜Œ}ð%@<ð& # 4œ.ð'@<ð( " #œð)@<ð* & dœ^ð+@<ð,   ”}ð-@<ð. " #œð/@<ð2 
ð3@<ð @<ð @<ð @<ðL .2Ø-1Ø#'Ø-1Ø#Ø/3Ø.2Ø/3Ø)-Ø48Ø9=Ø37Ø26Ø,0Ø#Ø+/Ø)-Ø.2Ø)-ð-z<ð z<ð z<àðz<ð    S¤	Ô*ð	z<ð
    S¤	Ô*ðz<ð ˜C”=ðz<ð & cœ]ðz<ð ˜Œ}ðz<ð ' tœnðz<ð & dœ^ðz<ð ' tœnðz<ð ! œðz<ð ! Ô1ðz<ð ˜%  _Ð 4Ô5Ô6ðz<ð #+¨4¤.ðz<ð  "*¨$¤ð!z<ð" $ Dœ>ð#z<ð$ ˜Œ}ð%z<ð& # 4œ.ð'z<ð( " #œð)z<ð* & dœ^ð+z<ð, " #œð-z<ð0 
ð1z<ð z<ð z<ð z<ðxQ? Sð Q?Ð-Bð Q?ð Q?ð Q?ð Q?ðf? Sð ?Ð-Bð ?ð ?ð ?ð ?ð:=˜sð = t¨C°¨H¤~ð =ð =ð =ð =ð: 26Ø15Ø'+Ø15Ø#'Ø37Ø26Ø37Ø-1Ø8<Ø=AØ7;Ø6:Ø04Ø#'Ø/3Ø-1Ø26Ø-1ð-S9ð S9ð S9àðS9ð $ D¨¤IÔ.ð	S9ð
 $ D¨¤IÔ.ðS9ð   ”}ðS9ð "*¨#¤ðS9ð ˜C”=ðS9ð #+¨4¤.ðS9ð "*¨$¤ðS9ð #+¨4¤.ðS9ð % TœNðS9ð % _Ô5ðS9ð ˜e C¨Ð$8Ô9Ô:ðS9ð '/¨t¤nðS9ð  &.¨d¤^ð!S9ð"  (¨œ~ð#S9ð$ ˜C”=ð%S9ð& ' tœnð'S9ð( & cœ]ð)S9ð* "*¨$¤ð+S9ð, & cœ]ð-S9ð0 
ð1S9ð S9ð S9ð S9ðr %)Ø-1Ø15Ø+/Ø#'Ø%*Ø(,Ø37ð[0ð [0ð [0àð[0ð ˜S”Mð	[0ð
 % TœNð[0ð !)¨¤ð[0ð # 4œ.ð[0ð ˜C”=ð[0ð ˜c”]ð[0ð   ”~ð[0ð Ð/Ô0ð[0ð 'ð[0ð [0ð [0ð [0ðB W[Ø,0Ø,0Ø,0Ø,0Ø"&Ø!&Ø/3Ø!%Ø04Ø/3Ø$(ØKOØ*.Ø/3ð AEØ*.Ø'(Ø)-Ø.2Ø)-ð1KCð KCð KCà�3ŒiðKCð ˜$˜wð  (Qô   Rô  Sô  Tð	KCð
 ˜$˜s C˜xœ.Ô)ðKCð ˜t CœyÔ)ðKCð ˜t CœyÔ)ðKCð $ Dœ>ðKCð ˜3”-ðKCð ˜#”ðKCð Ð+Ô,ðKCð ˜”ðKCð  (¨œ~ðKCð ' tœnðKCð ˜D”>ðKCð  ˜Ð FÔGÔHð!KCð" ˜,Ô'ð#KCð$ ˜|Ô,ð%KCð& ˜$˜u \Ð3EÀ}ÐVcÐerð  uCð  ESð  Unð  p{ð  &{ô   |ô  }ô  ~ð'KCð( ˜Ô'ð)KCð*   ”}ð+KCð, " #œð-KCð. & dœ^ð/KCð0 " #œð1KCð4 
%ð5KCð KCð KCð KCðb W[Ø,0Ø,0Ø,0Ø,0Ø"&Ø!&Ø/3Ø!%Ø04Ø/3Ø$(ØKOØ*.Ø/3ð AEØ*.Ø)-Ø)-Ø.2ð/JCð JCð JCà�3ŒiðJCð ˜$˜wð  (Qô   Rô  Sô  Tð	JCð
 ˜$˜s C˜xœ.Ô)ðJCð ˜t CœyÔ)ðJCð ˜t CœyÔ)ðJCð $ Dœ>ðJCð ˜3”-ðJCð ˜#”ðJCð Ð+Ô,ðJCð ˜”ðJCð  (¨œ~ðJCð ' tœnðJCð ˜D”>ðJCð  ˜Ð FÔGÔHð!JCð" ˜,Ô'ð#JCð$ ˜|Ô,ð%JCð& ˜$˜u \Ð3EÀ}ÐVcÐerð  uCð  ESð  Unð  p{ð  &{ô   |ô  }ô  ~ð'JCð( ˜Ô'ð)JCð* " #œð+JCð, " #œð-JCð. & dœ^ð/JCð2 
ð3JCð JCð JCð JCð` W[Ø,0Ø,0Ø,0Ø,0Ø"&Ø!&Ø/3Ø!%Ø04Ø/3Ø$(ØKOØ*.Ø/3ð AEØ*.Ø)-Ø.2Ø)-ð/JCð JCð JCà�3ŒiðJCð ˜$˜wð  (Qô   Rô  Sô  Tð	JCð
 ˜$˜s C˜xœ.Ô)ðJCð ˜t CœyÔ)ðJCð ˜t CœyÔ)ðJCð $ Dœ>ðJCð ˜3”-ðJCð ˜#”ðJCð Ð+Ô,ðJCð ˜”ðJCð  (¨œ~ðJCð ' tœnðJCð ˜D”>ðJCð  ˜Ð FÔGÔHð!JCð" ˜,Ô'ð#JCð$ ˜|Ô,ð%JCð& ˜$˜u \Ð3EÀ}ÐVcÐerð  uCð  ESð  Unð  p{ð  &{ô   |ô  }ô  ~ð'JCð( ˜Ô'ð)JCð* " #œð+JCð, & dœ^ð-JCð. " #œð/JCð2 
ð3JCð JCð JCð JCðX<F¨Cð <FÐ4Oð <Fð <Fð <Fð <Fð|F¨Cð FÐ4Ið Fð Fð Fð Fð> )-ð~Pð %)Ø$(Ø+/Ø38Ø05Ø+0Ø.2ð~Pð ~Pð ~Pà˜4 œ9Ô%ð~Pð ˜S”Mð	~Pð
 ˜S”Mð~Pð $ Cœ=ð~Pð #+¨4¤.ð~Pð  (¨œ~ð~Pð # 4œ.ð~Pð ˜D  c œNÔ+ð~Pð +¨3Ô/ð~Pð ~Pð ~Pð ~Pð@%*¨ð %*Ð1BÀ3Ô1Gð %*ð %*ð %*ð %*ðR )-ðO*ð %)Ø$(Ø+/Ø38Ø05Ø+0Ø.2ðO*ð O*ð O*à˜4 œ9Ô%ðO*ð ˜S”Mð	O*ð
 ˜S”MðO*ð $ Cœ=ðO*ð #+¨4¤.ðO*ð  (¨œ~ðO*ð # 4œ.ðO*ð ˜D  c œNÔ+ðO*ð 8IÈÔ7MðO*ð O*ð O*ð O*ðj '+Ø-1Ø$(Ø26ðCð Cð CàðCð ˜s”mð	Cð
 % TœNðCð ˜D”>ðCð "*¨$¤ðCð <\ðCð Cð Cð CðR '+Ø-1Ø$(Ø26ð8
ð 8
ð 8
àð8
ð ˜s”mð	8
ð
 % TœNð8
ð ˜D”>ð8
ð "*¨$¤ð8
ð <Vð8
ð 8
ð 8
ð 8
ðt$}°#ð $}Ð:Zð $}ð $}ð $}ð $}ðP .2ð
ð 
à% cœ]ð
à6:¸3À¸8´nð
ð 
ð 
ð 
ð: Ø$'ðð àðð �s˜C�x”.ðð ˜#˜s˜(”^ð	ð
 ðð "ðð -5Ô,=ðð ð ð ðF Ø$'ðð àðð ˜#˜s˜(”^ðð ð	ð
 "ðð
 -5Ô,=ðð ð ð ðB Ø$'ðð àðð ˜#˜s˜(”^ðð ð	ð
 "ðð
 -5Ô,=ðð ð ð ð:2Jàð2Jð ˜#˜s˜(”^ð2Jð ð	2Jð $9ð	2Jð 2Jð 2Jð 2Jðh#HàÔ'ð#Hð ð#Hð !ð#Hð #Hð #Hð #HðJu¨cð u¸3ð uÈsð uÐcfð uÐknð uð uð uð uð< (,Ø(,Ø&*Ø-1Ø+/Ø:>ØFJØDHð^Xð ^Xð ^Xàð^Xð   ”}ð	^Xð
 ! œð^Xð ˜s”mð^Xð & cœ]ð^Xð $ Cœ=ð^Xð *2°$¬ð^Xð " (¨D°°c°¬NÐ+;¸TÐ+AÔ"BÔCð^Xð   ¨$¨s°C¨x¬.Ð)9¸4Ð)?Ô @ÔAð^Xð Njð^Xð ^Xð ^Xð ^XðH (,Ø(,Ø&*Ø-1Ø+/Ø:>ðEDð EDð EDàðEDð   ”}ð	EDð
 ! œðEDð ˜s”mðEDð & cœ]ðEDð $ Cœ=ðEDð *2°$¬ðEDð DHÈÈSÈÄ>ðEDð EDð EDð EDðN(D¨Sð (DÐ5Qð (Dð (Dð (Dð (DðT.l t¨C°¨H¤~ð .lÀCð .lÈDð .lð .lð .lð .lðfð ð ð$0ð 0ð 0ð 0ðdð ð ð&0ð 0ð 0ð 0ðdO(ð O(ð O(ðb41ð 41ð 41ðl$ð $ð $ð0Gð Gð Gð Gð$6 ð 6 ð 6 ð 6 ð 6 ð 6 r2   rU  c                   ó¬   — e Zd ZdZdedefd„Zdd„Zdd„Zd	ed
e	e
eef         gdf         ddfd„Zd	ede
eef         ddfd„Zde
eef         ddfd„ZdS )rç  aÓ  
    A class to watch and handle crawl job events via WebSocket connection.

    Attributes:
        id (str): The ID of the crawl job to watch
        app (V1FirecrawlApp): The V1FirecrawlApp instance
        data (List[Dict[str, Any]]): List of crawled documents/data
        status (str): Current status of the crawl job
        ws_url (str): WebSocket URL for the crawl job
        event_handlers (dict): Dictionary of event type to list of handler functions
    rÌ   Úappc                 óž   — || _         || _        g | _        d| _        |j                             dd¦  «        › d|› �| _        g g g dœ| _        d S )NrÑ   ÚhttpÚwsrÌ  )ÚdonerÉ   Údocument)rÌ   rß  rØ   rÓ   rW  ÚreplaceÚws_urlÚevent_handlers)r`  rÌ   rß  s      r#   ra  zV1CrawlWatcher.__init__˜  sc   € ØˆŒØˆŒØ*,ˆŒ	Ø ˆŒØœ×,Ò,¨V°TÑ:Ô:ÐJÐJÀbÐJÐJˆŒàØØð
ð 
ˆÔÐÐr2   rX  Nc              ƒ   óð   K  — t          j        | j        ddd| j        j        › �fg¬¦  «        4 ƒd{V —†	 }|                      |¦  «        ƒ d{V —† ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )zU
        Establishes WebSocket connection and starts listening for messages.
        Nrš  r›  )Úmax_sizeÚadditional_headers©Ú
websocketsÚconnectræ  rß  rV  Ú_listen©r`  Ú	websockets     r#   rí  zV1CrawlWatcher.connect¤  s(  è è € õ Ô%ØŒKØØ!0Ð2N¸D¼HÔ<LÐ2NÐ2NÐ OÐPð
ñ 
ô 
ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð Ø—,’,˜yÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ð	*ð 	*ð 	*ñ 	*ô 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*øøøð 	*ð 	*ð 	*ð 	*ð 	*ð 	*s   ¶A%Á%
A/Á2A/c              ƒ   ó~   K  — |2 3 d{V —†}t          j        |¦  «        }|                      |¦  «        ƒ d{V —† Œ76 dS )z‘
        Listens for incoming WebSocket messages and handles them.

        Args:
            websocket: The WebSocket connection object
        N©rB   ÚloadsÚ_handle_message©r`  rð  rY  Úmsgs       r#   rî  zV1CrawlWatcher._listen¯  óq   è è € ð 'ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,�'Ý”*˜WÑ%Ô%ˆCØ×&Ò& sÑ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ð '˜Y˜Yó   …<Ú
event_typeÚhandlerc                 ó\   — || j         v r"| j         |                              |¦  «         dS dS )zò
        Adds an event handler function for a specific event type.

        Args:
            event_type (str): Type of event to listen for ('done', 'error', or 'document')
            handler (Callable): Function to handle the event
        N)rç  Úappend)r`  rù  rú  s      r#   Úadd_event_listenerz!V1CrawlWatcher.add_event_listenerº  s<   € ð ˜Ô,Ð,Ð,ØÔ 
Ô+×2Ò2°7Ñ;Ô;Ð;Ð;Ð;ð -Ð,r2   Údetailc                 óR   — || j         v r| j         |         D ]} ||¦  «         ŒdS dS )zè
        Dispatches an event to all registered handlers for that event type.

        Args:
            event_type (str): Type of event to dispatch
            detail (Dict[str, Any]): Event details/data to pass to handlers
        N)rç  )r`  rù  rþ  rú  s       r#   Údispatch_eventzV1CrawlWatcher.dispatch_eventÅ  sJ   € ð ˜Ô,Ð,Ð,ØÔ.¨zÔ:ð  ð  �Ø�˜‘”��ð -Ð,ð ð  r2   rö  c              ƒ   ó®  K  — |d         dk    r2d| _         |                      d| j         | j        | j        dœ¦  «         dS |d         dk    r9d| _         |                      d| j         | j        |d         | j        dœ¦  «         dS |d         dk    rq|d	         d
         | _         | j                             |d	                              d	g ¦  «        ¦  «         | j        D ] }|                      d|| j        dœ¦  «         Œ!dS |d         dk    rF| j                             |d	         ¦  «         |                      d|d	         | j        dœ¦  «         dS dS )z‘
        Handles incoming WebSocket messages based on their type.

        Args:
            msg (Dict[str, Any]): The message to handle
        r‰   rã  r]   ©rÓ   rØ   rÌ   rÉ   r^   ©rÓ   rØ   rÉ   rÌ   ÚcatchuprØ   rÓ   rä  ©rØ   rÌ   N©rÓ   r   rØ   rÌ   rÓ  r�  rü  ©r`  rö  Údocs      r#   rô  zV1CrawlWatcher._handle_messageÑ  ó}  è è € ð ˆvŒ;˜&Ò Ð Ø%ˆDŒKØ×Ò °4´;ÈÌ	ÐY]ÔY`Ð(aÐ(aÑbÔbÐbÐbÐbØ�Œ[˜GÒ#Ð#Ø"ˆDŒKØ×Ò °D´KÈÌÐ]`ÐahÔ]iÐquÔqxÐ)yÐ)yÑzÔzÐzÐzÐzØ�Œ[˜IÒ%Ð%Ø˜fœ+ hÔ/ˆDŒKØŒI×Ò˜S œ[Ÿ_š_¨V°RÑ8Ô8Ñ9Ô9Ð9Ø”yð Nð N�Ø×#Ò# J¸ÀDÄGÐ0LÐ0LÑMÔMÐMÐMðNð Nà�Œ[˜JÒ&Ð&ØŒI×Ò˜S œ[Ñ)Ô)Ð)Ø×Ò 
°S¸´[ÈÌÐ,PÐ,PÑQÔQÐQÐQÐQð 'Ð&r2   ©rX  N)r+   r,   r-   r.   r0   rU  ra  rí  rî  r   r   r   rý  r   rô  r1   r2   r#   rç  rç  Œ  s  € € € € € ð
ð 
ð

˜3ð 

 ^ð 

ð 

ð 

ð 

ð	*ð 	*ð 	*ð 	*ð	,ð 	,ð 	,ð 	,ð	<¨Sð 	<¸8ÀTÈ#ÈsÈ(Ä^ÐDTÐVZÐDZÔ;[ð 	<Ð`dð 	<ð 	<ð 	<ð 	<ð
 ¨ð 
 °d¸3À¸8´nð 
 Èð 
 ð 
 ð 
 ð 
 ðR¨¨c°3¨h¬ð R¸Dð Rð Rð Rð Rð Rð Rr2   rç  c            0       ó†  ‡ — e Zd ZdZd„dedefˆ fd„Z	 	 	 d…d	ed
edeeef         deeeef                  de	de
deeef         fd„Z	 d†d
edeeef         deeef         de	de
deeef         fd„Z	 d†d
edeeef         de	de
deeef         f
d„Zdej        deddfd„Zde	dedededef
d„Zdefd„Zdefd„Z	 	 d‡d
edee         dee         ddfd„Z	 	 d‡d ee         dee         dee         ddfd!„Zddddddd"ddddddddddd#œd
ed$eeed%                           deeeef                  d&eee                  d'eee                  d(ee         d)ee	         d*ee	         d+ee         d,ee         d-ee         d.ee         d/ee         d0eed1                  d2ee         d3ee         d4ee         d5eeee e!e"e#e$e%e&e'e(f	                           de)e         f&d6„Z*ddddddd"ddddddddddd7dd8œd ee         d$eeed9                           deeeef                  d&eee                  d'eee                  d(ee         d)ee	         d*ee	         d+ee         d,ee         d-ee         d.ee         d/ee         d0eed1                  d3ee         d4ee         d5eeee e!e"e#e$e%e&e'e(f	                           d:ee+         d;ee	         dee         de,f*d<„Z-ddddddd"ddddddddddddd=œd ee         d$eeed9                           deeeef                  d&eee                  d'eee                  d(ee         d)ee	         d*ee	         d+ee         d,ee         d-ee         d.ee         d/ee         d0eed1                  d3ee         d4ee         d5eeee e!e"e#e$e%e&e'e(f	                           d:ee+         d>ee         dee         de.f*d?„Z/ddddddddddddddddd7dd@œd
edAeee                  dBeee                  dCee	         dDee	         dEee	         dFee         dGee         dHee         dIee         dJee0         dKeeee1f                  dLee         dMee         dNee         dOee	         dPee         d;ee	         dee         de2f(dQ„Z3ddddddddddddddddd7dd@œd
edAeee                  dBeee                  dCee	         dDee	         dEee	         dFee         dGee         dHee         dIee         dJee0         dKeeee1f                  dLee         dMee         dNee         dOee	         dPee         d;ee	         dee         de4f(dR„Z5dSede2fdT„Z6dˆdSedeeef         d;e	de2fdU„Z7dddddd"dddVœd
edWee         dIee         dXee         dYee         dEee	         d*ee	         d+ee         dee8         de9fdZ„Z:	 d‰dddd[d[d[dd\œd eee                  d]ee         d^ee         d_ee         dHee         d`ee         daee         d:eeeef                  de;e         fdb„Z<dSede,fdc„Z=dSede>fdd„Z?dSede>fde„Z@dSedeeef         fdf„ZAdgede;e         fdh„ZB	 d‰dddd[d[d[dd\œd eee                  d]ee         d^ee         d_ee         dHee         d`ee         daee         d:eeeef                  de;e         fdi„ZCddddjœd
edkee	         dlee         dmee         deDf
dn„ZEdddddoœd
edkee	         dlee         dpee         dmee         deFfdq„ZGdSedeDfdr„ZHdddddddddsœdtedCee	         duee	         dkee	         dvee         d_ee         dwee         dxeeIeeef         gdf                  dyeeIeeef         gdf                  deJfdz„ZKddddddd{œdtedCee	         duee	         dkee	         dvee         d_ee         dwee         deeef         fd|„ZLdSedeJfd}„ZMddddddd"ddd~œ	dtedEee	         dee         d€ee         d�ee         d‚ee         d+ee         d*ee	         dJee0         deeeeef         eNf                  deOfdƒ„ZPˆ xZQS )ŠÚAsyncV1FirecrawlAppz¦
    Asynchronous version of V1FirecrawlApp that implements async methods using aiohttp.
    Provides non-blocking alternatives to all V1FirecrawlApp operations.
    r\  rV  rW  c                 óN   •— t          ¦   «                              ||¬¦  «         d S )N)rV  rW  ©Úsuperra  )r`  rV  rW  Ú	__class__s      €r#   ra  zAsyncV1FirecrawlApp.__init__í  s&   ø€ å‰Œ×Ò °'ÐÑ:Ô:Ð:Ð:Ð:r2   Nr:  r;  ÚmethodrJ   r\   rØ   r<  r=  rX  c           	   ƒ   óì  K  — t          j        ¦   «         4 ƒd{V —†}t          |¦  «        D �]&}	 |                     ||||¬¦  «        4 ƒd{V —†	 }	|	j        dk    r3t          j        |d|z  z  ¦  «        ƒ d{V —† 	 ddd¦  «        ƒd{V —† Œc|	j        dk    r |                      |	d|› d�¦  «        ƒ d{V —† |	                     ¦   «         ƒ d{V —†cddd¦  «        ƒd{V —† c cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   Œà# t           j	        $ r6}
||dz
  k    r|
‚t          j        |d|z  z  ¦  «        ƒ d{V —† Y d}
~
�Œ d}
~
ww xY wt          d	¦  «        ‚# 1 ƒd{V —†swxY w Y   dS )
aˆ  
        Generic async request method with exponential backoff retry logic.

        Args:
            method (str): The HTTP method to use (e.g., "GET" or "POST").
            url (str): The URL to send the request to.
            headers (Dict[str, str]): Headers to include in the request.
            data (Optional[Dict[str, Any]]): The JSON data to include in the request body (only for POST requests).
            retries (int): Maximum number of retry attempts (default: 3).
            backoff_factor (float): Factor to calculate delay between retries (default: 0.5).
                Delay will be backoff_factor * (2 ** retry_count).

        Returns:
            Dict[str, Any]: The parsed JSON response from the server.

        Raises:
            aiohttp.ClientError: If the request fails after all retries.
            Exception: If max retries are exceeded or other errors occur.
        N)r  rJ   r\   rB   r?  r³  i,  zmake z requestr   zMax retries exceeded)ÚaiohttpÚClientSessionr@  ÚrequestrÓ   Úasyncior  r�  rB   ÚClientErrorr   )r`  r  rJ   r\   rØ   r<  r=  ÚsessionrA  r”  rÚ  s              r#   Ú_async_requestz"AsyncV1FirecrawlApp._async_requestñ  s5  è è € õ6 Ô(Ñ*Ô*ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4¨gÝ  ™>œ>ð Iñ I�ðIØ&ŸšØ%¨3¸Àdð  /ñ  ô  ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5à!Ø#œ?¨cÒ1Ð1Ý")¤-°À!ÀwÁ,Ñ0OÑ"PÔ"PÐPÐPÐPÐPÐPÐPÐPØ$ð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð $œ?¨cÒ1Ð1Ø"&×"4Ò"4°XÐ?WÀvÐ?WÐ?WÐ?WÑ"XÔ"XÐXÐXÐXÐXÐXÐXÐXØ%-§]¢]¡_¤_Ð4Ð4Ð4Ð4Ð4Ð4ð5ð 5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð	4ð 	4ð 	4ð 	4ñ 	4ô 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5ð 5øõ Ô*ð Ið Ið IØ '¨A¡+Ò-Ð-Ø˜Ý!œ-¨¸!¸w¹,Ñ(GÑHÔHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÐHÑHøøøøðIøøøõ Ð2Ñ3Ô3Ð3ð!	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4ð 	4øøøð 	4ð 	4ð 	4ð 	4ð 	4ð 	4sw   œE#°DÁ-C:Á=DÂE#ÂAC:ÃDÃ%E#Ã:
DÄDÄDÄDÄE#ÄEÄ+EÅE#ÅEÅE#Å#
E-Å0E-c              ƒ   óF   K  — |                       d|||||¦  «        ƒ d{V —†S )a  
        Make an async POST request with exponential backoff retry logic.

        Args:
            url (str): The URL to send the POST request to.
            data (Dict[str, Any]): The JSON data to include in the request body.
            headers (Dict[str, str]): Headers to include in the request.
            retries (int): Maximum number of retry attempts (default: 3).
            backoff_factor (float): Factor to calculate delay between retries (default: 0.5).
                Delay will be backoff_factor * (2 ** retry_count).

        Returns:
            Dict[str, Any]: The parsed JSON response from the server.

        Raises:
            aiohttp.ClientError: If the request fails after all retries.
            Exception: If max retries are exceeded or other errors occur.
        ÚPOSTN©r  )r`  rJ   rØ   r\   r<  r=  s         r#   Ú_async_post_requestz'AsyncV1FirecrawlApp._async_post_request  s8   è è € ð* ×(Ò(¨°°g¸tÀWÈnÑ]Ô]Ð]Ð]Ð]Ð]Ð]Ð]Ð]r2   c              ƒ   óF   K  — |                       d||d||¦  «        ƒ d{V —†S )aË  
        Make an async GET request with exponential backoff retry logic.

        Args:
            url (str): The URL to send the GET request to.
            headers (Dict[str, str]): Headers to include in the request.
            retries (int): Maximum number of retry attempts (default: 3).
            backoff_factor (float): Factor to calculate delay between retries (default: 0.5).
                Delay will be backoff_factor * (2 ** retry_count).

        Returns:
            Dict[str, Any]: The parsed JSON response from the server.

        Raises:
            aiohttp.ClientError: If the request fails after all retries.
            Exception: If max retries are exceeded or other errors occur.
        ÚGETNr  )r`  rJ   r\   r<  r=  s        r#   Ú_async_get_requestz&AsyncV1FirecrawlApp._async_get_request5  s8   è è € ð( ×(Ò(¨°°W¸dÀGÈ^Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ð\Ð\r2   r”  r}  c              ƒ   óF  K  — 	 |                      ¦   «         ƒ d{V —†}|                     dd¦  «        }|                     dd¦  «        }n!#  t          j        d|j        › �¦  «        ‚xY w|                      |j        |||¦  «        ƒ d{V —†}t          j        |¦  «        ‚)aR  
        Handle errors from async API responses with detailed error messages.

        Args:
            response (aiohttp.ClientResponse): The response object from the failed request
            action (str): Description of the action that was being attempted

        Raises:
            aiohttp.ClientError: With a detailed error message based on the response status:
                - 402: Payment Required
                - 408: Request Timeout
                - 409: Conflict
                - 500: Internal Server Error
                - Other: Unexpected error with status code
        NrÉ   rP  rQ  rR  ú?Failed to parse Firecrawl error response as JSON. Status code: )rB   r�  r  r  rÓ   Ú_get_async_error_message©r`  r”  r}  Ú
error_datarV  rW  rY  s          r#   r�  z!AsyncV1FirecrawlApp._handle_errorK  s¼   è è € ð 	{Ø'Ÿ}š}™œÐ.Ð.Ð.Ð.Ð.Ð.ˆJØ&ŸNšN¨7Ð4PÑQÔQˆMØ&ŸNšN¨9Ð6]Ñ^Ô^ˆMˆMøð	{ÝÔ%Ð&yÐhpÔhwÐ&yÐ&yÑzÔzÐzøøøà×5Ò5°h´oÀvÈ}Ð^kÑlÔlÐlÐlÐlÐlÐlÐlˆåÔ! 'Ñ*Ô*Ð*ó   „AA ÁA)rŽ  rV  rW  c              ƒ   ó6   K  — |                       ||||¦  «        S ©aó  
        Generate a standardized error message based on HTTP status code for async operations.
        
        Args:
            status_code (int): The HTTP status code from the response
            action (str): Description of the action that was being performed
            error_message (str): The error message from the API response
            error_details (str): Additional error details from the API response
            
        Returns:
            str: A formatted error message
        ©rS  r[  s        r#   r#  z,AsyncV1FirecrawlApp._get_async_error_messagef  ó"   è è € ð ×&Ò& {°F¸MÈ=ÑYÔYÐYr2   c              ƒ   óŽ   K  — |                       ¦   «         }|                      | j        › d�|¦  «        ƒ d{V —†}t          di |¤ŽS )z8Get current credit usage and billing period (v1, async).r¢  Nr1   )rˆ  r   rW  r  ©r`  r\   Úresps      r#   r¥  z$AsyncV1FirecrawlApp.get_credit_usageu  sq   è è € à×'Ò'Ñ)Ô)ˆØ×,Ò,ØŒ|Ð2Ð2Ð2Øñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆõ %Ð,Ð, tÐ,Ð,Ð,r2   c              ƒ   óŽ   K  — |                       ¦   «         }|                      | j        › d�|¦  «        ƒ d{V —†}t          di |¤ŽS )z7Get current token usage and billing period (v1, async).r¨  Nr1   )rˆ  r   rW  r"  r,  s      r#   r©  z#AsyncV1FirecrawlApp.get_token_usage~  sq   è è € à×'Ò'Ñ)Ô)ˆØ×,Ò,ØŒ|Ð1Ð1Ð1Øñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆõ $Ð+Ð+ dÐ+Ð+Ð+r2   r.  rÁ  ÚAsyncV1CrawlWatcherc              ƒ   ó¼   K  — |                       |||¦  «        ƒ d{V —†}|                     d¦  «        rd|v rt          |d         | ¦  «        S t          d¦  «        ‚)a‘  
        Initiate an async crawl job and return an AsyncV1CrawlWatcher to monitor progress via WebSocket.

        Args:
          url (str): Target URL to start crawling from
          params (Optional[V1CrawlParams]): See V1CrawlParams model for configuration:
            URL Discovery:
            * includePaths - Patterns of URLs to include
            * excludePaths - Patterns of URLs to exclude
            * maxDepth - Maximum crawl depth
            * maxDiscoveryDepth - Maximum depth for finding new URLs
            * limit - Maximum pages to crawl

            Link Following:
            * allowBackwardLinks - DEPRECATED: Use crawlEntireDomain instead
            * crawlEntireDomain - Follow parent directory links
            * allowExternalLinks - Follow external domain links  
            * ignoreSitemap - Skip sitemap.xml processing

            Advanced:
            * scrapeOptions - Page scraping configuration
            * webhook - Notification webhook settings
            * deduplicateSimilarURLs - Remove similar URLs
            * ignoreQueryParameters - Ignore URL parameters
            * regexOnFullURL - Apply regex to full URLs
          idempotency_key (Optional[str]): Unique key to prevent duplicate requests

        Returns:
          AsyncV1CrawlWatcher: An instance to monitor the crawl job via WebSocket

        Raises:
          Exception: If crawl job fails to start
        NrÇ   rÌ   ré  )rÊ  r�  r/  r   )r`  rJ   r.  rÁ  rê  s        r#   rë  z'AsyncV1FirecrawlApp.crawl_url_and_watch‡  sv   è è € ðL  $×3Ò3°C¸ÀÑQÔQÐQÐQÐQÐQÐQÐQˆØ×Ò˜iÑ(Ô(ð 	9¨T°^Ð-CÐ-CÝ& ~°dÔ';¸TÑBÔBÐBåÐ7Ñ8Ô8Ð8r2   rô  c              ƒ   ó¼   K  — |                       |||¦  «        ƒ d{V —†}|                     d¦  «        rd|v rt          |d         | ¦  «        S t          d¦  «        ‚)a´  
        Initiate an async batch scrape job and return an AsyncV1CrawlWatcher to monitor progress.

        Args:
            urls (List[str]): List of URLs to scrape
            params (Optional[V1ScrapeParams]): See V1ScrapeParams model for configuration:

              Content Options:
              * formats - Content formats to retrieve
              * includeTags - HTML tags to include
              * excludeTags - HTML tags to exclude
              * onlyMainContent - Extract main content only
              
              Request Options:
              * headers - Custom HTTP headers
              * timeout - Request timeout (ms)
              * mobile - Use mobile user agent
              * proxy - Proxy type
              
              Extraction Options:
              * extract - Content extraction config
              * jsonOptions - JSON extraction config
              * actions - Actions to perform
            idempotency_key (Optional[str]): Unique key to prevent duplicate requests

        Returns:
            AsyncV1CrawlWatcher: An instance to monitor the batch scrape job via WebSocket

        Raises:
            Exception: If batch scrape job fails to start
        NrÇ   rÌ   r  )rü  r�  r/  r   )r`  rô  r.  rÁ  Úbatch_responses        r#   rÿ  z/AsyncV1FirecrawlApp.batch_scrape_urls_and_watch³  sw   è è € ðH  $×;Ò;¸DÀ&È/ÑZÔZÐZÐZÐZÐZÐZÐZˆØ×Ò˜iÑ(Ô(ð 	@¨T°^Ð-CÐ-CÝ& ~°dÔ';¸TÑBÔBÐBåÐ>Ñ?Ô?Ð?r2   rs   )rn   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   ri  rO   rj  rR   rn   rk   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   rz   ri  rO   rj  rR   c             ‹   óÈ  K  — |                       |d¦  «         |                      ¦   «         }|dt          › �dœ}|r||d<   |r||d<   |r||d<   |r||d<   |�||d	<   |r||d
<   |r||d<   |	r|	                     dd¬¦  «        |d<   |
�|
|d<   |�||d<   |�||d<   |�||d<   |r||d<   |�||d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     dd¬¦  «        |d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     dd¬¦  «        |d<   |rd„ |D ¦   «         |d<   d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   d}|                      | j        › |› �||¦  «        ƒ d{V —†}|                     d¦  «        rd|v rt          di |d         ¤ŽS d|v rt          d|d         › �¦  «        ‚|                     dt          |¦  «        ¦  «        }t          d|› �¦  «        ‚) aA  
        Scrape a single URL asynchronously.

        Args:
          url (str): Target URL to scrape
          formats (Optional[List[Literal["markdown", "html", "rawHtml", "content", "links", "screenshot", "screenshot@fullPage", "extract", "json"]]]): Content types to retrieve (markdown/html/etc)
          headers (Optional[Dict[str, str]]): Custom HTTP headers
          include_tags (Optional[List[str]]): HTML tags to include
          exclude_tags (Optional[List[str]]): HTML tags to exclude
          only_main_content (Optional[bool]): Extract main content only
          wait_for (Optional[int]): Wait for a specific element to appear
          timeout (Optional[int]): Request timeout (ms)
          location (Optional[V1LocationConfig]): Location configuration
          mobile (Optional[bool]): Use mobile user agent
          skip_tls_verification (Optional[bool]): Skip TLS verification
          remove_base64_images (Optional[bool]): Remove base64 images
          block_ads (Optional[bool]): Block ads
          proxy (Optional[Literal["basic", "stealth", "auto"]]): Proxy type (basic/stealth)
          extract (Optional[V1JsonConfig]): Content extraction settings
          json_options (Optional[V1JsonConfig]): JSON extraction settings
          actions (Optional[List[Union[V1WaitAction, V1ScreenshotAction, V1ClickAction, V1WriteAction, V1PressAction, V1ScrollAction, V1ScrapeAction, V1ExecuteJavascriptAction, V1PDFAction]]]): Actions to perform
          **kwargs: Additional parameters to pass to the API

        Returns:
            V1ScrapeResponse with:
            * success - Whether scrape was successful
            * markdown - Markdown content if requested
            * html - HTML content if requested
            * rawHtml - Raw HTML content if requested
            * links - Extracted links if requested
            * screenshot - Screenshot if requested
            * extract - Extracted data if requested
            * json - JSON data if requested
            * error - Error message if scrape failed

        Raises:
            Exception: If scraping fails
        rp  rq  rr  rn   r\   ro   rp   Nrq   rr   rt   Trs  ru   rv   rw   rx   ry   r   rƒ   re   rO   rÃ   c                 ój   — g | ]0}t          |t          ¦  «        r|n|                     d d ¬¦  «        ‘Œ1S rw  rx  r{  s     r#   r~  z2AsyncV1FirecrawlApp.scrape_url.<locals>.<listcomp>L  r  r2   rR   r�  rÇ   rØ   rÉ   r…  r1   )r‡  rˆ  r‰  rz  rŠ  ry  r  rW  r�  rÆ   r   r0   )r`  rJ   rn   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   ri  rO   rj  rR   r‘  r’  r“  rÕ  r”  Úerror_contents                            r#   rp  zAsyncV1FirecrawlApp.scrape_urlÝ  s%  è è € ðz 	×Ò˜f lÑ3Ô3Ð3à×(Ò(Ñ*Ô*ˆð Ø-¥GÐ-Ð-ð
ð 
ˆð ð 	/Ø'.ˆM˜)Ñ$Øð 	/Ø'.ˆM˜)Ñ$Øð 	8Ø+7ˆM˜-Ñ(Øð 	8Ø+7ˆM˜-Ñ(ØÐ(Ø/@ˆMÐ+Ñ,Øð 	0Ø'/ˆM˜)Ñ$Øð 	/Ø'.ˆM˜)Ñ$Øð 	XØ(0¯ª¸tÐRV¨Ñ(WÔ(WˆM˜*Ñ%ØÐØ&,ˆM˜(Ñ#Ø Ð,Ø3HˆMÐ/Ñ0ØÐ+Ø2FˆMÐ.Ñ/ØÐ Ø(1ˆM˜*Ñ%Øð 	+Ø%*ˆM˜'Ñ"ØÐ Ø(1ˆM˜*Ñ%ØÐØ×.Ò.¨wÑ7Ô7ˆGÝ˜'¥4Ñ(Ô(ð P¨X¸Ð-@Ð-@Ø$(×$<Ò$<¸WÀXÔ=NÑ$OÔ$O�˜Ñ!Ý2<¸WÅdÑ2KÔ2KÐ' w wÐQX×Q]ÒQ]ÐgkÐz~ÐQ]ÑQÔQˆM˜)Ñ$ØÐ#Ø×3Ò3°LÑAÔAˆLÝ˜,­Ñ-Ô-ð Z°(¸lÐ2JÐ2JØ)-×)AÒ)AÀ,ÈxÔBXÑ)YÔ)Y�˜XÑ&Ý;EÀlÕTXÑ;YÔ;Yð  ,S¨<¨<Ð_k×_pÒ_pÐz~ð  NRÐ_pñ  `Sô  `SˆM˜-Ñ(Øð 	Uð (Uð  (Uð  MTð  (Uñ  (Uô  (UˆM˜)Ñ$Ø˜Ð%Ð%¨-¸	Ô*BÐ%ÀxÐS`ÐajÔSkÐGkÐGkØ15×1IÒ1IÈ-ÐXaÔJbÐckÔJlÑ1mÔ1mˆM˜)Ô$ XÑ.Ø˜MÐ)Ð)¨m¸MÔ.JÐ)ÈxÐ[hÐivÔ[wÐOwÐOwØ59×5MÒ5MÈmÐ\iÔNjÐksÔNtÑ5uÔ5uˆM˜-Ô(¨Ñ2ð !ˆØ×1Ò1ØŒ|Ð'˜XÐ'Ð'ØØñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð �<Š<˜	Ñ"Ô"ð 	M v°Ð'9Ð'9Ý#Ð7Ð7 h¨vÔ&6Ð7Ð7Ð7Ø˜Ð Ð ÝÐO¸HÀWÔ<MÐOÐOÑPÔPÐPð %ŸLšL¨µ#°h±-´-Ñ@Ô@ˆMÝÐK¸MÐKÐKÑLÔLÐLr2   r³  )rn   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   rO   rj  rR   rÀ   rÀ  rÁ  rõ  rÀ   rÀ  c             ‹   ó^  K  — |                       |d¦  «         i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d	<   |	�|	                     d
d
¬¦  «        |d<   |
�|
|d<   |�||d<   |�||d<   |�||d<   |�||d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     d
d
¬¦  «        |d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     d
d
¬¦  «        |d<   |�d„ |D ¦   «         |d<   |�|                     d
d
¬¦  «        |d<   |                     |¦  «         t          d i |¤Ž}|                     d
d
¬¦  «        }||d<   dt          › �|d<   d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   |                      |¦  «        }|                      | j	        › d�||¦  «        ƒ d{V —†}| 
                    d¦  «        rH	 | 
                    d¦  «        }n#  t          d¦  «        ‚xY w|                      |||¦  «        ƒ d{V —†S |                      |d¦  «         dS )!aÿ  
        Asynchronously scrape multiple URLs and monitor until completion.

        Args:
            urls (List[str]): URLs to scrape
            formats (Optional[List[Literal]]): Content formats to retrieve
            headers (Optional[Dict[str, str]]): Custom HTTP headers
            include_tags (Optional[List[str]]): HTML tags to include
            exclude_tags (Optional[List[str]]): HTML tags to exclude
            only_main_content (Optional[bool]): Extract main content only
            wait_for (Optional[int]): Wait time in milliseconds
            timeout (Optional[int]): Request timeout in milliseconds
            location (Optional[LocationConfig]): Location configuration
            mobile (Optional[bool]): Use mobile user agent
            skip_tls_verification (Optional[bool]): Skip TLS verification
            remove_base64_images (Optional[bool]): Remove base64 encoded images
            block_ads (Optional[bool]): Block advertisements
            proxy (Optional[Literal]): Proxy type to use
            extract (Optional[JsonConfig]): Content extraction config
            json_options (Optional[JsonConfig]): JSON extraction config
            actions (Optional[List[Union]]): Actions to perform
            agent (Optional[AgentOptions]): Agent configuration
            poll_interval (Optional[int]): Seconds between status checks (default: 2)
            idempotency_key (Optional[str]): Unique key to prevent duplicate requests
            **kwargs: Additional parameters to pass to the API

        Returns:
            V1BatchScrapeStatusResponse with:
            * Scraping status and progress
            * Scraped content for each URL
            * Success/error information

        Raises:
            Exception: If batch scrape fails
        r÷  Nrn   r\   ro   rp   rq   rr   rt   Trs  ru   rv   rw   rx   ry   r   re   rO   rÃ   c                 ó<   — g | ]}|                      d d ¬¦  «        ‘ŒS rw  )rz  r{  s     r#   r~  z9AsyncV1FirecrawlApp.batch_scrape_urls.<locals>.<listcomp>Ê  s*   € Ð'lÐ'lÐ'lÐZ`¨¯ª¸TÐPT¨Ñ(UÔ(UÐ'lÐ'lÐ'lr2   rR   rÀ   rô  rq  r  rù  rÇ   rÌ   r†  rú  r1   )r‡  rz  rŠ  ry  r‹  rÂ   r‰  rˆ  r  rW  r�  r   Ú_async_monitor_job_statusr�  )r`  rô  rn   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   rO   rj  rR   rÀ   rÀ  rÁ  r‘  r“  rŸ  r   r”  rÌ   s                              r#   r÷  z%AsyncV1FirecrawlApp.batch_scrape_urlsc  sN  è è € ðz 	×Ò˜fÐ&9Ñ:Ô:Ð:àˆð ÐØ'.ˆM˜)Ñ$ØÐØ'.ˆM˜)Ñ$ØÐ#Ø+7ˆM˜-Ñ(ØÐ#Ø+7ˆM˜-Ñ(ØÐ(Ø/@ˆMÐ+Ñ,ØÐØ'/ˆM˜)Ñ$ØÐØ'.ˆM˜)Ñ$ØÐØ(0¯ª¸tÐRV¨Ñ(WÔ(WˆM˜*Ñ%ØÐØ&,ˆM˜(Ñ#Ø Ð,Ø3HˆMÐ/Ñ0ØÐ+Ø2FˆMÐ.Ñ/ØÐ Ø(1ˆM˜*Ñ%ØÐØ%*ˆM˜'Ñ"ØÐØ×.Ò.¨wÑ7Ô7ˆGÝ˜'¥4Ñ(Ô(ð P¨X¸Ð-@Ð-@Ø$(×$<Ò$<¸WÀXÔ=NÑ$OÔ$O�˜Ñ!Ý2<¸WÅdÑ2KÔ2KÐ' w wÐQX×Q]ÒQ]ÐgkÐz~ÐQ]ÑQÔQˆM˜)Ñ$ØÐ#Ø×3Ò3°LÑAÔAˆLÝ˜,­Ñ-Ô-ð Z°(¸lÐ2JÐ2JØ)-×)AÒ)AÀ,ÈxÔBXÑ)YÔ)Y�˜XÑ&Ý;EÀlÕTXÑ;YÔ;Yð  ,S¨<¨<Ð_k×_pÒ_pÐz~ð  NRÐ_pñ  `Sô  `SˆM˜-Ñ(ØÐØ'lÐ'lÐdkÐ'lÑ'lÔ'lˆM˜)Ñ$ØÐØ%*§Z¢Z¸ÈD ZÑ%QÔ%QˆM˜'Ñ"ð 	×Ò˜VÑ$Ô$Ð$õ &Ð6Ð6¨Ð6Ð6ˆØ"×'Ò'°ÀDÐ'ÑIÔIˆØ"ˆ�FÑØ 7­gÐ 7Ð 7ˆ�HÑà˜Ð#Ð#¨°IÔ(>Ð#À8È{Ð[dÔOeÐCeÐCeØ/3×/GÒ/GÈÐT]ÔH^Ð_gÔHhÑ/iÔ/iˆK˜	Ô" 8Ñ,Ø˜KÐ'Ð'¨K¸Ô,FÐ'È8ÐWbÐcpÔWqÐKqÐKqØ37×3KÒ3KÈKÐXeÔLfÐgoÔLpÑ3qÔ3qˆK˜Ô& xÑ0ð ×'Ò'¨Ñ8Ô8ˆØ×1Ò1ØŒ|Ð-Ð-Ð-ØØñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð �<Š<˜	Ñ"Ô"ð 	CðPØ—\’\ $Ñ'Ô'��øðPÝÐ NÑOÔOÐOøøøØ×7Ò7¸¸GÀ]ÑSÔSÐSÐSÐSÐSÐSÐSÐSà×Ò˜xÐ)AÑBÔBÐBÐBÐBs   ËK& Ë&K7)rn   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   rO   rj  rR   rÀ   rn  rÁ  rn  c             ‹   óV  K  — |                       |d¦  «         i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d	<   |	�|	                     d
d
¬¦  «        |d<   |
�|
|d<   |�||d<   |�||d<   |�||d<   |�||d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     d
d
¬¦  «        |d<   |�}|                      |¦  «        }t          |t          ¦  «        r"d|v r|                      |d         ¦  «        |d<   t          |t          ¦  «        r|n|                     d
d
¬¦  «        |d<   |rd„ |D ¦   «         |d<   |�|                     d
d
¬¦  «        |d<   |�||d<   |                     |¦  «         t          d!i |¤Ž}|                     d
d
¬¦  «        }||d<   dt          › �|d<   d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   d|v r<|d         r4d|d         v r*|                      |d         d         ¦  «        |d         d<   |                      |¦  «        }|                      | j	        › d�||¦  «        ƒ d{V —†}| 
                    d¦  «        dk    r3	 t          d!i |                     ¦   «         ¤ŽS #  t          d¦  «        ‚xY w|                      |d ¦  «        ƒ d{V —† dS )"a,  
        Initiate a batch scrape job asynchronously.

        Args:
            urls (List[str]): URLs to scrape
            formats (Optional[List[Literal]]): Content formats to retrieve
            headers (Optional[Dict[str, str]]): Custom HTTP headers
            include_tags (Optional[List[str]]): HTML tags to include
            exclude_tags (Optional[List[str]]): HTML tags to exclude
            only_main_content (Optional[bool]): Extract main content only
            wait_for (Optional[int]): Wait time in milliseconds
            timeout (Optional[int]): Request timeout in milliseconds
            location (Optional[LocationConfig]): Location configuration
            mobile (Optional[bool]): Use mobile user agent
            skip_tls_verification (Optional[bool]): Skip TLS verification
            remove_base64_images (Optional[bool]): Remove base64 encoded images
            block_ads (Optional[bool]): Block advertisements
            proxy (Optional[Literal]): Proxy type to use
            extract (Optional[JsonConfig]): Content extraction config
            json_options (Optional[JsonConfig]): JSON extraction config
            actions (Optional[List[Union]]): Actions to perform
            agent (Optional[AgentOptions]): Agent configuration
            zero_data_retention (Optional[bool]): Whether to delete data after 24 hours
            idempotency_key (Optional[str]): Unique key to prevent duplicate requests
            **kwargs: Additional parameters to pass to the API

        Returns:
            V1BatchScrapeResponse with:
            * success - Whether job started successfully
            * id - Unique identifier for the job
            * url - Status check URL
            * error - Error message if start failed

        Raises:
            Exception: If job initiation fails
        rü  Nrn   r\   ro   rp   rq   rr   rt   Trs  ru   rv   rw   rx   ry   r   re   rO   rÃ   c                 ój   — g | ]0}t          |t          ¦  «        r|n|                     d d ¬¦  «        ‘Œ1S rw  rx  r{  s     r#   r~  z?AsyncV1FirecrawlApp.async_batch_scrape_urls.<locals>.<listcomp>V  r  r2   rR   rÀ   r€  rô  rq  r  rù  rŽ  r„  r†  rú  r1   )r‡  rz  rŠ  ry  r‹  rÂ   r‰  rˆ  r  rW  r�  rË   rB   r   r�  )r`  rô  rn   r\   rb  rc  rd  re  rt   ru   rv   rf  rg  rh  r   rO   rj  rR   rÀ   rn  rÁ  r‘  r“  rŸ  r   r”  s                             r#   rü  z+AsyncV1FirecrawlApp.async_batch_scrape_urlsî  sh  è è € ð| 	×Ò˜fÐ&?Ñ@Ô@Ð@àˆð ÐØ'.ˆM˜)Ñ$ØÐØ'.ˆM˜)Ñ$ØÐ#Ø+7ˆM˜-Ñ(ØÐ#Ø+7ˆM˜-Ñ(ØÐ(Ø/@ˆMÐ+Ñ,ØÐØ'/ˆM˜)Ñ$ØÐØ'.ˆM˜)Ñ$ØÐØ(0¯ª¸tÐRV¨Ñ(WÔ(WˆM˜*Ñ%ØÐØ&,ˆM˜(Ñ#Ø Ð,Ø3HˆMÐ/Ñ0ØÐ+Ø2FˆMÐ.Ñ/ØÐ Ø(1ˆM˜*Ñ%ØÐØ%*ˆM˜'Ñ"ØÐØ×.Ò.¨wÑ7Ô7ˆGÝ˜'¥4Ñ(Ô(ð P¨X¸Ð-@Ð-@Ø$(×$<Ò$<¸WÀXÔ=NÑ$OÔ$O�˜Ñ!Ý2<¸WÅdÑ2KÔ2KÐ' w wÐQX×Q]ÒQ]ÐgkÐz~ÐQ]ÑQÔQˆM˜)Ñ$ØÐ#Ø×3Ò3°LÑAÔAˆLÝ˜,­Ñ-Ô-ð Z°(¸lÐ2JÐ2JØ)-×)AÒ)AÀ,ÈxÔBXÑ)YÔ)Y�˜XÑ&Ý;EÀlÕTXÑ;YÔ;Yð  ,S¨<¨<Ð_k×_pÒ_pÐz~ð  NRÐ_pñ  `Sô  `SˆM˜-Ñ(Øð 	Uð (Uð  (Uð  MTð  (Uñ  (Uô  (UˆM˜)Ñ$ØÐØ%*§Z¢Z¸ÈD ZÑ%QÔ%QˆM˜'Ñ"ØÐ*Ø1DˆMÐ-Ñ.ð 	×Ò˜VÑ$Ô$Ð$õ &Ð6Ð6¨Ð6Ð6ˆØ"×'Ò'°ÀDÐ'ÑIÔIˆØ"ˆ�FÑØ 7­gÐ 7Ð 7ˆ�HÑà˜Ð#Ð#¨°IÔ(>Ð#À8È{Ð[dÔOeÐCeÐCeØ/3×/GÒ/GÈÐT]ÔH^Ð_gÔHhÑ/iÔ/iˆK˜	Ô" 8Ñ,Ø˜KÐ'Ð'¨K¸Ô,FÐ'È8ÐWbÐcpÔWqÐKqÐKqØ37×3KÒ3KÈKÐXeÔLfÐgoÔLpÑ3qÔ3qˆK˜Ô& xÑ0ð ×'Ò'¨Ñ8Ô8ˆØ×1Ò1ØŒ|Ð-Ð-Ð-ØØñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð �<Š<˜Ñ&Ô&¨#Ò-Ð-ðPÝ,Ð?Ð?¨x¯}ª}©¬Ð?Ð?Ð?øðPÝÐ NÑOÔOÐOøøøà×$Ò$ XÐ/GÑHÔHÐHÐHÐHÐHÐHÐHÐHÐHÐHs   ËK9 Ë9L
)r´  rµ  r¶  r·  rà   r¸  r¹  rQ  rº  r–  rÄ   r»  r¼  r½  ré   r¾  rÀ  rÁ  r´  rµ  r¶  r·  rà   r¸  r¹  rQ  rº  r–  rÄ   r»  r¼  r½  ré   r¾  c             ‹   ó@  K  — |                       |d¦  «         i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   n|�||d	<   |	�|	|d
<   |
�|
|d<   |�|                     dd¬¦  «        |d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |                     |¦  «         t          di |¤Ž}|                     dd¬¦  «        }||d<   dt          › �|d<   |                      |¦  «        }|                      | j        › d�||¦  «        ƒ d{V —†}|                     d¦  «        rH	 |                     d¦  «        }n#  t          d¦  «        ‚xY w|  
                    |||¦  «        ƒ d{V —†S |                      |d¦  «        ƒ d{V —† dS )a  
        Crawl a website starting from a URL.

        Args:
            url (str): Target URL to start crawling from
            include_paths (Optional[List[str]]): Patterns of URLs to include
            exclude_paths (Optional[List[str]]): Patterns of URLs to exclude
            max_depth (Optional[int]): Maximum crawl depth
            max_discovery_depth (Optional[int]): Maximum depth for finding new URLs
            limit (Optional[int]): Maximum pages to crawl
            allow_backward_links (Optional[bool]): DEPRECATED: Use crawl_entire_domain instead
            crawl_entire_domain (Optional[bool]): Follow parent directory links
            allow_external_links (Optional[bool]): Follow external domain links
            ignore_sitemap (Optional[bool]): Skip sitemap.xml processing
            scrape_options (Optional[V1ScrapeOptions]): Page scraping configuration
            webhook (Optional[Union[str, V1WebhookConfig]]): Notification webhook settings
            deduplicate_similar_urls (Optional[bool]): Remove similar URLs
            ignore_query_parameters (Optional[bool]): Ignore URL parameters
            regex_on_full_url (Optional[bool]): Apply regex to full URLs
            delay (Optional[int]): Delay in seconds between scrapes
            allow_subdomains (Optional[bool]): Follow subdomains
            poll_interval (Optional[int]): Seconds between status checks (default: 2)
            idempotency_key (Optional[str]): Unique key to prevent duplicate requests
            **kwargs: Additional parameters to pass to the API

        Returns:
            V1CrawlStatusResponse with:
            * Crawling status and progress
            * Crawled page contents
            * Success/error information

        Raises:
            Exception: If crawl fails
        rÃ  NrÜ   rÝ   rÞ   rß   rà   râ   rá   rã   rä   Trs  rå   rÄ   ræ   rç   rè   ré   rë   rJ   rq  r  rÄ  rÇ   rÌ   r†  rÅ  r1   )r‡  rz  r‹  rÛ   r‰  rˆ  r  rW  r�  r   r8  r�  )r`  rJ   r´  rµ  r¶  r·  rà   r¸  r¹  rQ  rº  r–  rÄ   r»  r¼  r½  ré   r¾  rÀ  rÁ  r‘  rÈ  rŸ  r   r\   r”  rÌ   s                              r#   rÃ  zAsyncV1FirecrawlApp.crawl_urlz  sž  è è € ðv 	×Ò˜f kÑ2Ô2Ð2àˆð Ð$Ø+8ˆL˜Ñ(ØÐ$Ø+8ˆL˜Ñ(ØÐ Ø'0ˆL˜Ñ$ØÐ*Ø0CˆLÐ,Ñ-ØÐØ$)ˆL˜Ñ!ØÐ*Ø0CˆLÐ,Ñ-Ð-Ø!Ð-Ø1EˆLÐ-Ñ.ØÐ+Ø1EˆLÐ-Ñ.ØÐ%Ø,:ˆL˜Ñ)ØÐ%Ø,:×,?Ò,?ÈÐ\`Ð,?Ñ,aÔ,aˆL˜Ñ)ØÐØ&-ˆL˜Ñ#Ø#Ð/Ø5MˆLÐ1Ñ2Ø"Ð.Ø4KˆLÐ0Ñ1ØÐ(Ø->ˆLÐ)Ñ*ØÐØ$)ˆL˜Ñ!ØÐ'Ø.>ˆLÐ*Ñ+ð 	×Ò˜FÑ#Ô#Ð#õ %Ð4Ð4 |Ð4Ð4ˆØ"×'Ò'°ÀDÐ'ÑIÔIˆØ ˆ�EÑØ 7­gÐ 7Ð 7ˆ�HÑà×'Ò'¨Ñ8Ô8ˆØ×1Ò1ØŒ\Ð
$Ð
$Ð
$ k°7ñ<ô <ð <ð <ð <ð <ð <ð <ˆð �<Š<˜	Ñ"Ô"ð 	BðPØ—\’\ $Ñ'Ô'��øðPÝÐ NÑOÔOÐOøøøØ×7Ò7¸¸GÀ]ÑSÔSÐSÐSÐSÐSÐSÐSÐSà×$Ò$ XÐ/@ÑAÔAÐAÐAÐAÐAÐAÐAÐAÐAÐAs   Ä;E ÅE"c             ‹   óÆ  K  — i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   n|�||d<   |	�|	|d	<   |
�|
|d
<   |�|                      dd¬¦  «        |d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |                     |¦  «         t          di |¤Ž}|                      dd¬¦  «        }||d<   dt          › �|d<   |                      |¦  «        }|                      | j        › d�||¦  «        ƒ d{V —†}|                     d¦  «        r!	 t          di |¤ŽS #  t          d¦  «        ‚xY w|  
                    |d¦  «        ƒ d{V —† dS )a”  
        Start an asynchronous crawl job.

        Args:
            url (str): Target URL to start crawling from
            include_paths (Optional[List[str]]): Patterns of URLs to include
            exclude_paths (Optional[List[str]]): Patterns of URLs to exclude
            max_depth (Optional[int]): Maximum crawl depth
            max_discovery_depth (Optional[int]): Maximum depth for finding new URLs
            limit (Optional[int]): Maximum pages to crawl
            allow_backward_links (Optional[bool]): DEPRECATED: Use crawl_entire_domain instead
            crawl_entire_domain (Optional[bool]): Follow parent directory links
            allow_external_links (Optional[bool]): Follow external domain links
            ignore_sitemap (Optional[bool]): Skip sitemap.xml processing
            scrape_options (Optional[ScrapeOptions]): Page scraping configuration
            webhook (Optional[Union[str, WebhookConfig]]): Notification webhook settings
            deduplicate_similar_urls (Optional[bool]): Remove similar URLs
            ignore_query_parameters (Optional[bool]): Ignore URL parameters
            regex_on_full_url (Optional[bool]): Apply regex to full URLs
            idempotency_key (Optional[str]): Unique key to prevent duplicate requests
            **kwargs: Additional parameters to pass to the API

        Returns:
            V1CrawlResponse with:
            * success - Whether crawl started successfully
            * id - Unique identifier for the crawl job
            * url - Status check URL for the crawl
            * error - Error message if start failed

        Raises:
            Exception: If crawl initiation fails
        NrÜ   rÝ   rÞ   rß   rà   râ   rá   rã   rä   Trs  rå   rÄ   ræ   rç   rè   ré   rë   rJ   rq  r  rÄ  rÇ   r†  rÅ  r1   )rz  r‹  rÛ   r‰  rˆ  r  rW  r�  rí   r   r�  )r`  rJ   r´  rµ  r¶  r·  rà   r¸  r¹  rQ  rº  r–  rÄ   r»  r¼  r½  ré   r¾  rÀ  rÁ  r‘  rÈ  rŸ  r   r\   r”  s                             r#   rÊ  z#AsyncV1FirecrawlApp.async_crawl_urlò  sc  è è € ðp ˆð Ð$Ø+8ˆL˜Ñ(ØÐ$Ø+8ˆL˜Ñ(ØÐ Ø'0ˆL˜Ñ$ØÐ*Ø0CˆLÐ,Ñ-ØÐØ$)ˆL˜Ñ!ØÐ*Ø0CˆLÐ,Ñ-Ð-Ø!Ð-Ø1EˆLÐ-Ñ.ØÐ+Ø1EˆLÐ-Ñ.ØÐ%Ø,:ˆL˜Ñ)ØÐ%Ø,:×,?Ò,?ÈÐ\`Ð,?Ñ,aÔ,aˆL˜Ñ)ØÐØ&-ˆL˜Ñ#Ø#Ð/Ø5MˆLÐ1Ñ2Ø"Ð.Ø4KˆLÐ0Ñ1ØÐ(Ø->ˆLÐ)Ñ*ØÐØ$)ˆL˜Ñ!ØÐ'Ø.>ˆLÐ*Ñ+ð 	×Ò˜FÑ#Ô#Ð#õ %Ð4Ð4 |Ð4Ð4ˆØ"×'Ò'°ÀDÐ'ÑIÔIˆØ ˆ�EÑØ 7­gÐ 7Ð 7ˆ�HÑð ×'Ò'¨Ñ8Ô8ˆØ×1Ò1ØŒ\Ð
$Ð
$Ð
$Ø
Ø
ñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð �<Š<˜	Ñ"Ô"ð 	BðPÝ&Ð2Ð2¨Ð2Ð2Ð2øðPÝÐ NÑOÔOÐOøøøà×$Ò$ XÐ/@ÑAÔAÐAÐAÐAÐAÐAÐAÐAÐAÐAs   Ä%D1 Ä1ErÌ   c           
   ƒ   ó¤  K  — |                       ¦   «         }d|› �}|                      | j        › |› �|¦  «        ƒ d{V —†}|                     d¦  «        dk    r¬d|v r¨|d         }d|v r—t	          |d         ¦  «        dk    rn}|                     d¦  «        }|st
                               d¦  «         nK|                      ||¦  «        ƒ d{V —†}|                     |                     dg ¦  «        ¦  «         |}d|v °—||d<   t          |                     d¦  «        |                     d	¦  «        |                     d¦  «        |                     d
¦  «        |                     d¦  «        |                     d¦  «        d|v rdnd¬¦  «        }d|v r|                     d¦  «        |_	        d|v r|                     d¦  «        |_
        |S )a7  
        Check the status and results of an asynchronous crawl job.

        Args:
            id (str): Unique identifier for the crawl job

        Returns:
            V1CrawlStatusResponse containing:
            Status Information:
            * status - Current state (scraping/completed/failed/cancelled)
            * completed - Number of pages crawled
            * total - Total pages to crawl
            * creditsUsed - API credits consumed
            * expiresAt - Data expiration timestamp
            
            Results:
            * data - List of crawled documents
            * next - URL for next page of results (if paginated)
            * success - Whether status check succeeded
            * error - Error message if failed

        Raises:
            Exception: If status check fails
        rÌ  NrÓ   r]   rØ   r×   r   rÍ  rÔ   rÕ   rÖ   rÉ   FT)rÓ   rÔ   r]   rÕ   rÖ   rØ   rÇ   )rˆ  r   rW  r�  rÒ  r   rÈ   rÓ  rï   rÉ   r×   ©	r`  rÌ   r\   rÕ  rÖ  rØ   r×  rÙ  r”  s	            r#   rÛ  z&AsyncV1FirecrawlApp.check_crawl_statusg  s  è è € ð2 ×'Ò'Ñ)Ô)ˆØ$ Ð$Ð$ˆà ×3Ò3ØŒ|Ð'˜XÐ'Ð'Øñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð
 �?Š?˜8Ñ$Ô$¨Ò3Ð3Ø˜Ð$Ð$Ø" 6Ô*�Ø Ð+Ð+Ý˜; vÔ.Ñ/Ô/°1Ò4Ð4ØØ*Ÿš¨vÑ6Ô6�HØ#ð ÝŸšÐ'HÑIÔIÐIØØ&*×&=Ò&=¸hÈÑ&PÔ&PÐ PÐ PÐ PÐ PÐ PÐ P�IØ—K’K 	§¢¨f°bÑ 9Ô 9Ñ:Ô:Ð:Ø"+�Kð  Ð+Ð+ð '+�˜FÑ#å(Ø—?’? 8Ñ,Ô,Ø—/’/ 'Ñ*Ô*Ø!—o’o kÑ2Ô2Ø#Ÿš¨Ñ6Ô6Ø!—o’o kÑ2Ô2Ø—’ Ñ(Ô(Ø$¨Ð3Ð3�E�E¸ð
ñ 
ô 
ˆð �kÐ!Ð!Ø(Ÿ_š_¨WÑ5Ô5ˆHŒNà�[Ð Ð Ø'ŸOšO¨FÑ3Ô3ˆHŒMàˆr2   c              ƒ   óÈ  K  — 	 |                       | j        › d|› �|¦  «        ƒ d{V —†}|                     d¦  «        dk    rÇd|v r´|d         }d|v r—t          |d         ¦  «        dk    rn}|                     d¦  «        }|st                               d	¦  «         nK|                       ||¦  «        ƒ d{V —†}|                     |                     dg ¦  «        ¦  «         |}d|v °—||d<   t          di |¤ŽS t          d
¦  «        ‚|                     d¦  «        dv r)t          j
        t          |d¦  «        ¦  «        ƒ d{V —† nt          d|d         › �¦  «        ‚�Œ`)aí  
        Monitor the status of an asynchronous job until completion.

        Args:
            id (str): The ID of the job to monitor
            headers (Dict[str, str]): Headers to include in status check requests
            poll_interval (int): Seconds between status checks (default: 2)

        Returns:
            V1CrawlStatusResponse: The job results if completed successfully

        Raises:
            Exception: If the job fails or an error occurs during status checks
        TrÌ  NrÓ   r]   rØ   r×   r   rÍ  z&Job completed but no data was returnedrH  r³  z#Job failed or was stopped. Status: r1   )r   rW  r�  rÒ  r   rÈ   rÓ  rï   r   r  r  rN  )r`  rÌ   r\   rÀ  rÖ  rØ   r×  rÙ  s           r#   r8  z-AsyncV1FirecrawlApp._async_monitor_job_status©  sÊ  è è € ð	_Ø $× 7Ò 7Ø”<Ð/Ð/¨2Ð/Ð/Øñ!ô !ð ð ð ð ð ð ˆKð
 �Š˜xÑ(Ô(¨KÒ7Ð7Ø˜[Ð(Ð(Ø& vÔ.�DØ  KÐ/Ð/Ý˜{¨6Ô2Ñ3Ô3°qÒ8Ð8Ø!Ø#.§?¢?°6Ñ#:Ô#:˜Ø'ð "Ý"ŸNšNÐ+LÑMÔMÐMØ!Ø*.×*AÒ*AÀ(ÈGÑ*TÔ*TÐ$TÐ$TÐ$TÐ$TÐ$TÐ$T˜	ØŸš I§M¢M°&¸"Ñ$=Ô$=Ñ>Ô>Ð>Ø&/˜ð ! KÐ/Ð/ð +/�K Ñ'Ý0Ð?Ð?°;Ð?Ð?Ð?å#Ð$LÑMÔMÐMØ—’ Ñ*Ô*Ð.nÐnÐnÝ”m¥C¨°qÑ$9Ô$9Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:åÐ ]ÀkÐRZÔF[Ð ]Ð ]Ñ^Ô^Ð^ñ5	_r2   )r   rº  rì  rí  rà   rt   ru   r.  r   rì  rí  c             ƒ   ód  K  — i }
|	r*|
                      |	                     dd¬¦  «        ¦  «         |�||
d<   |�||
d<   |�||
d<   |�||
d<   |�||
d<   |�||
d	<   |�|                     dd¬¦  «        |
d
<   t          di |
¤Ž}|                     dd¬¦  «        }||d<   dt          › �|d<   d}|                      | j        › |› �|dd| j        › �i¬¦  «        ƒ d{V —†}|                     d¦  «        rd|v rt          di |¤ŽS d|v rt          d|d         › �¦  «        ‚t          d|› �¦  «        ‚)a½  
        Asynchronously map and discover links from a URL.

        Args:
          url (str): Target URL to map
          params (Optional[V1MapParams]): See V1MapParams model:
            Discovery Options:
            * search - Filter pattern for URLs
            * ignoreSitemap - Skip sitemap.xml
            * includeSubdomains - Include subdomain links
            * sitemapOnly - Only use sitemap.xml
            
            Limits:
            * limit - Max URLs to return
            * timeout - Request timeout (ms)

        Returns:
          V1MapResponse with:
          * Discovered URLs
          * Success/error status

        Raises:
          Exception: If mapping fails
        Trs  Nr   rä   rú   rû   rà   rt   ru   rJ   rq  r  rñ  rš  r›  rC  rÇ   rN   rÉ   zFailed to map URL. Error: r1   )
r‹  rz  rù   r‰  r  rW  rV  r�  rþ   r   )r`  rJ   r   rº  rì  rí  rà   rt   ru   r.  ró  rŸ  r   rÕ  r”  s                  r#   rð  zAsyncV1FirecrawlApp.map_urlÔ  sß  è è € ðH ˆ
Øð 	MØ×Ò˜fŸkšk°4Àd˜kÑKÔKÑLÔLÐLð ÐØ#)ˆJ�xÑ ØÐ%Ø*8ˆJ�Ñ'ØÐ)Ø.@ˆJÐ*Ñ+ØÐ#Ø(4ˆJ�}Ñ%ØÐØ"'ˆJ�wÑØÐØ$+ˆJ�yÑ!ØÐØ%-§]¢]¸DÈt ]Ñ%TÔ%TˆJ�zÑ"õ #Ð0Ð0 ZÐ0Ð0ˆØ"×'Ò'°ÀDÐ'ÑIÔIˆØ ˆ�EÑØ 7­gÐ 7Ð 7ˆ�HÑð ˆØ×1Ò1ØŒ|Ð'˜XÐ'Ð'ØØ$Ð&>°´Ð&>Ð&>Ð?ð 2ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð �<Š<˜	Ñ"Ô"ð 	E w°(Ð':Ð':Ý Ð,Ð, 8Ð,Ð,Ð,Ø˜Ð Ð ÝÐL¸À'Ô9JÐLÐLÑMÔMÐMåÐC¸ÐCÐCÑDÔDÐDr2   Fr  r*   re   rP  rR  rS  c             ƒ   ó\  K  — ddl }	|	                     dt          d¬¦  «         |                      ¦   «         }
|s|st	          d¦  «        ‚|s|st	          d¦  «        ‚|r|                      |¦  «        }|pg ||||dt          ¦   «         › �d	œ}|r||d
<   |r||d<   |r||d<   |                      | j        › d�||
¦  «        ƒ d{V —†}| 	                    d¦  «        r«| 	                    d¦  «        }|st          d¦  «        ‚	 |                      | j        › d|› �|
¦  «        ƒ d{V —†}|d         dk    rt          di |¤ŽS |d         dv r!t          d|d         › d|d         › �¦  «        ‚t          j        d¦  «        ƒ d{V —† Œ„t          d| 	                    d¦  «        › �¦  «        ‚)aQ  
        Asynchronously extract structured information from URLs.

        .. deprecated::
            The extract endpoint is in maintenance mode and its use is discouraged.
            Review https://docs.firecrawl.dev/developer-guides/usage-guides/choosing-the-data-extractor
            to find a replacement.

        Args:
            urls (Optional[List[str]]): URLs to extract from
            prompt (Optional[str]): Custom extraction prompt
            schema (Optional[Any]): JSON schema/Pydantic model
            system_prompt (Optional[str]): System context
            allow_external_links (Optional[bool]): Follow external links
            enable_web_search (Optional[bool]): Enable web search
            show_sources (Optional[bool]): Include source URLs
            agent (Optional[Dict[str, Any]]): Agent configuration

        Returns:
          V1ExtractResponse with:
          * Structured data matching schema
          * Source information if requested
          * Success/error status

        Raises:
          ValueError: If prompt/schema missing or extraction fails
        r   Nr	  r³  r
  r  r  rq  r  r*   r¿   rÀ   r  rÇ   rÌ   r  Tr  rÓ   r]   r  r  r  rÉ   r  r1   )r  r  r  rˆ  r^  rŠ  r$   r  rW  r�  r   r   r  r  r  )r`  rô  r*   re   rP  rQ  rR  rS  rÀ   r  r\   r  r”  r  rÖ  s                  r#   rO   zAsyncV1FirecrawlApp.extract!  s“  è è € ðN 	ˆˆˆØ�Šð%õ Øð 	ñ 	
ô 	
ð 	
ð ×'Ò'Ñ)Ô)ˆàð 	D˜fð 	DÝÐBÑCÔCÐCàð 	B˜Fð 	BÝÐ@ÑAÔAÐAàð 	6Ø×-Ò-¨fÑ5Ô5ˆFð �J˜BØ"6Ø0Ø'ØØ3¥K¡M¤MÐ3Ð3ð
ð 
ˆð ð 	,Ø%+ˆL˜Ñ"Øð 	9Ø+8ˆL˜Ñ(àð 	*Ø$)ˆL˜Ñ!à×1Ò1ØŒ|Ð(Ð(Ð(ØØñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð �<Š<˜	Ñ"Ô"ð 	RØ—\’\ $Ñ'Ô'ˆFØð MÝÐ KÑLÔLÐLð'Ø$(×$;Ò$;Ø”|Ð9Ð9°Ð9Ð9Øñ%ô %ð ð ð ð ð ð �ð
 ˜xÔ(¨KÒ7Ð7Ý,Ð;Ð;¨{Ð;Ð;Ð;Ø  Ô*Ð.EÐEÐEÝ#Ð$i°;¸xÔ3HÐ$iÐ$iÐS^Ð_fÔSgÐ$iÐ$iÑjÔjÐjå”m AÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ð'õ ÐP¸¿ºÀgÑ9NÔ9NÐPÐPÑQÔQÐQr2   c           
   ƒ   óT  K  — |                       ¦   «         }d|› �}|                      | j        › |› �|¦  «        ƒ d{V —†}|d         dk    r¬d|v r¨|d         }d|v r—t          |d         ¦  «        dk    rn}|                     d¦  «        }|st
                               d¦  «         nK|                      ||¦  «        ƒ d{V —†}|                     |                     dg ¦  «        ¦  «         |}d|v °—||d<   t          |                     d¦  «        |                     d	¦  «        |                     d¦  «        |                     d
¦  «        |                     d¦  «        |                     d¦  «        ¬¦  «        }d|v r|d         |d<   d|v r|d         |d<   dd|v rdndi|¥S )a2  
        Check the status of an asynchronous batch scrape job.

        Args:
            id (str): The ID of the batch scrape job

        Returns:
            V1BatchScrapeStatusResponse containing:
            Status Information:
            * status - Current state (scraping/completed/failed/cancelled)
            * completed - Number of URLs scraped
            * total - Total URLs to scrape
            * creditsUsed - API credits consumed
            * expiresAt - Data expiration timestamp
            
            Results:
            * data - List of scraped documents
            * next - URL for next page of results (if paginated)
            * success - Whether status check succeeded
            * error - Error message if failed

        Raises:
            Exception: If status check fails
        r  NrÓ   r]   rØ   r×   r   rÍ  rÔ   rÕ   rÖ   rÐ  rÉ   rÇ   FT)	rˆ  r   rW  rÒ  r�  r   rÈ   rÓ  rÏ   r>  s	            r#   r  z-AsyncV1FirecrawlApp.check_batch_scrape_status‡  s  è è € ð2 ×'Ò'Ñ)Ô)ˆØ+ rÐ+Ð+ˆà ×3Ò3ØŒ|Ð'˜XÐ'Ð'Øñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð
 �xÔ  KÒ/Ð/Ø˜Ð$Ð$Ø" 6Ô*�Ø Ð+Ð+Ý˜; vÔ.Ñ/Ô/°1Ò4Ð4ØØ*Ÿš¨vÑ6Ô6�HØ#ð ÝŸšÐ'HÑIÔIÐIØØ&*×&=Ò&=¸hÈÑ&PÔ&PÐ PÐ PÐ PÐ PÐ PÐ P�IØ—K’K 	§¢¨f°bÑ 9Ô 9Ñ:Ô:Ð:Ø"+�Kð  Ð+Ð+ð '+�˜FÑ#å.Ø—?’? 8Ñ,Ô,Ø—/’/ 'Ñ*Ô*Ø!—o’o kÑ2Ô2Ø#Ÿš¨Ñ6Ô6Ø!—o’o kÑ2Ô2Ø—’ Ñ(Ô(ð
ñ 
ô 
ˆð �kÐ!Ð!Ø +¨GÔ 4ˆH�WÑà�[Ð Ð Ø*¨6Ô2ˆH�VÑð  ¨;Ð 6Ð 6�u�u¸Dð
àð
ð 	
r2   c              ƒ   ó|   K  — |                       ¦   «         }|                      | j        › d|› d�|¦  «        ƒ d{V —†S )a]  
        Get information about errors from an asynchronous batch scrape job.

        Args:
          id (str): The ID of the batch scrape job

        Returns:
          V1CrawlErrorsResponse containing:
            errors (List[Dict[str, str]]): List of errors with fields:
              * id (str): Error ID
              * timestamp (str): When the error occurred
              * url (str): URL that caused the error
              * error (str): Error message
          * robotsBlocked (List[str]): List of URLs blocked by robots.txt

        Raises:
          Exception: If error check fails
        r  rÞ  N©rˆ  r   rW  ©r`  rÌ   r\   s      r#   r  z-AsyncV1FirecrawlApp.check_batch_scrape_errorsË  sh   è è € ð& ×'Ò'Ñ)Ô)ˆØ×,Ò,ØŒ|Ð9Ð9¨bÐ9Ð9Ð9Øñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
r2   c              ƒ   ó|   K  — |                       ¦   «         }|                      | j        › d|› d�|¦  «        ƒ d{V —†S )aa  
        Get information about errors from an asynchronous crawl job.

        Args:
            id (str): The ID of the crawl job

        Returns:
            V1CrawlErrorsResponse containing:
            * errors (List[Dict[str, str]]): List of errors with fields:
                - id (str): Error ID
                - timestamp (str): When the error occurred
                - url (str): URL that caused the error
                - error (str): Error message
            * robotsBlocked (List[str]): List of URLs blocked by robots.txt

        Raises:
            Exception: If error check fails
        rÌ  rÞ  NrD  rE  s      r#   rá  z&AsyncV1FirecrawlApp.check_crawl_errorsä  sh   è è € ð& ×'Ò'Ñ)Ô)ˆØ×,Ò,ØŒ|Ð2Ð2 rÐ2Ð2Ð2Øñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
r2   c              ƒ   óž  K  — |                       ¦   «         }t          j        ¦   «         4 ƒd{V —†}|                     | j        › d|› �|¬¦  «        4 ƒd{V —†}|                     ¦   «         ƒ d{V —†cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   	 ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )rä  NrÌ  rC  )rˆ  r  r  rF  rW  rB   )r`  rÌ   r\   r  r”  s        r#   ræ  z AsyncV1FirecrawlApp.cancel_crawlý  s  è è € ð ×'Ò'Ñ)Ô)ˆÝÔ(Ñ*Ô*ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-¨gØ—~’~¨¬Ð&EÐ&EÀÐ&EÐ&EÈw�~ÑWÔWð -ð -ð -ð -ð -ð -ð -Ð[cØ%Ÿ]š]™_œ_Ð,Ð,Ð,Ð,Ð,Ð,ð-ð -ð -ð -ñ -ô -ð -ð -ð -ð -ð -ð -ð -ð	-ð 	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð-ð -ð -ð -ð -ð -ð -ð -ð -ð -øøøð -ð -ð -ð -ð -ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-s5   °(B<ÁBÁ2B<Â
B!	Â!B<Â$B!	Â%B<Â<
CÃ	Cr  c              ƒ   óØ   K  — |                       ¦   «         }	 |                      | j        › d|› �|¦  «        ƒ d{V —†S # t          $ r!}t	          t          |¦  «        ¦  «        ‚d}~ww xY w)a>  
        Check the status of an asynchronous extraction job.

        Args:
            job_id (str): The ID of the extraction job

        Returns:
            V1ExtractResponse[Any] with:
            * success (bool): Whether request succeeded
            * data (Optional[Any]): Extracted data matching schema
            * error (Optional[str]): Error message if any
            * warning (Optional[str]): Warning message if any
            * sources (Optional[List[str]]): Source URLs if requested

        Raises:
            ValueError: If status check fails
        r  N©rˆ  r   rW  r   r^  r0   )r`  r  r\   rÚ  s       r#   r   z&AsyncV1FirecrawlApp.get_extract_status  sŸ   è è € ð$ ×'Ò'Ñ)Ô)ˆð	%Ø×0Ò0Ø”<Ð5Ð5¨VÐ5Ð5Øñô ð ð ð ð ð ð ð øõ ð 	%ð 	%ð 	%Ý�S ™VœVÑ$Ô$Ð$øøøøð	%øøøó   ˜%> ¾
A)ÁA$Á$A)c          	   ƒ   ó¸  K  — |                       ¦   «         }	|s|st          d¦  «        ‚|s|st          d¦  «        ‚|r|                      |¦  «        }t          |pg ||||dt          › �¬¦  «        }
|r||
d<   |r||
d<   |r||
d<   	 |                      | j        › d�|
|	¦  «        ƒ d	{V —†S # t          $ r!}t          t          |¦  «        ¦  «        ‚d	}~ww xY w)
aî  
        Initiate an asynchronous extraction job without waiting for completion.

        Args:
            urls (Optional[List[str]]): URLs to extract from
            prompt (Optional[str]): Custom extraction prompt
            schema (Optional[Any]): JSON schema/Pydantic model
            system_prompt (Optional[str]): System context
            allow_external_links (Optional[bool]): Follow external links
            enable_web_search (Optional[bool]): Enable web search
            show_sources (Optional[bool]): Include source URLs
            agent (Optional[Dict[str, Any]]): Agent configuration
            idempotency_key (Optional[str]): Unique key to prevent duplicate requests

        Returns:
            V1ExtractResponse[Any] with:
            * success (bool): Whether request succeeded
            * data (Optional[Any]): Extracted data matching schema
            * error (Optional[str]): Error message if any

        Raises:
            ValueError: If job initiation fails
        r  r  rq  r  r*   r¿   rÀ   r  N)	rˆ  r^  rŠ  r  r‰  r  rW  r   r0   )r`  rô  r*   re   rP  rQ  rR  rS  rÀ   r\   r  rÚ  s               r#   r"  z!AsyncV1FirecrawlApp.async_extract,  sc  è è € ðD ×'Ò'Ñ)Ô)ˆàð 	D˜fð 	DÝÐBÑCÔCÐCàð 	B˜Fð 	BÝÐ@ÑAÔAÐAàð 	6Ø×-Ò-¨fÑ5Ô5ˆFå(Ø�˜Ø3Ø-Ø$ØØ*¥Ð*Ð*ð
ñ 
ô 
ˆð ð 	,Ø%+ˆL˜Ñ"Øð 	9Ø+8ˆL˜Ñ(Øð 	*Ø$)ˆL˜Ñ!ð	%Ø×1Ò1Ø”<Ð,Ð,Ð,ØØñô ð ð ð ð ð ð ð øõ
 ð 	%ð 	%ð 	%Ý�S ™VœVÑ$Ô$Ð$øøøøð	%øøøs   Â	$B. Â.
CÂ8CÃC©r$  r%  r&  r$  r%  r&  c             ƒ   óä  K  — i }|�||d<   |�||d<   |�||d<   |                       ||||¬¦  «        ƒ d{V —†}|                     d¦  «        rd|vr|S |d         }	 |                      |¦  «        ƒ d{V —†}|d	         d
k    r|S |d	         dk    r%t          d|                     d¦  «        › �¦  «        ‚|d	         dk    rnt	          j        d¦  «        ƒ d{V —† Œ‚t          dddd¬¦  «        S )a  
        Generate LLMs.txt for a given URL and monitor until completion.

        Args:
            url (str): Target URL to generate LLMs.txt from
            max_urls (Optional[int]): Maximum URLs to process (default: 10)
            show_full_text (Optional[bool]): Include full text in output (default: False)
            experimental_stream (Optional[bool]): Enable experimental streaming

        Returns:
            V1GenerateLLMsTextStatusResponse containing:
            * success (bool): Whether generation completed successfully
            * status (str): Status of generation (processing/completed/failed)
            * data (Dict[str, str], optional): Generated text with fields:
                - llmstxt (str): Generated LLMs.txt content
                - llmsfulltxt (str, optional): Full version if requested
            * error (str, optional): Error message if generation failed
            * expiresAt (str): When the generated data expires

        Raises:
            Exception: If generation fails
        Nr4  r5  r)  rL  rÇ   rÌ   TrÓ   r]   r^   z#LLMs.txt generation failed. Error: rÉ   r  r³  Fr+  r­  r*  )r,  r�  r-  r   r  r  rM  )	r`  rJ   r$  r%  r&  r.  r”  r  rÓ   s	            r#   r/  z&AsyncV1FirecrawlApp.generate_llms_textr  s�  è è € ð: ˆØÐØ (ˆF�9ÑØÐ%Ø%3ˆF�>Ñ"ØÐ*Ø.AˆFÐ*Ñ+à×6Ò6ØØØ)Ø 3ð	 7ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð �|Š|˜IÑ&Ô&ð 	¨$°hÐ*>Ð*>ØˆOà˜$”ˆð
	#Ø×?Ò?ÀÑGÔGÐGÐGÐGÐGÐGÐGˆFà�hÔ ;Ò.Ð.Ø�Ø˜Ô! XÒ-Ð-ÝÐ [ÀfÇjÂjÐQXÑFYÔFYÐ [Ð [Ñ\Ô\Ð\Ø˜Ô! \Ò1Ð1Øå”- Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ð
	#õ 0¸ÐEvð  @Hð  TVð  Wñ  Wô  Wð  	Wr2   r#  r6  c             ƒ   óz  K  — i }|�||d<   |�||d<   |�||d<   t          ||||¬¦  «        }|                      ¦   «         }d|i|                     dd¬¦  «        ¥}d	t          › �|d
<   	 |                      | j        › d�||¦  «        ƒ d{V —†S # t          $ r!}	t          t          |	¦  «        ¦  «        ‚d}	~	ww xY w)a@  
        Initiate an asynchronous LLMs.txt generation job without waiting for completion.

        Args:
            url (str): Target URL to generate LLMs.txt from
            max_urls (Optional[int]): Maximum URLs to process (default: 10)
            show_full_text (Optional[bool]): Include full text in output (default: False)
            cache (Optional[bool]): Whether to use cached content if available (default: True)
            experimental_stream (Optional[bool]): Enable experimental streaming

        Returns:
            V1GenerateLLMsTextResponse containing:
            * success (bool): Whether job started successfully
            * id (str): Unique identifier for the job
            * error (str, optional): Error message if start failed

        Raises:
            ValueError: If job initiation fails
        Nr4  r5  r)  r(  rJ   Trs  rq  r  r1  )	r2  rˆ  rz  r‰  r  rW  r   r^  r0   )
r`  rJ   r$  r%  r6  r&  r.  r\   r2  rÚ  s
             r#   r,  z,AsyncV1FirecrawlApp.async_generate_llms_text¯  s&  è è € ð6 ˆØÐØ (ˆF�9ÑØÐ%Ø%3ˆF�>Ñ"ØÐ*Ø.AˆFÐ*Ñ+å)ØØ'ØØ"5ð	
ñ 
ô 
ˆð ×'Ò'Ñ)Ô)ˆØ˜CÐQ 6§;¢;¸È4 ;Ñ#PÔ#PÐQˆ	Ø5­GÐ5Ð5ˆ	�(Ñð	%Ø×1Ò1Ø”<Ð,Ð,Ð,ØØñô ð ð ð ð ð ð ð øõ
 ð 	%ð 	%ð 	%Ý�S ™VœVÑ$Ô$Ð$øøøøð	%øøøs   Á*$B Â
B:ÂB5Â5B:c              ƒ   óØ   K  — |                       ¦   «         }	 |                      | j        › d|› �|¦  «        ƒ d{V —†S # t          $ r!}t	          t          |¦  «        ¦  «        ‚d}~ww xY w)a  
        Check the status of an asynchronous LLMs.txt generation job.

        Args:
            id (str): The ID of the generation job

        Returns:
            V1GenerateLLMsTextStatusResponse containing:
            * success (bool): Whether generation completed successfully
            * status (str): Status of generation (processing/completed/failed)
            * data (Dict[str, str], optional): Generated text with fields:
                - llmstxt (str): Generated LLMs.txt content
                - llmsfulltxt (str, optional): Full version if requested
            * error (str, optional): Error message if generation failed
            * expiresAt (str): When the generated data expires

        Raises:
            ValueError: If status check fails
        r6  NrI  ©r`  rÌ   r\   rÚ  s       r#   r-  z3AsyncV1FirecrawlApp.check_generate_llms_text_statusæ  sŸ   è è € ð( ×'Ò'Ñ)Ô)ˆð	%Ø×0Ò0Ø”<Ð1Ð1¨RÐ1Ð1Øñô ð ð ð ð ð ð ð øõ ð 	%ð 	%ð 	%Ý�S ™VœVÑ$Ô$Ð$øøøøð	%øøørJ  )r¶  r\  r$  r]  rP  Ú/_AsyncV1FirecrawlApp__experimental_stream_stepsr_  r`  r  r\  r]  rQ  r_  r`  c             ƒ   ó  K  — i }
|�||
d<   |�||
d<   |�||
d<   |�||
d<   |�||
d<   |�||
d<   t          di |
¤Ž}
|                      ||||||¬¦  «        ƒ d{V —†}|                     d	¦  «        rd
|vr|S |d
         }d}d}	 |                      |¦  «        ƒ d{V —†}|r9d|v r5|d         |d…         }|D ]} ||¦  «         Œt	          |d         ¦  «        }|	r9d|v r5|d         |d…         }|D ]} |	|¦  «         Œt	          |d         ¦  «        }|d         dk    r|S |d         dk    r%t          d|                     d¦  «        › �¦  «        ‚|d         dk    rnt          j        d¦  «        ƒ d{V —† Œøt          dd¬¦  «        S rb  )	r9  rd  r�  re  rÒ  r   r  r  rB  )r`  r  r¶  r\  r$  r]  rP  rQ  r_  r`  rf  r”  r  rg  rh  rÓ   ri  rj  rk  rl  s                       r#   rm  z!AsyncV1FirecrawlApp.deep_research  s„  è è € ðP ˆØÐ Ø*3ˆO˜JÑ'ØÐ!Ø+5ˆO˜KÑ(ØÐØ)1ˆO˜IÑ&ØÐ&Ø0?ˆOÐ,Ñ-ØÐ$Ø.;ˆO˜NÑ+Ø&Ð2Ø<WˆOÐ8Ñ9Ý.ÐAÐA°ÐAÐAˆà×1Ò1ØØØ!ØØ+Ø'ð 2ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆð �|Š|˜IÑ&Ô&ð 	¨$°hÐ*>Ð*>ØˆOà˜$”ˆØÐØÐð	#Ø×:Ò:¸6ÑBÔBÐBÐBÐBÐBÐBÐBˆFàð @˜|¨vÐ5Ð5Ø!'¨Ô!5Ð6IÐ6JÐ6JÔ!K�Ø .ð *ð *�HØ�K Ñ)Ô)Ð)Ð)Ý&)¨&°Ô*>Ñ&?Ô&?Ð#àð ;˜Y¨&Ð0Ð0Ø$ YÔ/Ð0AÐ0BÐ0BÔC�Ø)ð &ð &�FØ�I˜fÑ%Ô%Ð%Ð%Ý$'¨¨yÔ(9Ñ$:Ô$:Ð!à�hÔ ;Ò.Ð.Ø�Ø˜Ô! XÒ-Ð-ÝÐ UÀÇ
Â
È7Ñ@SÔ@SÐ UÐ UÑVÔVÐVØ˜Ô! \Ò1Ð1Øå”- Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ð-	#õ0 ,°EÐAlÐmÑmÔmÐmr2   )r¶  r\  r$  r]  rP  rQ  c             ƒ   ó–  K  — i }|�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   t          di |¤Ž}|                      ¦   «         }	d|i|                     d	d	¬
¦  «        ¥}
dt          › �|
d<   	 |                      | j        › d�|
|	¦  «        ƒ d{V —†S # t          $ r!}t          t          |¦  «        ¦  «        ‚d}~ww xY w)ro  NrÞ   r;  r4  r=  r¿   rc  r  Trs  rq  r  rp  r1   )	r9  rˆ  rz  r‰  r  rW  r   r^  r0   )r`  r  r¶  r\  r$  r]  rP  rQ  rf  r\   r2  rÚ  s               r#   rd  z'AsyncV1FirecrawlApp.async_deep_researchc  sL  è è € ð> ˆØÐ Ø*3ˆO˜JÑ'ØÐ!Ø+5ˆO˜KÑ(ØÐØ)1ˆO˜IÑ&ØÐ&Ø0?ˆOÐ,Ñ-ØÐ$Ø.;ˆO˜NÑ+Ø&Ð2Ø<WˆOÐ8Ñ9Ý.ÐAÐA°ÐAÐAˆà×'Ò'Ñ)Ô)ˆà˜eÐ^ ×';Ò';ÀTÐX\Ð';Ñ']Ô']Ð^ˆ	Ø5­GÐ5Ð5ˆ	�(Ñð	%Ø×1Ò1Ø”<Ð2Ð2Ð2ØØñô ð ð ð ð ð ð ð øõ
 ð 	%ð 	%ð 	%Ý�S ™VœVÑ$Ô$Ð$øøøøð	%øøøs   Á8$B Â
CÂ'CÃCc              ƒ   óØ   K  — |                       ¦   «         }	 |                      | j        › d|› �|¦  «        ƒ d{V —†S # t          $ r!}t	          t          |¦  «        ¦  «        ‚d}~ww xY w)rt  ru  NrI  rP  s       r#   re  z.AsyncV1FirecrawlApp.check_deep_research_statusŸ  sŸ   è è € ð2 ×'Ò'Ñ)Ô)ˆð	%Ø×0Ò0Ø”<Ð7Ð7°2Ð7Ð7Øñô ð ð ð ð ð ð ð øõ ð 	%ð 	%ð 	%Ý�S ™VœVÑ$Ô$Ð$øøøøð	%øøørJ  )	rà   r  r  r  rX   ru   rt   r–  r.  r  r  r  rX   c       	      ‹   ó>  K  — i }|
rUt          |
t          ¦  «        r|                     |
¦  «         n*|                     |
                     dd¬¦  «        ¦  «         |�||d<   |�||d<   |�||d<   |�||d<   |�||d<   |�||d	<   |�||d
<   |	�|	                     dd¬¦  «        |d<   |                     |¦  «         t          dd|i|¤Ž}|                     dd¬¦  «        }dt          › �|d<   |                      | j        › d�|dd| j        › �i¦  «        ƒ d{V —†S )aÃ  
        Asynchronously search for content using Firecrawl.

        Args:
            query (str): Search query string
            limit (Optional[int]): Max results (default: 5)
            tbs (Optional[str]): Time filter (e.g. "qdr:d")
            filter (Optional[str]): Custom result filter
            lang (Optional[str]): Language code (default: "en")
            country (Optional[str]): Country code (default: "us") 
            location (Optional[str]): Geo-targeting
            timeout (Optional[int]): Request timeout in milliseconds
            scrape_options (Optional[ScrapeOptions]): Result scraping configuration
            params (Optional[Union[Dict[str, Any], SearchParams]]): Additional search parameters
            **kwargs: Additional keyword arguments for future compatibility

        Returns:
            SearchResponse: Response containing:
                * success (bool): Whether request succeeded
                * data (List[FirecrawlDocument]): Search results
                * warning (Optional[str]): Warning message if any
                * error (Optional[str]): Error message if any

        Raises:
            Exception: If search fails or response cannot be parsed
        Trs  Nrà   r  r  r  rX   ru   rt   rå   r  rq  r  r™  rš  r›  r1   )ry  rz  r‹  r
  r‰  r  rW  rV  )r`  r  rà   r  r  r  rX   ru   rt   r–  r.  r‘  r�  rŸ  r   s                  r#   r   zAsyncV1FirecrawlApp.searchÁ  s®  è è € ðR ˆØð 	TÝ˜&¥$Ñ'Ô'ð TØ×$Ò$ VÑ,Ô,Ð,Ð,à×$Ò$ V§[¢[¸$ÈT [Ñ%RÔ%RÑSÔSÐSð ÐØ%*ˆM˜'Ñ"Øˆ?Ø#&ˆM˜%Ñ ØÐØ&,ˆM˜(Ñ#ØÐØ$(ˆM˜&Ñ!ØÐØ'.ˆM˜)Ñ$ØÐØ(0ˆM˜*Ñ%ØÐØ'.ˆM˜)Ñ$ØÐ%Ø-;×-@Ò-@È$Ð]aÐ-@Ñ-bÔ-bˆM˜/Ñ*ð 	×Ò˜VÑ$Ô$Ð$õ &ÐCÐC¨EÐC°]ÐCÐCˆØ"×'Ò'°ÀDÐ'ÑIÔIˆØ 7­gÐ 7Ð 7ˆ�HÑà×-Ò-ØŒ|Ð'Ð'Ð'ØØÐ6¨¬Ð6Ð6Ð7ñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
r2   )r\  )Nr:  r;  rÜ  rÚ  )r³  rÛ  )Rr+   r,   r-   r.   r0   ra  r   r   r   r…   rº   r  r  r   r  ÚClientResponser�  r#  r  r¥  r"  r©  rÛ   rë  r   rÂ   rÿ  r	   r„   rW   r¾   r   r‡   r�   r‘   r•   r™   r�   r£   r¦   rª   rÆ   rp  r'   rÏ   r÷  rË   rü  ri   r[   rï   rÃ  rí   rÊ  rÛ  r8  rù   rþ   rð  r  rO   r  rõ   r  rá  ræ  r   r"  rM  r/  rG  r,  r-  r   rB  rm  rd  re  r
  r  r   Ú__classcell__©r  s   @r#   r  r  ç  s}  ø€ € € € € ðð ð
;ð ; ð ;¨cð ;ð ;ð ;ð ;ð ;ð ;ð .2ØØ$'ð+4ð +4àð+4ð ð+4ð ˜#˜s˜(”^ð	+4ð
 ˜4  S œ>Ô*ð+4ð ð+4ð "ð+4ð -1°°c°¬Nð+4ð +4ð +4ð +4ð^ 7:ð^ð ^Øð^Ø"& s¨C x¤.ð^Ø;?ÀÀSÀ¼>ð^àð^à.3ð^à>BÀ3ÈÀ8¼nð^ð ^ð ^ð ^ð2 7:ð]ð ]Øð]Ø%)¨#¨s¨(¤^ð]àð]à.3ð]à>BÀ3ÈÀ8¼nð]ð ]ð ]ð ]ð,+¨GÔ,Bð +ÈCð +ÐTXð +ð +ð +ð +ð6Z¸#ð ZÀsð ZÐ[^ð ZÐorð ZÐwzð Zð Zð Zð Zð-Ð(=ð -ð -ð -ð -ð,Ð';ð ,ð ,ð ,ð ,ð /3Ø-1ð	*9ð *9àð*9ð ˜]Ô+ð*9ð & cœ]ð	*9ð 7Lð	*9ð *9ð *9ð *9ð^ 04Ø-1ð	(@ð (@à�s”)ð(@ð ˜^Ô,ð(@ð & cœ]ð	(@ð 7Lð	(@ð (@ð (@ð (@ð\ mqØ04Ø04Ø04Ø04Ø&*Ø%*Ø37Ø%)Ø48Ø37Ø(,ØOSØ(,Ø.2Ø37ð EIð)DMð DMð DMàðDMð ˜d 7ð  ,gô  $hô  iô  jð	DMð
 ˜d 3¨ 8œnÔ-ðDMð # 4¨¤9Ô-ðDMð # 4¨¤9Ô-ðDMð  (¨œ~ðDMð ˜s”mðDMð ˜c”]ðDMð Ð/Ô0ðDMð ˜T”NðDMð $,¨D¤>ðDMð #+¨4¤.ðDMð   ”~ðDMð  ˜GÐ$JÔKÔLð!DMð"   ”~ð#DMð$ ˜lÔ+ð%DMð& # <Ô0ð'DMð( ˜d 5¨Ð7IÈ=ÐZgÐivð  yGð  IWð  Yrð  tð  *ô  $@ô  Aô  Bð)DMð* *¨#Ô.ð+DMð DMð DMð DMðT W[Ø,0Ø,0Ø,0Ø,0Ø"&Ø!&Ø/3Ø!%Ø04Ø/3Ø$(ØKOØ*.Ø/3ð AEØ*.Ø'(Ø)-ð-HCð HCð HCà�3ŒiðHCð ˜$˜wð  (Qô   Rô  Sô  Tð	HCð
 ˜$˜s C˜xœ.Ô)ðHCð ˜t CœyÔ)ðHCð ˜t CœyÔ)ðHCð $ Dœ>ðHCð ˜3”-ðHCð ˜#”ðHCð Ð+Ô,ðHCð ˜”ðHCð  (¨œ~ðHCð ' tœnðHCð ˜D”>ðHCð  ˜Ð FÔGÔHð!HCð" ˜,Ô'ð#HCð$ ˜|Ô,ð%HCð& ˜$˜u \Ð3EÀ}ÐVcÐerð  uCð  ESð  Unð  p{ð  &{ô   |ô  }ô  ~ð'HCð( ˜Ô'ð)HCð*   ”}ð+HCð, " #œð-HCð0 
%ð1HCð HCð HCð HCð^ W[Ø,0Ø,0Ø,0Ø,0Ø"&Ø!&Ø/3Ø!%Ø04Ø/3Ø$(ØKOØ*.Ø/3ð AEØ*.Ø.2Ø)-ð-JIð JIð JIà�3ŒiðJIð ˜$˜wð  (Qô   Rô  Sô  Tð	JIð
 ˜$˜s C˜xœ.Ô)ðJIð ˜t CœyÔ)ðJIð ˜t CœyÔ)ðJIð $ Dœ>ðJIð ˜3”-ðJIð ˜#”ðJIð Ð+Ô,ðJIð ˜”ðJIð  (¨œ~ðJIð ' tœnðJIð ˜D”>ðJIð  ˜Ð FÔGÔHð!JIð" ˜,Ô'ð#JIð$ ˜|Ô,ð%JIð& ˜$˜u \Ð3EÀ}ÐVcÐerð  uCð  ESð  Unð  p{ð  &{ô   |ô  }ô  ~ð'JIð( ˜Ô'ð)JIð* & dœ^ð+JIð, " #œð-JIð0 
ð1JIð JIð JIð JIð` .2Ø-1Ø#'Ø-1Ø#Ø/3Ø.2Ø/3Ø)-Ø48Ø9=Ø37Ø26Ø,0Ø#Ø+/Ø'(Ø)-ð+uBð uBð uBàðuBð    S¤	Ô*ð	uBð
    S¤	Ô*ðuBð ˜C”=ðuBð & cœ]ðuBð ˜Œ}ðuBð ' tœnðuBð & dœ^ðuBð ' tœnðuBð ! œðuBð ! Ô1ðuBð ˜%  _Ð 4Ô5Ô6ðuBð #+¨4¤.ðuBð  "*¨$¤ð!uBð" $ Dœ>ð#uBð$ ˜Œ}ð%uBð& # 4œ.ð'uBð(   ”}ð)uBð* " #œð+uBð. 
ð/uBð uBð uBð uBðx .2Ø-1Ø#'Ø-1Ø#Ø/3Ø.2Ø/3Ø)-Ø48Ø9=Ø37Ø26Ø,0Ø#Ø+/Ø'(Ø)-ð+sBð sBð sBàðsBð    S¤	Ô*ð	sBð
    S¤	Ô*ðsBð ˜C”=ðsBð & cœ]ðsBð ˜Œ}ðsBð ' tœnðsBð & dœ^ðsBð ' tœnðsBð ! œðsBð ! Ô1ðsBð ˜%  _Ð 4Ô5Ô6ðsBð #+¨4¤.ðsBð  "*¨$¤ð!sBð" $ Dœ>ð#sBð$ ˜Œ}ð%sBð& # 4œ.ð'sBð(   ”}ð)sBð* " #œð+sBð. 
ð/sBð sBð sBð sBðj@¨3ð @Ð3Hð @ð @ð @ð @ðD)_ð )_°#ð )_ÀÀSÈ#ÀXÄð )_Ð_bð )_ð  lAð )_ð )_ð )_ð )_ð^ !%Ø)-Ø-1Ø'+Ø#Ø!&Ø/3Ø(,ðKEð KEð KEàðKEð ˜”ð	KEð
 ! œðKEð % TœNðKEð ˜t”nðKEð ˜Œ}ðKEð ˜#”ðKEð Ð+Ô,ðKEð ˜Ô%ðKEð 2?ðKEð KEð KEð KEð^ )-ðdRð %)Ø$(Ø+/Ø38Ø05Ø+0Ø.2ðdRð dRð dRà˜4 œ9Ô%ðdRð ˜S”Mð	dRð
 ˜S”MðdRð $ Cœ=ðdRð #+¨4¤.ðdRð  (¨œ~ðdRð # 4œ.ðdRð ˜D  c œNÔ+ðdRð 8IÈÔ7MðdRð dRð dRð dRðLB
°#ð B
Ð:Uð B
ð B
ð B
ð B
ðH
°#ð 
Ð:Oð 
ð 
ð 
ð 
ð2
¨3ð 
Ð3Hð 
ð 
ð 
ð 
ð2- Sð -¨T°#°s°(¬^ð -ð -ð -ð -ð(%¨sð %Ð7HÈÔ7Mð %ð %ð %ð %ð: )-ðD%ð %)Ø$(Ø+/Ø38Ø05Ø+0Ø.2ðD%ð D%ð D%à˜4 œ9Ô%ðD%ð ˜S”Mð	D%ð
 ˜S”MðD%ð $ Cœ=ðD%ð #+¨4¤.ðD%ð  (¨œ~ðD%ð # 4œ.ðD%ð ˜D  c œNÔ+ðD%ð 8IÈÔ7MðD%ð D%ð D%ð D%ðT '+Ø-1Ø26ð;Wð ;Wð ;Wàð;Wð ˜s”mð	;Wð
 % TœNð;Wð "*¨$¤ð;Wð <\ð;Wð ;Wð ;Wð ;WðB '+Ø-1Ø$(Ø26ð5%ð 5%ð 5%àð5%ð ˜s”mð	5%ð
 % TœNð5%ð ˜D”>ð5%ð "*¨$¤ð5%ð <Vð5%ð 5%ð 5%ð 5%ðn%¸ð %Ð@`ð %ð %ð %ð %ðB (,Ø(,Ø&*Ø-1Ø+/Ø:>ØFJØDHð^nð ^nð ^nàð^nð   ”}ð	^nð
 ! œð^nð ˜s”mð^nð & cœ]ð^nð $ Cœ=ð^nð *2°$¬ð^nð " (¨D°°c°¬NÐ+;¸TÐ+AÔ"BÔCð^nð   ¨$¨s°C¨x¬.Ð)9¸4Ð)?Ô @ÔAð^nð Njð^nð ^nð ^nð ^nðH (,Ø(,Ø&*Ø-1Ø+/Ø:>ð:%ð :%ð :%àð:%ð   ”}ð	:%ð
 ! œð:%ð ˜s”mð:%ð & cœ]ð:%ð $ Cœ=ð:%ð *2°$¬ð:%ð DHÈÈSÈÄ>ð:%ð :%ð :%ð :%ðx %°3ð  %Ð;Wð  %ð  %ð  %ð  %ðL $(Ø!%Ø$(Ø"&Ø%)Ø&*Ø%*Ø8<ØFJðN
ð N
ð N
àðN
ð ˜C”=ð	N
ð
 ˜#”ðN
ð ˜S”MðN
ð ˜3”-ðN
ð ˜c”]ðN
ð ˜s”mðN
ð ˜c”]ðN
ð % _Ô5ðN
ð ˜U 4¨¨S¨¤>°>Ð#AÔBÔCðN
ð *ðN
ð N
ð N
ð N
ð N
ð N
ð N
ð N
r2   r  c            
       ó–   ‡ — e Zd ZdZdedefˆ fd„Zdd„Zdd„Zd	e	ee
f         ddfd
„Zdej        deddfd„Zdededededef
d„Zˆ xZS )r/  zQ
    Async version of V1CrawlWatcher that properly handles async operations.
    rÌ   rß  c                 óL   •— t          ¦   «                              ||¦  «         d S rÛ  r  )r`  rÌ   rß  r  s      €r#   ra  zAsyncV1CrawlWatcher.__init__  s#   ø€ Ý‰Œ×Ò˜˜SÑ!Ô!Ð!Ð!Ð!r2   rX  Nc              ƒ   óî   K  — t          j        | j        dd| j        j        › �fg¬¦  «        4 ƒd{V —†	 }|                      |¦  «        ƒ d{V —† ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )z[
        Establishes async WebSocket connection and starts listening for messages.
        rš  r›  )rê  Nrë  rï  s     r#   rí  zAsyncV1CrawlWatcher.connect  s%  è è € õ Ô%ØŒKØ!0Ð2N¸D¼HÔ<LÐ2NÐ2NÐ OÐPð
ñ 
ô 
ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð Ø—,’,˜yÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ð		*ð 	*ð 	*ñ 	*ô 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*øøøð 	*ð 	*ð 	*ð 	*ð 	*ð 	*s   µA$Á$
A.Á1A.c              ƒ   ó~   K  — |2 3 d{V —†}t          j        |¦  «        }|                      |¦  «        ƒ d{V —† Œ76 dS )z 
        Listens for incoming WebSocket messages and handles them asynchronously.

        Args:
            websocket: The WebSocket connection object
        Nrò  rõ  s       r#   rî  zAsyncV1CrawlWatcher._listen"  r÷  rø  rö  c              ƒ   ó®  K  — |d         dk    r2d| _         |                      d| j         | j        | j        dœ¦  «         dS |d         dk    r9d| _         |                      d| j         | j        |d         | j        dœ¦  «         dS |d         dk    rq|d	         d
         | _         | j                             |d	                              d	g ¦  «        ¦  «         | j        D ] }|                      d|| j        dœ¦  «         Œ!dS |d         dk    rF| j                             |d	         ¦  «         |                      d|d	         | j        dœ¦  «         dS dS )z 
        Handles incoming WebSocket messages based on their type asynchronously.

        Args:
            msg (Dict[str, Any]): The message to handle
        r‰   rã  r]   r  rÉ   r^   r  r  rØ   rÓ   rä  r  Nr  r  s      r#   rô  z#AsyncV1CrawlWatcher._handle_message-  r	  r2   r”  r}  c              ƒ   óP  K  — 	 |                      ¦   «         ƒ d{V —†}|                     dd¦  «        }|                     dd¦  «        }n!#  t          j        d|j        › �¦  «        ‚xY w| j                             |j        |||¦  «        ƒ d{V —†}t          j        |¦  «        ‚)z9
        Handle errors from async API responses.
        NrÉ   rP  rQ  rR  r"  )rB   r�  r  r  rÓ   rß  r#  r$  s          r#   r�  z!AsyncV1CrawlWatcher._handle_errorC  sÁ   è è € ð	{Ø'Ÿ}š}™œÐ.Ð.Ð.Ð.Ð.Ð.ˆJØ&ŸNšN¨7Ð4PÑQÔQˆMØ&ŸNšN¨9Ð6]Ñ^Ô^ˆMˆMøð	{ÝÔ%Ð&yÐhpÔhwÐ&yÐ&yÑzÔzÐzøøøð œ×9Ò9¸(¼/È6ÐS`ÐboÑpÔpÐpÐpÐpÐpÐpÐpˆåÔ! 'Ñ*Ô*Ð*r&  rŽ  rV  rW  c              ƒ   ó6   K  — |                       ||||¦  «        S r(  r)  r[  s        r#   r#  z,AsyncV1CrawlWatcher._get_async_error_messageS  r*  r2   r
  )r+   r,   r-   r.   r0   r  ra  rí  rî  r   r   rô  r  rV  r�  r…   r#  rW  rX  s   @r#   r/  r/    s"  ø€ € € € € ðð ð"˜3ð "Ð%8ð "ð "ð "ð "ð "ð "ð*ð *ð *ð *ð	,ð 	,ð 	,ð 	,ðR¨¨c°3¨h¬ð R¸Dð Rð Rð Rð Rð,+¨GÔ,Bð +ÈCð +ÐTXð +ð +ð +ð +ð Z¸#ð ZÀsð ZÐ[^ð ZÐorð ZÐwzð Zð Zð Zð Zð Zð Zð Zð Zr2   r/  )Tr.   Úloggingr   r  Útypingr   r   r   r   r   r   r	   r
   r   rB   r   r   rŒ  rF   rì  r  r  Ú	getLoggerr   ÚLoggerr/   r$   r‰  r%   Ú	BaseModelr'   r4   r9   r=   rI   rW   r[   rc   ri   r‡   r�   r‘   r•   r™   r�   r£   r¦   rª   r¼   r¾   rÂ   rÆ   rË   rÏ   rÛ   rí   rï   rñ   rõ   rù   rþ   r   r  r
  r  r  r  r  r"  r$  r*  r-  r0  r2  r9  r@  rB  rG  rI  rM  rU  rç  r  r/  r1   r2   r#   ú<module>re     s<  ððð ð ð €€€Ø 	€	€	€	Ø €€€Ø XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XÐ XØ €€€Ø Ð Ð Ð Ð Ð Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø €€€à+˜'Ô+¨KÑ8Ô8€ˆŒÐ 8Ð 8Ñ 8ð
ð 
ð 
ð ˆ+‰-Œ-€à€GˆC�L„L€ðJ!ð !ð !ð !ð !�XÔ'ñ !ô !ð !ð
(ð (ð (ð (ð (˜HÔ.ñ (ô (ð (ðð ð ð ð �hÔ(ñ ô ð ð
Cð Cð Cð Cð C˜8Ô-ñ Cô Cð Cð:ð :ð :ð :ð :˜(Ô,¨g°a¬jñ :ô :ð :ð *ð *ð *ð *ð *�xÔ)ñ *ô *ð *ð
Uð Uð Uð Uð U�hÔ(ñ Uô Uð Uðð ð ð ð ˜hÔ0ñ ô ð ð$ð $ð $ð $ð $�hÔ(ñ $ô $ð $ð(#ð #ð #ð #ð #�8Ô%ñ #ô #ð #ð"ð "ð "ð "ð "˜Ô+ñ "ô "ð "ðð ð ð ð �HÔ&ñ ô ð ð
ð ð ð ð �HÔ&ñ ô ð ð
ð ð ð ð �HÔ&ñ ô ð ð
#ð #ð #ð #ð #�XÔ'ñ #ô #ð #ðð ð ð ð �XÔ'ñ ô ð ðð ð ð ð  Ô 2ñ ô ð ð
"ð "ð "ð "ð "�(Ô$ñ "ô "ð "ð(ð (ð (ð (ð (�XÔ'ñ (ô (ð (ð+ð +ð +ð +ð +�8Ô%ñ +ô +ð +ð.ð .ð .ð .ð .�_ñ .ô .ð .ð ð  ð  ð  ð  Ð*¨1Ô-¨w°q¬zñ  ô  ð  ð,ð ,ð ,ð ,ð ,˜HÔ.ñ ,ô ,ð ,ð	$ð 	$ð 	$ð 	$ð 	$ (Ô"4ñ 	$ô 	$ð 	$ð+ð +ð +ð +ð +�HÔ&ñ +ô +ð +ð( ð  ð  ð  ð  �hÔ(ñ  ô  ð  ð	$ð 	$ð 	$ð 	$ð 	$˜HÔ.ñ 	$ô 	$ð 	$ðð ð ð ð �8Ô%ñ ô ð ðð ð ð ð ˜HÔ.ñ ô ð ð
	0ð 	0ð 	0ð 	0ð 	0�(Ô$ñ 	0ô 	0ð 	0ð ð  ð  ð  ð  �HÔ&ñ  ô  ð  ð
4ð 
4ð 
4ð 
4ð 
4�hÔ(ñ 
4ô 
4ð 
4ð
&ð 
&ð 
&ð 
&ð 
&˜Ô*¨G°A¬Jñ 
&ô 
&ð 
&ð
4ð 
4ð 
4ð 
4ð 
4�XÔ'ñ 
4ô 
4ð 
4ð ð  ð  ð  ð  �xÔ)ñ  ô  ð  ð-ð -ð -ð -ð -˜Ô*ñ -ô -ð -ðð ð ð ð ˜HÔ.ñ ô ð ð-ð -ð -ð -ð -�xÔ)ñ -ô -ð -ðð ð ð ð ˜8Ô-ñ ô ð ðð ð ð ð  HÔ$6ñ ô ð ð1ð 1ð 1ð 1ð 1 hÔ&8ñ 1ô 1ð 1ðð ð ð ð  8Ô#5ñ ô ð ð0ð 0ð 0ð 0ð 0 XÔ%7ñ 0ô 0ð 0ð1ð 1ð 1ð 1ð 1˜xÔ1ñ 1ô 1ð 1ð	6ð 	6ð 	6ð 	6ð 	6˜8Ô-ñ 	6ô 	6ð 	6ð ð  ð  ð  ð  ˜XÔ/ñ  ô  ð  ðð ð ð ð  8Ô#5ñ ô ð ð ð  ð  ð  ð   Ô!3ñ  ô  ð  ð&ð &ð &ð &ð &¨8Ô+=ñ &ô &ð &ðð ð ð ð  xÔ'9ñ ô ð ð ð  ð  ð  ð  �xÔ)ñ  ô  ð  ð+ð +ð +ð +ð +�hÔ(ñ +ô +ð +ðb* ð b* ð b* ð b* ð b* ñ b* ô b* ð b* ðJUYRð YRð YRð YRð YRñ YRô YRð YRðvh
ð h
ð h
ð h
ð h
˜.ñ h
ô h
ð h
ðT9OZð OZð OZð OZð OZ˜.ñ OZô OZð OZð OZð OZr2   