
    :j                         d Z ddlZddlZddlZddlmZ  ed      Zddlm	Z	m
Z
mZ ddlmZmZ ddlmZ ddlmZ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  G d de      Z ede       y)z"
OpenAI-like provider base class.
    N)
get_loggerprovider)DictListOptional)DEFAULT_COMPLETION_PATHDEFAULT_MODEL_PATH)ErrorReason)CheckResult	Condition)get_user_agent)handle_exceptionstrim   )http_get   )AIBaseProvider)register_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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 )OpenAILikeProviderz+Base class for OpenAI-compatible providers.
conditionsc                    t        |j                  dd            }t        |j                  dd            }t        |j                  dd            }|st        d      |st        d| d      |st        d| d      | j                  |t        t
        d	      }|j                  |||d
       t        |    |d   |d   |d   |d   |d   |fi | y )Nname base_urldefault_modelz=OpenAILike provider requires 'name' parameter to be specifiedzOpenAILike provider z. requires 'base_url' parameter to be specifiedz3 requires 'default_model' parameter to be specified)completion_path
model_path)r   r   r   r   r   )	r   pop
ValueErrorextractr   r	   updatesuper__init__)selfr   kwargsr   r   r   config	__class__s          B/root/.openclaw/workspace/harvester/search/provider/openai_like.pyr$   zOpenAILikeProvider.__init__   s   FJJvr*+

:r23VZZ<= \]]3D69ghii3D69lmnn #:0
 	$!.	
 	6N:$%< ?#	
 	
    token
additionalreturnc           	      H   t        |      }|syt        |t              si }t        | j                  t              r%t        | j                  j	                  dd            ndxs d}|j                         dk(  rd| n|}dddd||d	t               i}| j                  ||      S )
z)Get headers for OpenAI-like API requests.Nauth_keyr   authorizationzBearer acceptzapplication/jsonzcontent-typez
user-agent)r   
isinstancedictextrasgetlowerr   _merge_headers)r%   r+   r,   r/   
auth_valueheaderss         r)   _get_headerszOpenAILikeProvider._get_headersH   s    U*d+J?I$++W[?\DT:;bdxix*2..*:o*Mwug&SX
 (.j.*	
 ""7J77r*   codemessagec                    |dk(  r	 t        j                  t        |            }|rt        |t              r|j                  dd      }|r}t        |t              rmt        |j                  dd            }t        |j                  dd            j                         }|sd|v r#t        j                  t        j                        S t        j                         S t        |      }|r|d
k(  r%t!        j"                  d|t         j$                        r#t        j                  t        j&                        S t!        j"                  d|t         j$                        r#t        j                  t        j                        S t!        j"                  d|t         j$                        r#t        j                  t        j(                        S t!        j"                  d|t         j$                        rt        j                  t        j*                        S |dk(  rt!        j"                  d|t         j$                        r#t        j                  t        j*                        S t!        j"                  d|t         j$                        rqt        j                  t        j,                        S |dk(  rIt!        j"                  d|t         j$                        r#t        j                  t        j&                        S t.        | a  ||      S #  t        j                  d| j                   d	|        t        j                  t        j                        cY S xY w)zJudge OpenAI-like API response.   errorNtyper   r<   r0   z"Failed to parse response, domain: z, message: i  model_not_found)flagsu   unauthorized|已被封禁u@   unsupported_country_region_territory|该令牌无权访问模型uS   exceeded_current_quota_error|insufficient_user_quota|(额度|余额)(不足|过低)i  u?   insufficient_quota|billing_not_active|欠费|请充值|rechargerate_limit_exceededi  u   无可用渠道)jsonloadsr   r2   r3   r5   r6   r   failr
   INVALID_KEYloggerr?   	_base_urlUNKNOWNsuccessrefindallINO_MODEL	NO_ACCESSNO_QUOTARATE_LIMITEDr#   _judge)r%   r;   r<   datar?   
error_typeerror_reasonr(   s          r)   rS   zOpenAILikeProvider._judge]   sc   3;=zz$w-0JtT2 HHWd3EE4!8%)%))FB*?%@
'+EIIi,D'E'K'K'M%L)H#.#3#3K4K4K#LL
 &&((w-s{::0'F&++K,@,@AAZZ <gRTTR&++K,C,CDDZZ celtvtxtxy&++K,A,ABBZZjls{}{{ '++K,@,@AA::`biqsququv&++K,@,@AAZZ 6rttL&++K,D,DEE,>rtt!T"''(<(<==w~dG,,7=A$..AQQ\]d\efg"''(;(;<<s   C L A
Mwarning)default_result	log_levelurlr9   c           	          t        |      }|sg S t        ||d      }|sg S t        j                  |      }|j	                  dg       D cg c]  }t        |j	                  dd             c}S c c}w )zFetch models from API endpoint.r   )rZ   r9   intervalrT   idr   )r   r   rD   rE   r5   )r%   rZ   r9   contentresultxs         r)   _fetch_modelsz OpenAILikeProvider._fetch_models   sg     3iIsGa@IG$/5zz&"/EF!QUU4_%FFFs   "A0addressendpointc                     | j                  |      }|r| j                  r| j                  sg S t        j                  j                  | j                  | j                        }| j                  ||      S )z+List available models from OpenAI-like API.)r+   )rZ   r9   )r:   rI   r   urllibparseurljoinra   )r%   r+   rb   rc   r9   rZ   s         r)   inspectzOpenAILikeProvider.inspect   s]    ##%#0dnnDOOIll""4>>4??C!!c7!;;r*   )N)r   r   )__name__
__module____qualname____doc__r   r   r$   strr   r   r:   intr   rS   r   ra   rh   __classcell__)r(   s   @r)   r   r      s    5(
4	? (
T8# 88D> 8XVZ^ 8*(-3 (- (- (-T bI>G Gt GS	 G ?G<S <3 <s <DQTI <r*   r   openai_like) rl   rD   rL   urllib.parsere   tools.loggerr   rH   typingr   r   r   constant.systemr   r	   
core.enumsr
   core.modelsr   r   tools.coordinatorr   tools.utilsr   r   clientr   baser   registryr   r    r*   r)   <module>r}      s\     	  #	J	 ' ' G " . , /    'A< A<H -!3 4r*   