
    Yj0                        d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	Z	ddl
mZmZmZmZmZ dZd	Zh d
ZdZ G d d          ZdS )z Sync HTTP client for Honcho SDK.    )annotationsN)Iterator)Anycast   )ConnectionErrorRateLimitErrorServerErrorTimeoutErrorcreate_error_from_responseg      N@   >             g      ?c                  f   e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   ded<   deedddddAdZdBdZdCdZ	dDdZ
ddddd dEd'Zdddd(dFd)Zddddd dGd*Zddddd dGd+Zddddd dGd,Zddddd dGd-Zddddd dHd/Zddddd0dId4ZdJd5ZdKdLd7ZdMd9ZdNd<ZdOd=ZdKdPd@ZdS )QHonchoHTTPClientzISync HTTP client for the Honcho API with retry logic and timeout support.strbase_url
str | Noneapi_keyfloattimeoutintmax_retriesdict[str, str]default_headersdict[str, Any] | Nonedefault_querybool_owns_clientzhttpx.Client_clientN)r   r   r   r   r    http_clientdict[str, str] | Noner$   httpx.Client | NonereturnNonec                  |                     d          | _        || _        || _        || _        ddi|pi | _        || _        |d u | _        |p,t          j	        | j        t          j
        |                    | _        d S )N/Content-Typezapplication/json)r   r   )rstripr   r   r   r   r   r    r"   httpxClientTimeoutr#   )selfr   r   r   r   r   r    r$   s           Y/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/honcho/http/client.py__init__zHonchoHTTPClient.__init__%   s     !,,&. 
$" 
 +'4/" 
el]M'**'
 '
 '
    c                J    | j         r| j                                         dS dS )z#Close the HTTP client if we own it.N)r"   r#   closer0   s    r1   r5   zHonchoHTTPClient.close@   s1     	!L     	! 	!r3   'HonchoHTTPClient'c                    | S N r6   s    r1   	__enter__zHonchoHTTPClient.__enter__E   s    r3   argsr   c                .    |                                   d S r9   )r5   )r0   r<   s     r1   __exit__zHonchoHTTPClient.__exit__H   s    

r3   bodyqueryheadersr   methodpathr@   rA   rB   float | Nonec               :   |                      |          }|                     |          }||n| j        }	i | j        pi |pi pd}
d}d}|| j        k    r3	 | j                            ||||nd|                     |
          ||	          }|j        r|j	        }|sdS |
                                S |                     |          }|                     |          }t          |j        |                    d          p	d|j         ||          }|j        t           v r<|| j        k     r1|}t#          j        |                     ||                     |dz  }|# t(          j        $ rZ}t-          d|	 d	          }|| j        k     r4|}t#          j        |                     |                     |dz  }Y d}~v||d}~wt(          j        $ rY}t1          d
|           }|| j        k     r4|}t#          j        |                     |                     |dz  }Y d}~||d}~wt,          t0          t2          t4          f$ r  t6          $ r3}t9          |d          r t1          t;          |                    |d}~ww xY w|r|t1          d          )zAMake an HTTP request with automatic retries and timeout handling.Nr   jsonparamsrB   r   messageHTTP )r@   retry_afterr   zRequest timed out after szConnection failed: statuszRequest failed after retries)
_build_url_build_headersr   r    r   r#   request_clean_query_params
is_successtextrH   _parse_error_body_parse_retry_afterr   status_codegetRETRY_STATUS_CODEStimesleep_get_retry_delayr-   TimeoutExceptionr   ConnectErrorr   r	   r
   	Exceptionhasattrr   )r0   rC   rD   r@   rA   rB   r   urlrequest_headersrequest_timeoutmerged_query
