
    Sg'              
       R   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"dS )-    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rY|                                   d}|                    dd          pt          j        |d          }|st	          | |           ||d<   | dk    ri|                    dd          sd}n|                    d          }t          |                    dd	          |                    d
d          ||          S | dk    r|                    dd          st          j        dd          }n|                    d          }|                    dd          st          j        dd          }n|                    d          }t          |                    dd          |                    d
d          ||          S | dk    r||                    dd          st          j        dd          }n|                    d          }t          |                    dd          |                    d
d          ||          S | dk    r|                    dd          st          j        dd          }n|                    d          }|                    dd          dk    r;t          |                    dd          |                    d
d          ||          S t          |                    dd          |                    d
d          ||          S | dk    r:t          |                    dd          |                    d
d          |          S | dk    r|                    dd          st          j        dd           }n|                    d          }d!|                    dd"          v rOt          |                    dd#          |                    d
d          |                    d$d%          |&          S t          |                    dd"          |                    d
d          |                    d$d%          |                    d'd(          |)          S | d*k    r|                    dd          st          j        d+d          }n|                    d          }|                    d,d          pt          j        d-d.          }t          |                    dd          |                    d
d          |||/          S | d0k    r||                    dd          st          j        d1d2          }n|                    d          }t          |                    dd3          |                    d
d          ||          S | d4k    r_t          |                    dd5          |                    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!!^^%%///**Y++Ery"/E/E 	4 7333#y;zz*b)) 	.2HHzz*--Hzz,0LMM

=#66	
 
 
 	
 
Y		zz*b)) 	.y!35PQQHHzz*--Hzz)R(( 	,i 1266GGjj++G**\+ABB

=#66	
 
 
 	
 
X		zz*b)) 	.y!24OPPHHzz*--H**\844

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

=#66"
 
 
 	

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

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

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

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

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

=#66Y233I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                 Z   |s*t          j        |                                  dd          }|s*t          j        |                                  dd          }| t          v r3t	          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    
  C)|1133===rBB E9 2 2 4 4???DD {""{;|#<KP\D]^_D`nrssss{2RTVZ[[[[rI   rF   c                     t                               | |                                           }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      sb     .11(HNN<L<LMM
(	E  	E 	E	E 	E 	E  rI   c                     | sd S t          | d          5 }t          j        |                                                              d          }d d d            n# 1 swxY w Y   |S )Nrbutf-8)openbase64	b64encodereaddecode)img_pathfin
image_datas      rG   encode_imagerf      s     t	h		 B%chhjj1188AA
B B B B B B B B B B B B B B Bs   :AA"Az.webmz.zip	directory
file_typesreturnc                    d |D             }t           j                            |           st          j        | d           |S |D ]}	 t	          t          |                               d|                     }|rUt          |d           }t          j                    |	                                j
        z
  dk    rt          |          ||<   # t          $ r}t          d| d	|            Y d
}~d
}~ww xY w|S )z(Get the latest recording and trace filesc                     i | ]}|d S N ).0exts     rG   
<dictcomp>z$get_latest_files.<locals>.<dictcomp>   s    -N-N-NCc4-N-N-NrI   T)exist_ok*c                 4    |                                  j        S rl   )statst_mtime)ps    rG   <lambda>z"get_latest_files.<locals>.<lambda>   s    AFFHH4E rI   )keyg      ?zError getting latest z file: N)rA   pathexistsmakedirslistr   rglobmaxtimert   ru   str	Exceptionprint)rg   rh   latest_files	file_typematcheslatestes          rG   get_latest_filesr      s-   -N-N:-N-N-NL7>>)$$ 
I---- 	A 	A		A4	??00YAABBG :W*E*EFFF9;;!77#==.1&kkL+ 	A 	A 	A?)??A??@@@@@@@@	A s   	B	C
C<C77C<c                 d  K   | j         j        }|r|j        r|j        d         }ndS d}|r|j        }|r|d         }|D ]}|j        dk    r|}ndS 	 |                    ddd           d{V }t          j        |                              d          }|S # t          $ r}Y d}~dS d}~ww xY 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C  09 /8;t E )"(  Ah 	# 	#Dx=(("	# t	&11 2 
 
 
 
 
 
 
 


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