
    7|h|"                       d dl mZ d dlmZ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mZmZ d dlmZmZ d dlmZmZ d d	lmZ d d
lmZ 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZddZ e	dd       G d dee             Zy)    )annotations)AnyDictIteratorListOptional)
deprecated)CallbackManagerForLLMRun)LanguageModelInput)
GenerationGenerationChunk	LLMResult)get_from_dict_or_envpre_init)	BaseModel	SecretStr)BaseLLM)create_retry_decoratorN
GooglePalmc                v     t          j                  |      }|	 	 	 	 	 	 	 	 	 	 d fd       } |d|||d|S )z*Use tenacity to retry the completion call.)max_retriesrun_managerc                    |j                  di       }|rj                  j                  | ||      S  j                  j                  dd| i|S )Ngeneration_config)contentsstreamr   prompt )getclientgenerate_contentgenerate_text)r   	is_geminir   kwargsr   llms        c/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/llms/google_palm.py_completion_with_retryz5completion_with_retry.<locals>._completion_with_retry   s_     #JJ':B?::..BS /   (szz''@v@@@    )r   r#   r   )
r   r   r#   boolr   r)   r$   r   returnr   r   )r   r   )r%   r   r#   r   r   r$   retry_decoratorr'   s   `       r&   completion_with_retryr,      s     -kO A"A/3A=AAMPA	A A " 6=C r(   c                
    d| v S )Ngeminir   
model_names    r&   _is_gemini_modelr1   -   s    z!!r(   c                v    t        d | j                  d      dd D              }|r| j                  dd      S | S )zStrip erroneous leading spaces from text.

    The PaLM API will sometimes erroneously return a single leading space in all
    lines > 1. This function strips that space.
    c              3  6   K   | ]  }| xs |d    dk(    yw)r    Nr   ).0lines     r&   	<genexpr>z2_strip_erroneous_leading_spaces.<locals>.<genexpr>7   s"     X4H6Q36Xs   
   Nz
 )allsplitreplace)texthas_leading_spaces     r&   _strip_erroneous_leading_spacesr?   1   s@     X4::dCSTUTVCWXX||E4((r(   z0.0.12z)langchain_google_genai.GoogleGenerativeAI)alternative_importc                  J   e Zd ZU dZded<   ded<   dZded<   	 d	Zd
ed<   	 dZded<   	 dZded<   	 dZ	ded<   	 dZ
ded<   	 dZded<   	 ed d       Zed!d       Zed d       Zed"d       Zed#d       Z	 	 d$	 	 	 	 	 	 	 	 	 d%dZ	 	 d$	 	 	 	 	 	 	 	 	 d&dZed'd       Zd(dZy))r   zg
    DEPRECATED: Use `langchain_google_genai.GoogleGenerativeAI` instead.

    Google PaLM models.
    r   r    zOptional[SecretStr]google_api_keyzmodels/text-bison-001strr0   gffffff?floattemperatureNzOptional[float]top_pzOptional[int]top_kmax_output_tokensr9   intn   r   c                ,    t        | j                        S )z=Returns whether a model is belongs to a Gemini family or not.)r1   r0   selfs    r&   r#   zGooglePalm.is_gemini\   s      00r(   c                
    ddiS )NrB   GOOGLE_API_KEYr   rM   s    r&   
lc_secretszGooglePalm.lc_secretsa   s     "233r(   c                     y)NTr   rM   s    r&   is_lc_serializablezGooglePalm.is_lc_serializablee   s    r(   c                
    g dS )z*Get the namespace of the langchain object.)	langchainllmsgoogle_palmr   )clss    r&   get_lc_namespacezGooglePalm.get_lc_namespacei   s
     43r(   c                    t        |dd      }|d   }	 ddlm} t        |t              r|j                         }|j                  |       t        |      r|j                  |      |d<   n||d<   |d
   %d|d
   cxk  rdk  st        d       t        d      |d   %d|d   cxk  rdk  st        d       t        d      |d   |d   dk  rt        d      |d   |d   dk  rt        d      |S # t        $ r t        d	      w xY w)z(Validate api key, python package exists.rB   rP   r0   r   N)api_keyr/   r    znCould not import google-generativeai python package. Please install it with `pip install google-generativeai`.rE   r9   z+temperature must be in the range [0.0, 1.0]rF   z%top_p must be in the range [0.0, 1.0]rG   ztop_k must be positiverH   z+max_output_tokens must be greater than zero)r   google.generativeaigenerativeai