last_errorattemptresponserT   
error_bodyrL   errores                      r1   rQ   zHonchoHTTPClient.requestK   s)    ood##--g66%,%8''dlF4-3F"FN$'+
)))@5<//!%!1t33LAA++ 0   & +#=D $#t#==??* "33H==
"55h??2(NN9--O1O9M1O1O# +	   (,>>>$"222!&JJt44WkJJKKKqLG) # # #$%R%R%R%RSST---!&JJt44W==>>>qLGHHHH"% # # #'(Aa(A(ABBT---!&JJt44W==>>>qLGHHHH" />;O    5 5 51h'' %c!ff--14	5  	<===sR   AE  !E  5B'E  E   J/AGGJAH*'H***J.JJrA   rB   r   c               6    |                      d||||          S )zMake a GET request.GETrk   rQ   )r0   rD   rA   rB   r   s        r1   rX   zHonchoHTTPClient.get   s      ||E4ugw|WWWr3   c               8    |                      d|||||          S )zMake a POST request.POSTr?   rn   r0   rD   r@   rA   rB   r   s         r1   postzHonchoHTTPClient.post   s,     ||Dt5'7  
 
 	
r3   c               8    |                      d|||||          S )zMake a PUT request.PUTr?   rn   rq   s         r1   putzHonchoHTTPClient.put   s,     ||4d%'  
 
 	
r3   c               8    |                      d|||||          S )zMake a PATCH request.PATCHr?   rn   rq   s         r1   patchzHonchoHTTPClient.patch   s,     ||TE7G  
 
 	
r3   c               8    |                      d|||||          S )zMake a DELETE request.DELETEr?   rn   rq   s         r1   deletezHonchoHTTPClient.delete   s,     ||dUGW  
 
 	
r3   Iterator[bytes]c             #  B  K   |                      |          }i |                     |          ddi}||n| j        }	i | j        pi |pi pd}
| j                            ||||nd|                     |
          ||	          5 }|j        s]|                                 | 	                    |          }t          |j        |                    d          p	d|j         |          |                                D ]}|V  	 ddd           dS # 1 swxY w Y   dS )z?Make a streaming request that yields raw bytes for SSE parsing.Acceptztext/event-streamNrG   rJ   rK   r@   )rO   rP   r   r    r#   streamrR   rS   readrU   r   rW   rX   
iter_bytes)r0   rC   rD   r@   rA   rB   r   ra   rb   rc   rd   rg   rh   chunks                 r1   r   zHonchoHTTPClient.stream   s      ood##
!!'**
)
 
 &-%8''dlF4-3F"FN$\  )t++L99## ! 
 
 	 & !33H==
0(NN9--O1O9M1O1O#    ",,..  %	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   B DDD)datarA   rB   r   filesdict[str, Any]r   c                  |                      |          }|                     |          }|                    dd           ||n| j        }	i | j        pi |pi pd}
| j                            ||||                     |
          ||	          }|j        sI| 	                    |          }t          |j        |                    d          p	d|j         |          |j        }|sdS |                                S )z6Make a multipart form data request (for file uploads).r+   N)r   r   rI   rB   r   rJ   rK   r   )rO   rP   popr   r    r#   rr   rR   rS   rU   r   rW   rX   rT   rH   )r0   rD   r   r   rA   rB   r   ra   rb   rc   rd   rg   rh   rT   s                 r1   uploadzHonchoHTTPClient.upload  s.    ood##--g66ND111%,%8''dlF4-3F"FN$<$$++L99## % 
 
 " 	//99J,$y))K-KX5I-K-K    } 	4}}r3   c                Z    |                     d          r| j         | S | j         d| S )zBuild the full URL from path.r*   )
