
    :j                        d Z ddlZddlZddlZddlZddlZddlmZm	Z	m
Z
 ddlZddlmZ ddlmZ ddlmZmZ ddlmZ ddlmZ dd	lmZmZ d
dlmZmZmZmZ ddlm Z  ddl!m"Z"  ed      Z# G d de       Z$ e"de$       y)z$
Anthropic provider implementation.
    N)DictListOptional)NO_RETRY_ERROR_CODES)ErrorReason)CheckResult	Condition)get_user_agent)
get_logger)handle_exceptionstrim   )http_error_messagehttp_error_statushttp_getrequest   )AIBaseProvider)register_providerproviderc                        e Zd ZdZdee   f fdZddedee	   dee	   fdZ
ddeded	ed
edef
 fdZdededef fdZ eg d      dede	dee   fd       Zddeded	edee   fdZ xZS )AnthropicProviderz"Anthropic provider implementation.
conditionsc           	      ~    | j                  |dddddd      }t        |   |d   |d   |d	   |d
   |d   |fi | y )N	anthropiczhttps://api.anthropic.comz/v1/messagesz
/v1/modelszclaude-sonnet-4-20250514)namebase_urlcompletion_path
model_pathdefault_modelr   r   r   r   r    )extractsuper__init__)selfr   kwargsconfig	__class__s       @/root/.openclaw/workspace/harvester/search/provider/anthropic.pyr#   zAnthropicProvider.__init__!   sl    #7#1*!;	
 	6N:$%< ?#	
 	
    token
additionalreturnc                 P    t        |      }|sydd|dd}| j                  ||      S )z'Get headers for Anthropic API requests.Nzapplication/jsonz
2023-06-01)acceptzcontent-typez	x-api-keyzanthropic-version)r   _merge_headers)r$   r*   r+   headerss       r(   _get_headerszAnthropicProvider._get_headers8   s;    U ).!-	
 ""7J77r)   addressendpointmodelc                    t        |      }|j                  d      rd}dddd| t               ddd	}d
\  }}d| j                  d      | j	                  d      }}
}	|	|
k  r(	 t        d|||      5 }|j                  }d}	 ddd       |r&t'        j(                  d|t&        j*                        r#t        j                  t        j                        S |s>t4        j7                  d| d|        t        j                  t        j@                        S 	 t!        j"                  |      }d}|rtt1        |tB              rdt        |d   j%                  dd            dk7  }|d   j%                  dg       }|r,t1        |tB              rd |v rt4        jE                  d!|        |st4        jG                  d"| d|        |rt        jH                         S t        j                  t        j                        S tJ        |   ||||#      S # 1 sw Y   nxY wnt# t        j                  j                  $ r}t        |      }|dk(  r(t        j                  t        j                        cY d}~S t        |      }|dk(  rd}	 t!        j"                  |      }|j%                  di       j%                  dd      }n	#  |}Y nxY wt'        j(                  d|t&        j*                        r(t        j                  t        j                        cY d}~S |t,        v rY d}~Y d}~njd}~wt.        $ r[}t1        |t        j                  j2                        s-t4        j7                  d| dt9        j:                                 Y d}~nd}~ww xY w|	dz  }	t=        j>                  d       |	|
k  rM'#  t        j                  t        j                        cY S xY w)$zCheck Anthropic token validity.zsk-ant-sid01-z'https://api.claude.ai/api/organizationsz`text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8zen-US,en;q=0.9z	max-age=0zsessionKey=navigatenone)r.   zaccept-languagezcache-controlcookiez
user-agentzsec-fetch-modezsec-fetch-site) Fr      default
   GET)r0   timeoutTNi  i  r9   errormessagezInvalid authorizationflagsz!Check Claude session error, key: z, message: r   Fr   capabilities
claude_prozFound Claude Pro key: z$Check error, Anthropic session key: )r*   r2   r3   r4   )'r   
startswithr
   _get_retries_get_timeoutr   textrequests
