
    :j"                         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	 ddl
mZ ddlmZmZmZmZ ddlmZ ddlmZ ddlmZ d	d
lmZ  ed      ZddededefdZ G d de      Zy)z/
Base provider class for AI service providers.
    N)DictListOptionalUnion)ErrorReason)CheckResult	ConditionPatternsResultStorage)	IProvider)
get_logger)trim   )chatprovidervaluestrictreturnc                     t        |       } | sy|rdnd}t        j                  |d| t        j                        j	                  d      j                         S )N z[^a-zA-Z0-9_\-]z[^a-zA-Z0-9_\-/\\]-flags)r   resubIstriplower)r   r   patterns      ;/root/.openclaw/workspace/harvester/search/provider/base.py_normalize_pathr!      sI    KE$* 0EG66'3RTT288=CCEE    c                      e Zd ZdZedededefd       Zededee   defd       Z	edededd	fd
       Z
edeeef   fd       Zdedededededeeee   f   fdZd'dedee   dee   fdZd'dee   dee   dee   fdZdededefdZdedefdZdedefdZd(dededed edef
d!Zd)dedededee   fd"Zedefd#       Zedefd$       Zedefd%       Zdefd&Zy	)*AIBaseProviderzBase implementation for AI service providers.

    Implements the Provider interface to ensure type safety and consistency
    across the application while providing concrete functionality.
    kwargsdefaultsr   c                     i }|j                         D ])  \  }}| j                  |d      }t        |      xs |||<   + |S )a  Extract configuration parameters from kwargs with defaults.

        Args:
            kwargs: Input parameters dictionary (will be modified)
            defaults: Default values dictionary

        Returns:
            Dict: Processed parameters with defaults applied
        r   )itemspopr   )r%   r&   resultkeydefaultr   s         r    extractzAIBaseProvider.extract'   sL     $NN, 	1LCJJsB'Eu+0F3K	1
 r"   excludec                 `    | j                         D ci c]  \  }}||vs|| c}}S c c}}w )zFilter out specified keys from kwargs.

        Args:
            kwargs: Input parameters dictionary
            exclude: Keys to exclude

        Returns:
            Dict: Filtered parameters dictionary
        )r(   )r%   r.   kvs       r    filterzAIBaseProvider.filter:   s-     "(DA1G3C1DDDs   **valuesNc                 X    |j                         D ]  \  }}| j                  ||        y)zSet default values for kwargs if not present.

        Args:
            kwargs: Parameters dictionary to modify
            values: Default values to set
        N)r(   
setdefault)r%   r3   r+   r   s       r    r&   zAIBaseProvider.defaultsG   s-     !,,. 	*JCc5)	*r"   c                      ddddddddS )	z.Default result filenames used by AI providers.zvalid-keys.txtzno-quota-keys.txtzwait-check-keys.txtzinvalid-keys.txtzmaterial.txtzsummary.jsonz	links.txt)validno_quota
wait_checkinvalidmaterialsummarylinks r>   r"   r    	filenameszAIBaseProvider.filenamesR   s#     &+/)&% 
 	
r"   namebase_urlcompletion_path
model_pathdefault_model
conditionsc                 R   t        |      }|st        d      t        |      }|st        d      t        |      }|r|j                  d      s|dz  }|| _        |r|j                  di       ni }d\  }	}
t        |t              r6t        |j                  dd            }	t        |j                  dd            }
|	r7|
r5t        j                  j                  t        |	d	
      t        |
            }n|	rt        |	d	
      }nt        |      }t        || j                               | _        || _        t        |      j#                  d      | _        t        |      j#                  d      | _        || _        t        |t*              r|gnt        |t,              sg n|}t/               }|D ]_  }t        |t*              r"|j0                  j2                  r|j4                  st6        j9                  d| d       O|j;                  |       a t-        |      | _        || _        y )Nzprovider name cannot be emptyzdefault_model cannot be empty/storager   r   	directoryr   planF)r   )folderr?   zInvalid condition: z, skipping it) str