startswithr   )r0   rD   s     r1   rO   zHonchoHTTPClient._build_url9  s?    ??3 	,m+T+++-(($(((r3   extrac                n    i | j         }| j        rd| j         |d<   |r|                    |           |S )z%Build request headers including auth.zBearer Authorization)r   r   update)r0   r   rB   s      r1   rP   zHonchoHTTPClient._build_headers?  sM    *T)*< 	@'?'?'?GO$ 	"NN5!!!r3   rI   c                F    |dS d |                                 D             S )z%Remove None values from query params.Nc                    i | ]
\  }}|||S r9   r:   ).0kvs      r1   
<dictcomp>z8HonchoHTTPClient._clean_query_params.<locals>.<dictcomp>Q  s    AAAA1=1===r3   )items)r0   rI   s     r1   rR   z$HonchoHTTPClient._clean_query_paramsK  s*     >4AAAAAAr3   rg   httpx.Responsec                   	 |                                 }t          |t                    rjt          t          t          t
          f         |          }d|                    d          p)|                    d          p|                    d          i|S dt	          |          iS # t          $ r dd|j         icY S w xY w)zParse error body from response.rJ   detailri   rK   )	rH   
isinstancedictr   r   r   rX   r_   rW   )r0   rg   r@   	body_dicts       r1   rU   z"HonchoHTTPClient._parse_error_bodyS  s    	? D$%% ,0c3h,F,F	y}}X66  . }}Y// . }}W--  	  s4yy)) 	? 	? 	?=x';==>>>>	?s   BB& B& &B?>B?c                \   |j                             d          }|sdS 	 t          |          S # t          $ r Y nw xY w	 ddlm} ddlm} t          | ||                    }|                                }t          d|t          j
                    z
            S # t          $ r Y dS w xY w)zParse Retry-After header.zRetry-AfterNr   )datetime)parsedate_to_datetimeg        )rB   rX   r   
ValueErrorr   email.utilsr   r   	timestampmaxrZ   r_   )r0   rg   headerr   r   dtr   s          r1   rV   z#HonchoHTTPClient._parse_retry_afterc  s    !%%m44 	4	==  	 	 	D			))))))999999*?*?*G*GHHB!||~~IsI	3444 	 	 	44	s   / 
<< AB 
B+*B+rf   rL   c                $    ||S t           d|z  z  S )z"Calculate delay before next retry.Nr   )INITIAL_RETRY_DELAY)r0   rf   rL   s      r1   r\   z!HonchoHTTPClient._get_retry_delayz  s    ""aj11r3   )r   r   r   r   r   r   r   r   r   r%   r    r   r$   r&   r'   r(   )r'   r(   )r'   r7   )r<   r   r'   r(   )rC   r   rD   r   r@   r   rA   r   rB   r%   r   rE   r'   r   )
rD   r   rA   r   rB   r%   r   rE   r'   r   )rD   r   r@   r   rA   r   rB   r%   r   rE   r'   r   )rC   r   rD   r   r@   r   rA   r   rB   r%   r   rE   r'   r|   )rD   r   r   r   r   r   rA   r   rB   r%   r   rE   r'   r   )rD   r   r'   r   r9   )r   r%   r'   r   )rI   r   r'   r   )rg   r   r'   r   )rg   r   r'   rE   )rf   r   rL   rE   r'   r   )__name__
__module____qualname____doc____annotations__DEFAULT_TIMEOUTDEFAULT_MAX_RETRIESr2   r5   r;   r>   rQ   rX   rr   ru   rx   r{   r   r   rO   rP   rR   rU   rV   r\   r:   r3   r1   r   r      s        SSMMMNNN####(((( #(.15/3+/
 
 
 
 
 
6! ! ! !
       '+)- $Y> Y> Y> Y> Y> Y>~ (,)- $	X 	X 	X 	X 	X 	X '+)- $
 
 
 
 
 
$ '+)- $
 
 
 
 
 
$ '+)- $
 
 
 
 
 
$ '+)- $
 
 
 
 
 
& '+)- $& & & & & &Z '+'+)- $& & & & & &P) ) ) )
 
 
 
 
B B B B? ? ? ?    .2 2 2 2 2 2 2r3   r   )r   
__future__r   rZ   collections.abcr   typingr   r   r-   
exceptionsr   r	   r
   r   r   r   r   rY   r   r   r:   r3   r1   <module>r      s    & & " " " " " "  $ $ $ $ $ $                        ...  f2 f2 f2 f2 f2 f2 f2 f2 f2 f2r3   