exceptions	HTTPErrorr   r   failr   INVALID_KEYr   jsonloadsgetrefindallIr   	Exception
isinstanceTimeoutloggerr@   	traceback
format_exctimesleepUNKNOWNlistinfowarningsuccessr"   check)r$   r*   r2   r3   r4   urlr0   contentra   attemptretriesr?   responseecoderA   datavalidrD   r'   s                      r(   rb   zAnthropicProvider.checkF   sn   UO,;C|#3!,'w/,.","(G  )GW()4+<+<Q+<+GIZIZceIZIfgWGG#u WgN RZ"*--"&> bjj)A7RTRVRVW"''(?(?@@@{SZR[\]"''(;(;<<Azz'*JtT2 aVT!:;rAE#'7;;~r#BL#
<(F<[gKg&<UG$DENN%I%P[\c[d#ef05{**,d;;K;KKLcLc;dd w}5'HTY}ZZm    **44 ",Q/Ds{*//0G0GHH"4Q"73;&(G2'+zz'':*.((7B*?*C*CIr*R2*1!zz*BGSUSWSWX'2'7'78O8O'P P#77! 8  u%a)<)<)D)DE'H{[d[o[o[qZr%stu 1

1? G#jA"''(?(?@@s   'H 6HH B?N5 "N5 HH N;2L(-N3L(7J>=L(>KAL(NL((N4AN

N5%Ori   rA   c                 z   t        |      }t        j                  d|t        j                        r#t	        j
                  t        j                        S |dk(  rRt        j                  dt        |      t        j                        r#t	        j
                  t        j                        S t        | )  ||      S )zJudge Anthropic API response.z*credit balance is too low|Billing|purchaserB   i  not_found_error)r   rR   rS   rT   r   rM   r   NO_QUOTANO_MODELr"   _judge)r$   ri   rA   r'   s      r(   rp   zAnthropicProvider._judge   s    w-::CWTVTXTXY##K$8$899S[RZZ(:DMQSQUQUV##K$8$899w~dG,,r)   r`   )default_result	log_levelrc   r0   c           	         t        |      }|sg S g }d}t               }	 ddi}|r||d<   t        |||d| j                  d            }|snt	        j
                  |      }|j                  d	g       D ]1  }	t        |	j                  d
d            }
|
s!|j                  |
       3 |j                  dd      sn4t        |j                  dd            }|r||v rn|j                  |       t        t        j                  |            S )z+Fetch Anthropic models from the Models API.r9   limitd   after_idr   r=   r;   )rc   r0   paramsintervalr?   rj   idhas_moreFlast_id)r   setr   rH   rO   rP   rQ   appendaddr^   dictfromkeys)r$   rc   r0   modelsrv   
seen_pagesrw   rd   resultitemr4   s              r(   _fetch_modelszAnthropicProvider._fetch_models   s    3iIU
s^F%-z"))")5G ZZ(F

62. )TXXdB/0MM%()
 ::j%0FJJy"56Hx:5NN8$9 < DMM&)**r)   c                    | j                  |      }|r| j                  sg S t        |      xs | j                  }t	        j
                  d|t        j                        st        j                  d| d       g S t        j                  j                  |j                  d      dz   | j                        }| j                  ||      S )z4List available Anthropic models from the Models API.)r*   z^https?://([\w\-_]+\.[\w\-_]+)+rB   zInvalid domain: z, skipping model listing/)rc   r0   )r1   r   r   	_base_urlrR   matchrT   rX   r@   urllibparseurljoinremovesuffixr   )r$   r*   r2   r3   r0   r   rc   s          r(   inspectzAnthropicProvider.inspect   s    ##%#0dooI=2DNNxx:HBDDQLL+H:5MNOIll""8#8#8#=#CT__U!!c7!;;r)   )N)r9   r9   r9   )r9   r9   )__name__
__module____qualname____doc__r   r	   r#   strr   r   r1   r   rb   intrp   r   r   r   __classcell__)r'   s   @r(   r   r      s    ,
4	? 
.8# 88D> 8XVZ^ 8K[3 K[ K[S K[c K[[f K[Z-3 - - - bI>(+ (+t (+S	 (+ ?(+T<S <3 <s <DQTI <r)   r   r   )%r   rO   rR   r[   rY   urllib.parser   typingr   r   r   rJ   constant.systemr   
core.enumsr   core.modelsr   r	   tools.coordinatorr
   tools.loggerr   tools.utilsr   r   clientr   r   r   r   baser   registryr   rX   r    r)   r(   <module>r      sh     	    ' '  0 " . , # / M M   '	J	v< v<r +0 1r)   