
    Sg'              
       D   d dl Z d dl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
 d dlmZ d dlmZ d dlmZ d dlmZmZ d dlZd	d
lmZmZ ddddddddZdefdZg dg dddgg dg dg dg dg dddgd 	Zd,d!Zded"efd#Zd$ Zd%d&gfd'ed(e d)eeee   f   fd*Z!d+ Z"y)-    N)Path)DictOptional)ChatAnthropic)ChatMistralAI)ChatGoogleGenerativeAI)
ChatOllama)AzureChatOpenAI
ChatOpenAI   )DeepSeekR1ChatOpenAIDeepSeekR1ChatOllamaOpenAIzAzure OpenAI	AnthropicDeepSeekGoogleAlibabaMoonShot)openaiazure_openai	anthropicdeepseekgooglealibabamoonshotproviderc           	      	   | dvrP| j                          d}|j                  dd      xs t        j                  |d      }|st	        | |       ||d<   | dk(  rU|j                  dd      sd}n|j                  d      }t        |j                  dd	      |j                  d
d      |      S | dk(  r|j                  dd      st        j                  dd      }n|j                  d      }|j                  dd      st        j                  dd      }n|j                  d      }t        |j                  dd      |j                  d
d      ||      S | dk(  ri|j                  dd      st        j                  dd      }n|j                  d      }t        |j                  dd      |j                  d
d      |      S | dk(  r|j                  dd      st        j                  dd      }n|j                  d      }|j                  dd      dk(  r/t        |j                  dd      |j                  d
d      |      S t        |j                  dd      |j                  d
d      |      S | dk(  r.t        |j                  dd      |j                  d
d            S | dk(  r|j                  dd      st        j                  dd       }n|j                  d      }d!|j                  dd"      v r?t        |j                  dd#      |j                  d
d      |j                  d$d%      |&      S t        |j                  dd"      |j                  d
d      |j                  d$d%      |j                  d'd(      |)      S | d*k(  r|j                  dd      st        j                  d+d      }n|j                  d      }|j                  d,d      xs t        j                  d-d.      }t        |j                  dd      |j                  d
d      ||/      S | d0k(  ri|j                  dd      st        j                  d1d2      }n|j                  d      }t        |j                  dd3      |j                  d
d      |      S | d4k(  rUt        |j                  dd5      |j                  d
d      t        j                  d6      t        j                  d7            S t        d8|        )9u\   
    获取LLM 模型
    :param provider: 模型类型
    :param kwargs:
    :return:
    )ollama_API_KEYapi_key r   base_urlzhttps://api.anthropic.com
model_nameclaude-3-5-sonnet-20241022temperatureg        )r#   r%   r"   r    mistralMISTRAL_ENDPOINTzhttps://api.mistral.ai/v1MISTRAL_API_KEYmistral-large-latest)modelr%   r"   r    r   OPENAI_ENDPOINTzhttps://api.openai.com/v1gpt-4or   DEEPSEEK_ENDPOINTdeepseek-chatdeepseek-reasonerr   zgemini-2.0-flash-exp)r*   r%   google_api_keyr   OLLAMA_ENDPOINTzhttp://localhost:11434zdeepseek-r1
qwen2.5:7bdeepseek-r1:14bnum_ctxi }  )r*   r%   r4   r"   num_predicti   )r*   r%   r4   r5   r"   r   AZURE_OPENAI_ENDPOINTapi_versionAZURE_OPENAI_API_VERSIONz2025-01-01-preview)r*   r%   r7   azure_endpointr    r   ALIBABA_ENDPOINTz1https://dashscope.aliyuncs.com/compatible-mode/v1	qwen-plusr   moonshot-v1-32k-vision-previewMOONSHOT_ENDPOINTMOONSHOT_API_KEYzUnsupported provider: )uppergetosgetenvhandle_api_key_errorr   r   r   r   r   r   r	   r
   
ValueError)r   kwargsenv_varr    r"   r7   s         ?/Users/kosar/src/browser-use-projects/web-ui/src/utils/utils.pyget_llm_modelrH      s    z!^^%&h/**Y+Eryy"/E 73#y;zz*b)2Hzz*-Hzz,0LM

=#6	
 	
 
Y	zz*b)yy!35PQHzz*-Hzz)R(ii 126Gjj+G**\+AB

=#6	
 	
 
X	zz*b)yy!24OPHzz*-H**\84

=#6	
 	
 
Z	zz*b)yy!4b9Hzz*-H::lO48KK'jj/BC"JJ}c:!	  jj?"JJ}c:!	  
X	%**\+AB

=#6"
 	

 
X	zz*b)yy!24LMHzz*-HFJJ|\BB'jj/@A"JJ}c:

9e4!	  jj|<"JJ}c:

9e4"JJ}d;!  
^	#zz*b)yy!8"=Hzz*-Hjj3rryyA[]q7r**\84