ValueErrorr   endswith_namer)   
isinstancedictgetospathjoinr!   r   r?   _result	_base_urlremoveprefixrB   rC   _default_modelr	   listsetpatternskey_patternenabledloggerwarningadd_conditionsextras)selfr@   rA   rB   rC   rD   rE   r%   rH   rJ   rK   rL   r(   	conditions                 r    __init__zAIBaseProvider.__init___   s    4y<==]+<==> H--c2OH 
/5&**Y+2 	4gt$W[[b9:IFB/0DWW\\/)E"JO\`LabF$Yu=F$T*F$Fdnn>NO "  $O4AA#F z*77< , *i0 L&z48"j 	 # 	!Ii39;M;M;Y;Yajarar!4YK}MNIIi 	!  ; r"   token
additionalc                     t         )z@Get headers for API requests. Must be implemented by subclasses.NotImplementedError)re   rh   ri   s      r    _get_headerszAIBaseProvider._get_headers       !!r"   headersc                    t        |t              s|S t        | j                  t              r| j                  j                  di       ni }t        |t              r|j	                  |       t        |t              r|j	                  |       |S )z@Merge provider configured headers with request-specific headers.extra_headers)rQ   rR   rd   rS   update)re   ro   ri   rq   s       r    _merge_headerszAIBaseProvider._merge_headers   sg    '4(N@J4;;X\@]<cemT*NN=)j$'NN:&r"   codemessagec                     t        |      }|dk(  r|rt        j                         S |dk(  r#t        j                  t        j
                        S |dk(  s&t        j                  d|t        j                        r#t        j                  t        j                        S |dk(  s&t        j                  d|t        j                        r#t        j                  t        j                        S |dk(  s|d	k(  r#t        j                  t        j                        S |d
k(  s|dk(  r#t        j                  t        j                        S |dk\  r#t        j                  t        j                        S t        j                  t        j                        S )z+Judge API response and return check result.   i  i  invalid_api_keyr   i  insufficienti  i  i  i  i  )r   r   successfailr   BAD_REQUESTr   findallr   INVALID_KEYNO_QUOTA	NO_ACCESSRATE_LIMITEDSERVER_ERRORUNKNOWN)re   rt   ru   s      r    _judgezAIBaseProvider._judge   s!   w-3;7&&((S[##K$;$;<<S[BJJ'97"$$O##K$;$;<<S[BJJrttL##K$8$899S[DCK##K$9$9::S[DCK##K$<$<==S[##K$<$<== 3 344r"   r,   c                 N    | j                   j                  dt        |d            S )Nretriesr   rd   rS   maxre   r,   s     r    _get_retrieszAIBaseProvider._get_retries       {{y#gq/::r"   c                 N    | j                   j                  dt        |d            S )Ntimeoutr   r   r   s     r    _get_timeoutzAIBaseProvider._get_timeout   r   r"   addressendpointmodelc           	         t        |      d}}|sdt        j                  || j                  t        j                        r4t
        j                  j                  | j                  | j                        }t        j                  ||t        j                        s<t        j                  d| d       t        j                  t        j                        S | j                  |      }|s#t        j                  t        j                        S t        |      xs | j                   }t#        |||| j%                  d      | j'                  d      	      \  }}	| j)                  ||	
      S )zCheck if token is valid.z^https?://([\w\-_]+\.[\w\-_]+)+r   zInvalid URL: z, skipping check)rh   r   )r,   
   )urlro   r   r   r   )rt   ru   )r   r   matchrX   r   urllibparseurljoinrB   r`   errorr   r{   r   r|   rm   rZ   r   r   r   r   )
re   rh   r   r   r   r   regexro   rt   ru   s
             r    checkzAIBaseProvider.check   s   ']$FUrxxt~~RTTB,,&&t~~t7K7KLCxxs"$$/LL=-=>?##K$;$;<<##%#0##K$;$;<<U2t22%%a%0%%b%1
g {{g{66r"   c                     t         )z9List available models. Must be implemented by subclasses.rk   )re   rh   r   r   s       r    inspectzAIBaseProvider.inspect   rn   r"   c                     | j                   S )zProvider name identifier)rP   re   s    r    r@   zAIBaseProvider.name   s     zzr"   c                     | j                   S )z#Search conditions for this provider)rc   r   s    r    rE   zAIBaseProvider.conditions   s     r"   c                     | j                   S )z)Result storage metadata for this provider)rW   r   s    r    r*   zAIBaseProvider.result   s     ||r"   c                 `    | j                   r| j                   d   j                  S t               S )z,Get patterns configuration for this providerr   )rc   r]   r
   r   s    r    get_patternszAIBaseProvider.get_patterns  s.     ##A&/// zr"   )N)r   r   r   rI   ) __name__
__module____qualname____doc__staticmethodr   r-   r   rM   r2   r&   r?   r   r	   rg   r   rm   rs   intr   r   r   r   r   r   propertyr@   rE   r   r*   r
   r   r>   r"   r    r$   r$       s;        $ 
Et 
Ed3i 
ED 
E 
E * *t * * * 

tCH~ 

 

HH H 	H
 H H )T)_45HT"# "8D> "XVZ^ "htn (4. \dei\j 53 5 5 5*;C ;C ;;C ;C ;73 7 7S 7c 7[f 72"S "3 "s "DQTI "
 c    D       h r"   r$   )T)r   rT   r   urllib.parser   typingr   r   r   r   
core.enumsr   core.modelsr   r	   r
   r   
core.typesr   tools.loggerr   tools.utilsr   clientr   r`   rM   boolr!   r$   r>   r"   r    <module>r      sf    
 	  . . " G G   #  	J	F3 F F FjY jr"   