
    i                     V    d dl Z ddededededef
dZdedefd	Zd
edefdZedk(  ryy)    Nquerypagelanguagecountryreturnc                    ddl }ddl}d}|j                  | |||d      }t        j                  d      dd}|j                  d|||	      }		 |	j                         }
t        |
      S # |j                  $ r |	j                  cY S w xY w)
aD  
    Performs a web search based on the user-provided query with pagination.

    Args:
        query (str): The keyword(s) to search for.
        page (int): The page number of the results to return. Defaults to 1.
        language (str): The language of the search results. Defaults to "en", can be "en", "zh-cn", "zh-tw", "ja", "ko".
        country (str): The country of the search results. Defaults to "us", can be "us", "cn", "jp", "kr".

    Returns:
        str: A formatted string containing the title, link, and snippet of the search results for the specified page.
    r   Nz https://google.serper.dev/search)qr   hlglSERPER_DEV_API_KEYzapplication/json)z	X-API-KEYzContent-TypePOST)headersdata)	requestsjsondumpsosgetenvrequest__format_serper_resultsJSONDecodeErrortext)r   r   r   r   r   r   urlpayloadr   responser   s              K/Users/bowang/.openclaw/workspace/ChatDev/functions/function_calling/web.py
web_searchr      s     
,Cjj	 G YY34*G
 W7KH}}&t,, }}s   A* *BBr   c           	         g }d| v r| d   }|j                  d       d|v r|j                  d|d           d|v r|j                  d|d           d|v rDd|v r)d	|v r%|j                  d
|d    d|d    d|d	    d       n|j                  d
|d           d|v rC|j                  d       |d   j                         D ]  \  }}|j                  d| d|         |j                  d       d| v r| d   r|j                  d       t        | d   d      D ]  \  }}|j                  dd      }|j                  dd      }|j                  dd      }	|j                  | d| d| d       |	r|j                  d|	        d|v sq|d   j                         D ]  \  }}|j                  d| d|          |j                  d       d| v r| d   r|j                  d       | d   D ]  }
|
j                  d       }|
j                  d      }	|
j                  d      }|
j                  d      }|r|j                  d!| d"       |	r|j                  d#|	        |sw|sz|j                  d$| d| d%        |j                  d       d&| v rP| d&   rK|j                  d'       | d&   D 
cg c]  }
d(|
v s|
d(    }}
|j                  d)j	                  |             d*j	                  |      j                         S c c}
w )+zQ
    Formats the raw JSON response from Serper.dev into a structured string.
    knowledgeGraphz## Knowledge Graphtitlez**Title**: typez
**Type**: descriptiondescriptionSourcedescriptionLinkz**Description**: z (Source: [z](z))
attributesz**Attributes**:z- z:  organicz## Organic Results   zNo Titlelink#snippetz. **[z)**z   z   - peopleAlsoAskz## People Also Askquestionz- **z**z  z  Source: [)relatedSearchesz## Related Searchesr   z, 
)appenditems	enumerategetjoinstrip)r   formatted_outputkgkeyvalueiresultr    r)   r+   itemr-   queriess                r   r   r   *   s     4"# 45b=##k"W+$?@R<##jF$=>B"b(->"-D!((+<R=N<O{[]^q[rZssuvx  zK  wL  vM  MO  *P  Q!((+<R=N<O)PQ2##$56 .446
U ''"SEE7(;< 7# DT)_ 45"4	?A6IAvJJw
3E::fc*DjjB/G##qcugRvS$AB ''#gY8 v%#),#7#=#=#?ZS%&--cU"UG.DE $@ 7 	# $4#8 45)Dxx
+Hhhy)G88F#DHHW%E ''$xj(;< ''"WI7!((;ugRvQ)GH * 	# D T*;%< 56-12C-DX-DTSW4=-DX		' 2399%&,,.. Ys   7	L	L	r   c                 j   ddl }ddl}ddlm} ddl}d}d}t        t        d      s) |       t        _        |j                         t        _	        d|  }t        j                  d      }i }	|r||	d	<   nt        j                  5  |j                         }
t        j                  ra|
t        j                  d   z
  |kD  rHt        j                  j                          t        j                  r|
t        j                  d   z
  |kD  rHt        t        j                        |k\  rt        j                  d   }||
|z
  z
  }|dkD  r|j                  |       |j                         }
t        j                  ra|
t        j                  d   z
  |kD  rHt        j                  j                          t        j                  r|
t        j                  d   z
  |kD  rHt        j                  j                  |j                                ddd       |j!                  ||	
      }|j"                  S # 1 sw Y   (xY w)zD
    Reads the content of a webpage and returns it as a string.
    r   N)deque   <   _request_timestampszhttps://r.jina.ai/JINA_API_KEYAuthorization)r   )r   timecollectionsr@   	threadinghasattrread_webpage_contentrC   Lock_lockr   r   popleftlensleepr1   r4   r   )r   r   rF   r@   rH   
RATE_LIMITTIME_WINDOW
target_urlr9   r   current_timeoldest_request
sleep_timer   s                 r   rJ   rJ   o   s    ! JK ')>?3870%.^^%5"%cU+J
))N
#CG
#&  "''99;L '::!5!I!I!!LL{Z$88@@B '::!5!I!I!!LL{Z ';;<
J!5!I!I!!L(L>,IJ
>JJz*  $yy{*>>"%9%M%Ma%PPS^^(<<DDF +>>"%9%M%Ma%PPS^^ !44;;DIIKH9 (< ||J|8H==? ('s   BH)CH)-H))H2__main__)r(   enus)r   strintr   dictr   rJ   __name__     r   <module>r_      so    	#c # #C # #X[ #LB/$ B/3 B/J9c 9c 9x z r^   