isinstancer   get_secret_value	configurer1   GenerativeModelImportError
ValueError)rX   valuesrB   r0   genais        r&   validate_environmentzGooglePalm.validate_environmentn   s`    .$&6
 L)
	/.)4!/!@!@!BOONO3
+#(#8#8J#8#Ox #(x  - ,Q&:O5TST5TJKK 6UJKK'?&qF7O/Hq/HDEE 0IDEE'?&6'?a+?566%&2v>Q7RVW7WJKK%  	L 	s   AC8 8Dc                   g }|| j                   | j                  | j                  | j                  | j                  d}|D ]  }| j
                  rt        | |dd||      }|j                  D 	
cg c]?  }	dj                  |	j                  j                  D 
cg c]  }
|
j                   c}
      A }}	}
|j                  |D 	cg c]  }	t        |	       c}	       t        | f| j                  |dd|d|}g }|j                  D ]-  }|d   }t        |      }|j                  t        |             / |j                  |        t!        |	      S c c}
w c c}
}	w c c}	w )
N)stop_sequencesrE   rF   rG   rH   candidate_countFT)r   r   r#   r   r    r=   )modelr   r   r#   r   output)generations)rE   rF   rG   rH   rJ   r#   r,   
candidatesjoincontentpartsr=   appendr   r0   r?   r   )rN   promptsstopr   r$   rn   r   r   rescpro   prompt_generations	candidateraw_textstripped_texts                   r&   	_generatezGooglePalm._generate   sr    /1"++ZZZZ!%!7!7#vv
  	7F~~+! " +&7 ILCDBGGQYY__=QVV=>
  ""
#K1JA$6#KL+//! # + ( &("!$ NI(2H$CH$MM&--jm.LMN ""#56;	7> [11) > $Ls   0(E E+	E E&
E c              +     K   |j                  di       }|r||d<   t        | |fdd||d|D ]F  }t        |j                        }|r(|j	                  |j                  || j
                         | H y w)Nr   rh   T)r   r#   r   r   rk   )chunkverbose)r   r,   r   r=   on_llm_new_tokenr   )rN   r   ru   r   r$   r   stream_respr   s           r&   _streamzGooglePalm._stream   s      #JJ':B?26./0
 #/
 
 	K $)9)9:E,,$$ LL - 
 K!	s   A6A8c                     y)zReturn type of llm.rW   r   rM   s    r&   	_llm_typezGooglePalm._llm_type   s     r(   c                    | j                   rt        d      | j                  j                  | j                  |      }|d   S )a  Get the number of tokens present in the text.

        Useful for checking if an input will fit in a model's context window.

        Args:
            text: The string input to tokenize.

        Returns:
            The integer number of tokens in the text.
        z%Counting tokens is not yet supported!)rl   r   token_count)r#   rc   r    count_text_tokensr0   )rN   r=   results      r&   get_num_tokenszGooglePalm.get_num_tokens   s?     >>DEE..T__T.Rm$$r(   )r*   r)   )r*   zDict[str, str])r*   	List[str])rd   r   r*   r   )NN)
rt   r   ru   Optional[List[str]]r   "Optional[CallbackManagerForLLMRun]r$   r   r*   r   )
r   rC   ru   r   r   r   r$   r   r*   zIterator[GenerationChunk])r*   rC   )r=   rC   r*   rI   )__name__
__module____qualname____doc____annotations__r0   rE   rF   rG   rH   rJ   r   propertyr#   rQ   classmethodrS   rY   r   rf   r}   r   r   r   r   r(   r&   r   r   >   sr    K''-J-K!E?!XE='+}+(AsJIK@1 1 4 4   4 4 $ $R %):>	/2/2 "/2 8	/2
 /2 
/2h %):>	 " 8	
  
#8  %r(   )FFN)r%   r   r   r   r#   r)   r   r)   r   r   r$   r   r*   r   )r0   rC   r*   r)   )r=   rC   r*   rC   ) 
__future__r   typingr   r   r   r   r   langchain_core._api.deprecationr	   langchain_core.callbacksr
   langchain_core.language_modelsr   langchain_core.outputsr   r   r   langchain_core.utilsr   r   pydanticr   r   langchain_community.llmsr   &langchain_community.utilities.vertexair   r,   r1   r?   r   r   r(   r&   <module>r      s    " 6 6 6 = = I I ? ) , I 6:	  	
 4  	:"
 H)TUv%) v% Vv%r(   