=#6##
 	
 
Y	zz*b)yy!35hiHzz*-H**\;7

=#6	
 	
 
Z	**\+KL

=#6YY23II01	
 	
 1(<==    )r$   zclaude-3-5-sonnet-20240620zclaude-3-opus-20240229)r,   gpt-4gpt-3.5-turbozo3-minir.   r/   )zgemini-2.0-flashzgemini-2.0-flash-thinking-expzgemini-1.5-flash-latestzgemini-1.5-flash-8b-latestz#gemini-2.0-flash-thinking-exp-01-21zgemini-2.0-pro-exp-02-05)r2   zqwen2.5:14bzqwen2.5:32bzqwen2.5-coder:14bzqwen2.5-coder:32bz	llama2:7br3   zdeepseek-r1:32b)r,   rJ   rK   )zpixtral-large-latestr)   zmistral-small-latestzministral-8b-latest)r;   zqwen-maxz
qwen-turboz	qwen-longr<   zmoonshot-v1-8k-vision-preview)	r   r   r   r   r   r   r&   r   r   c                 :   |s't        j                  | j                          dd      }|s't        j                  | j                          dd      }| t        v r)t	        j
                  t        |    t        |    d   d      S t	        j
                  g ddd      S )zZ
    Update the model name dropdown with predefined models for the selected provider.
    r   r!   	_BASE_URLr   T)choicesvalueinteractive)rN   rO   rP   allow_custom_value)rA   rB   r?   model_namesgrDropdown)llm_providerr    r"   s      rG   update_model_dropdownrV      s    
 ))|1134H=rB99 2 2 45Y?D {"{{;|#<KP\D]^_D`nrss{{2RTVZ[[rI   rF   c                     t         j                  | | j                               }t        j                  d| d| d      )zW
    Handles the missing API key error by raising a gr.Error with a clear message.
    u   💥 u)    API key not found! 🔑 Please set the `z/` environment variable or provide it in the UI.)PROVIDER_DISPLAY_NAMESr@   r?   rS   Error)r   rF   provider_displays      rG   rC   rC      sK     .11(HNN<LM
((
 ! "9C	E rI   c                     | sy t        | d      5 }t        j                  |j                               j	                  d      }d d d        |S # 1 sw Y   S xY w)Nrbutf-8)openbase64	b64encodereaddecode)img_pathfin
image_datas      rG   encode_imagerf      sT    	h	 B%%chhj188A
BBs   3AAz.webmz.zip	directory
file_typesreturnc                    |D ci c]  }|d }}t         j                  j                  |       st        j                  | d       |S |D ]y  }	 t	        t        |       j                  d|             }|rNt        |d       }t        j                         |j                         j                  z
  dkD  rt        |      ||<   { |S c c}w # t        $ r}t        d| d	|        Y d}~d}~ww xY w)
z(Get the latest recording and trace filesNT)exist_ok*c                 6    | j                         j                  S )N)statst_mtime)ps    rG   <lambda>z"get_latest_files.<locals>.<lambda>   s    AFFH4E4E rI   )keyg      ?zError getting latest z file: )rA   pathexistsmakedirslistr   rglobmaxtimern   ro   str	Exceptionprint)rg   rh   extlatest_files	file_typematcheslatestes           rG   get_latest_filesr      s    CM-NCc4i-NL-N77>>)$
I- 	A		A4	?001YKABGW*EF99;!7!77#=.1&kL+	A # .O  	A))GA3?@@	As   
C	A6C	C2C--C2c                   K   | j                   j                  }|r|j                  r|j                  d   }nyd}|r|j                  }|r|d   }|D ]  }|j                  dk7  s|} ny	 |j                  ddd       d{   }t        j                  |      j                  d      }|S 7 *# t        $ r
}Y d}~yd}~ww xY ww)	zCapture and encode a screenshotr   Nzabout:blankjpegK   css)typequalityscaler]   )
browserplaywright_browsercontextspagesurl
screenshotr_   r`   rb   r{   )	browser_contextr   playwright_contextr   active_pagepager   encodedr   s	            rG   capture_screenshotr      s      )00CC 099/88; E"(( Ah 	#Dxx=("	# 	&11 2 
 


 "":.55g>
  sB   A!C$C+B/ B-)B/ ,C-B/ /	C8C=CC)NN)#r_   rA   ry   pathlibr   typingr   r   requestslangchain_anthropicr   langchain_mistralair   langchain_google_genair   langchain_ollamar	   langchain_openair
   r   gradiorS   llmr   r   rX   rz   rH   rR   rV   rC   rf   rv   r   r    rI   rG   <module>r      s     	   !  - - 9 ' 8  ; " G>C G>V h= "56 @ X8nC13RS
\ 3   :A&8I   dSVX`adXeSeNf (#rI   