
    ci              	          d dl Z d dlZd dlZd dl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 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 d	dlmZ  ej.                  d      Z	 ddeeeef   ef   deeeef      deeef   fdZ	 ddeeeef   ef   deeeef      deeef   fdZ	 ddeeeef   ef   deeeef      deeef   fdZ	 ddeeeef   ef   deeeef      deeef   fdZ	 ddeeeef   ef   deeeef      deeef   fdZ 	 ddeeeef   ef   deeeef      deeef   fdZ! G d de
jD                        Z# G d de
jD                        Z$y)    N)AnyOptionalUnion)	urlencode)_api_module)_common)types)get_value_by_path)set_value_by_path   )_logging_utils)_prompt_optimizer_utils)promptszvertexai_genai.promptoptimizerfrom_objectparent_objectreturnc           
          i }t        | dg      #t        |dgt        t        | dg      |             t        | dg      t        |dgt        | dg             |S )N
custom_job	customJobconfig)getvsetv_CustomJob_to_vertexr   r   	to_objects      G/tmp/pip-target-z3e9_cxr/lib/python/vertexai/_genai/prompt_optimizer.py_CustomJobParameters_to_vertexr   '   si     !#IK,(4M kL>!BIN	
 K($0Y
Dxj$AB    c                 2   i }t        |dg      t        |dgt        |dg             t        |dg      t        |dgt        |dg             t        |dg      t        |dgt        |dg             t        | dg      t        |dgt        | dg             t        |dg      t        |dgt        |dg             t        | d	g      t        |d
gt        | d	g             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             |S )NdisplayNamedisplay_namejobSpecjob_specencryptionSpecencryption_specstateerror
createTimecreate_timeendTimeend_timelabelsnamesatisfiesPzisatisfies_pzisatisfiesPzssatisfies_pzs	startTime
start_time
updateTimeupdate_timewebAccessUrisweb_access_urisr   r   r   s      r   _CustomJob_from_vertexr9   9   s4    !#IMM?+7Y($}}o*NOMI;'3Yd=9+&FGM,-.:Y*+T-BRAS-TUK'#/Y	4gY#?@MG9%1Y	4y#ABK,(4YkL>)JKK)%1Yd;&DEK($0Y
Dxj$ABK&".Y${VH"=>K.)*6Y)4n=M+NOK.)*6Y)4n=M+NOK+'3Y[;-(HIK,(4YkL>)JKK/*+7Y*+T+?P-QRr   c                 2   i }t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | d	g      t        |d
gt        | d	g             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             t        | dg      t        |dgt        | dg             |S )Nr!   r    r#   r"   r%   r$   r&   r'   r)   r(   r+   r*   r,   r-   r/   r.   r1   r0   r3   r2   r5   r4   r7   r6   r8   r   s      r   r   r   k   s6    !#IK.)*6]]OT+?O-PQK*&2]YKkJ<)HIK+,-9]-.[CTBU0VWK'#/Y	4gY#?@K'#/]WItK''CDK-)5Y[=/(JKK*&2YT+
|%DEK($0Y
Dxj$ABK&".Y${VH"=>K/*+7Y(${_<M*NOK/*+7Y(${_<M*NOK,(4YtK,'HIK-)5Y[=/(JKK+,-9Y)4>O=P+QRr   c                     i }t        | dg      t        |ddgt        | dg             t        | dg      t        |dgt        | dg             |S )Nr-   _urlr   r8   r   s      r   !_GetCustomJobParameters_to_vertexr=      s^     !#IK&".Y(${VH*EFK($0Y
Dxj$ABr   c                 V    i }t        | dg      t        |dgt        | dg             |S )Noptimization_targetoptimizationTargetr8   r   s      r   _OptimizeConfig_to_vertexrA      sA     !#IK/01=!"456	
 r   c           
          i }t        | dg      t        |dgt        | dg             t        | dg      #t        |dgt        t        | dg      |             |S )Ncontentr   )r   r   rA   r   s      r   $_OptimizeRequestParameters_to_vertexrD      si     !#IK)%1YT+	{%CDK($0J%d;
&CYO	
 r   c                      e Zd ZdZddddeej                     deej                     dej                  fdZ
ddd	ej                  deej                     dej                  fd
Zdddedeej                     dej                  fdZ	 dedej                  fdZ ej&                  d      dej(                  dej*                  dej                  fd       Z ej&                  d      dddedeej                     dej.                  fd       Zddddeej                     deej                     dej.                  fdZy)PromptOptimizerPrompt OptimizerNrC   r   rC   r   r   c                6   t        j                  ||      }| j                  j                  st	        d      t        |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd       d}|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d	|||      }	|	j                   si nt#        j$                  |	j                         }
t         j&                  j)                  |
|j+                         
      }| j                  j-                  |       |S z+
        Optimize a single prompt.
        rH   6This method is only supported in the Vertex AI client.r<   tuningJobs:optimizePrompt_query?r   Npostresponsekwargs)r	   _OptimizeRequestParameters_api_clientvertexai
ValueErrorrD   get
format_mapr   popr   http_optionsr   convert_to_dictencode_unserializable_typesrequestbodyjsonloadsOptimizeResponseEndpoint_from_response
model_dump_verify_responseselfrC   r   parameter_modelrequest_dictrequest_url_dictpathquery_paramsrZ   rQ   response_dictreturn_values               r   _optimize_promptz PromptOptimizer._optimize_prompt   st     ::
 ((UVV?PL+//72==>NO2#''1V1Y|456D4(48"".&&33?*11>>L..|<::<H##++FD,U"*--TZZ5N55DD"?+E+E+G E 
 	)),7r   r   r   c                x   t        j                  ||      }| j                  j                  st	        d      t        |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd       d}|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d	|||      }	|	j                   si nt#        j$                  |	j                         }
| j                  j                  rt'        |
      }
t         j(                  j+                  |
|j-                         
      }| j                  j/                  |       |S z'
        Creates a custom job.
        )r   r   rK   r<   
customJobsrM   rN   r   NrO   rP   )r	   _CustomJobParametersrT   rU   rV   r   rW   rX   r   rY   r   rZ   r   r[   r\   r]   r^   r_   r`   r9   	CustomJobrb   rc   rd   rf   r   r   rg   rh   ri   rj   rk   rZ   rQ   rl   rm   s               r   _create_custom_job_resourcez+PromptOptimizer._create_custom_job_resource  s     44!
 ((UVV9/JL+//7#../?@##''1V1Y|456D4(48"".&&33?*11>>L..|<::<H##++FD,U"*--TZZ5N$$2=AM55"?+E+E+G 6 
 	)),7r   r-   c                x   t        j                  ||      }| j                  j                  st	        d      t        |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd       d}|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d	|||      }	|	j                   si nt#        j$                  |	j                         }
| j                  j                  rt'        |
      }
t         j(                  j+                  |
|j-                         
      }| j                  j/                  |       |S z$
        Gets a custom job.
        )r-   r   rK   r<   zcustomJobs/{name}rM   rN   r   NrW   rP   )r	   _GetCustomJobParametersrT   rU   rV   r=   rW   rX   r   rY   r   rZ   r   r[   r\   r]   r^   r_   r`   r9   rt   rb   rc   rd   rf   r-   r   rg   rh   ri   rj   rk   rZ   rQ   rl   rm   s               r   _get_custom_jobzPromptOptimizer._get_custom_job=  s     77
 ((UVV<_ML+//7*556FG*#''1V1Y|456D4(48"".&&33?*11>>L..|<::<H##++E4|T"*--TZZ5N$$2=AM55"?+E+E+G 6 
 	)),7r   job_namec                    t         j                  j                  t         j                  j                  t         j                  j                  t         j                  j
                  g}t         j                  j                  t         j                  j                  g}d}d}d}t        j                         }| j                  |      }|j                  |vrt        j                         }	|	|z
  |k\  r3t        j                  d|j                          t        ||z  |      }|	}t        j                  |       | j                  |      }|j                  |vrt        j                  d|j                          |j                  |v rt        d|j                         t        j                  d|j                          |S )	N      <   )r-   z,Waiting for job to complete. Current state: zJob state: zJob failed with state: zJob completed with state: )genai_typesJobStateJOB_STATE_SUCCEEDEDJOB_STATE_FAILEDJOB_STATE_CANCELLEDJOB_STATE_PAUSEDtimer{   r&   loggerinfominsleepRuntimeError)
rf   r|   JOB_COMPLETE_STATESJOB_ERROR_STATESlog_waitwait_multipliermax_wait_timeprevious_timejobcurrent_times
             r   _wait_for_completionz$PromptOptimizer._wait_for_completiont  sz      44  11  44  11	
   11  44

 		"""1ii2299;Lm+x7J399+VWx/9=I ,JJx &&H&5C ii22 	k#))-.99((!8DEEKK4SYYK@A
r   gThe prompt_optimizer.optimize method is deprecated. Please use prompts.launch_optimization_job instead.methodc                 h    t        j                  | j                        }|j                  ||      S )ad  Call PO-Data optimizer.

        Args:
          method: The method for optimizing multiple prompts. Supported methods:
            VAPO, OPTIMIZATION_TARGET_GEMINI_NANO.
          config: PromptOptimizerConfig instance containing the
              configuration for prompt optimization.
        Returns:
          The custom job that was created.
        api_client_r   r   )r   PromptsrT   launch_optimization_jobrf   r   r   prompts_modules       r   optimizezPromptOptimizer.optimize  s5    & !T5E5EF55& 6 
 	
r   _The prompt_optimizer.optimize_prompt method is deprecated. Please use prompts.optimize instead.promptc                h    t        j                  | j                        }|j                  ||      S )a  Makes an API request to _optimize_prompt and returns the parsed response.

        Example usage:
        client = vertexai.Client(project=PROJECT_NAME, location='us-central1')
        prompt = "Generate system instructions for analyzing medical articles"
        response = client.prompt_optimizer.optimize_prompt(prompt=prompt)
        print(response.suggested_prompt)

        Args:
          prompt: The prompt to optimize.
          config: Optional.The configuration for prompt optimization. To optimize
            prompts from Android API provide
            types.OptimizeConfig(
                optimization_target=types.OptimizeTarget.OPTIMIZATION_TARGET_GEMINI_NANO
            )
            For few-shot optimization, provide:

            optim_target = types.OptimizeTarget.OPTIMIZATION_TARGET_FEW_SHOT_RUBRICS
            or
            optim_target = types.OptimizeTarget.OPTIMIZATION_TARGET_FEW_SHOT_TARGET_RESPONSE
            types.OptimizeConfig(
                optimization_target=optim_target,
                examples_dataframe=dataframe
            )
            OPTIMIZATION_TARGET_FEW_SHOT_RUBRICS indicates that the few-shot
              examples include specific scoring rubrics and their corresponding
              evaluations.
            OPTIMIZATION_TARGET_FEW_SHOT_TARGET_RESPONSE indicates that the few-shot
              examples include a ground-truth target response.
        Returns:
          The parsed response from the API request.
        r   r   r   )r   r   rT   r   rf   r   r   r   s       r   optimize_promptzPromptOptimizer.optimize_prompt  s6    T !T5E5EF&&& ' 
 	
r   c                *   t        |t              r|j                  dd       n|rt        |d      r|`t        j                  ||      }| j                  j                  st        d      t        |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  d	d       d}|j                  ,|j                  j                  |j                  j                  }t!        j"                  |      }t!        j$                  |      }| j                  j'                  d
|||      }	|	j(                  sdnt+        j,                  |	j(                        }
g }|
D ]  }t
        j.                  j1                  ||j3                               }| j                  j5                  |       |j6                  }|\|j8                  }|sk|d   j:                  {|j=                  |d   j:                          dj?                  |      }t        j@                  |      }	 tC        jD                  |      |_#        |S # tH        $ r$}tJ        jM                  d| d       Y d}~|S d}~ww xY w)zOptimize a single prompt.

        Sends a request to the tuningJobs:optimizePrompt streaming endpoint.
        Then gathers the response, concatenates into one string and returns
        the parsed response.
        examples_dataframeNrH   rK   r<   rL   rM   rN   r   rO    rP   r   raw_text_responseFailed to parse response: #. Returning only raw_text_response.)'
isinstancedictrY   hasattrr   r	   rS   rT   rU   rV   rD   rW   rX   r   r   rZ   r   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   rC   partstextappendjoinOptimizeResponser   _parseparsed_response	Exceptionr   warningrf   rC   r   rg   rh   ri   rj   rk   rZ   rQ   response_listrm   rl   response_valuer   outputfinal_responsees                     r   _custom_optimize_promptz'PromptOptimizer._custom_optimize_prompt  sf    fd#JJ+T2(<=)::

 ((UVV?PL+//72==>NO2#''1V1Y|456D4(:>"".&&33?*11>>L..|<::<H##++FD,U"*--TZZ5N* 		7M";;JJ&/I/I/K K N --n=$,,G"U1X]]6 ''a6		7 &//&I	-D-K-KF-SN*
 	  	NN,QC/RS  		s   	I% %	J.JJ)__name__
__module____qualname____doc__r   r   ContentOrDictr	   OptimizeConfigOrDictra   rn   CustomJobOrDictVertexBaseConfigOrDictrt   rv   strr{   r   r   show_deprecation_warning_oncePromptOptimizerMethodPromptOptimizerConfigOrDictr   r   r   r    r   r   rF   rF      s   
 8<7;	3 +3343 334	3
 
	'	'3r :>	6 ))6 556	6
 
6r NR33$,U-I-I$J3	3j $#S #U__ #J 2^11	4
++
 11
 
	
	
* 2^11	% 8<	*
 *
 334	*

 
		*
	*
^ 8<7;	I +334I 334	I
 
		Ir   rF   c                   h   e Zd ZdZddddeej                     deej                     dej                  fdZ
ddd	ej                  deej                     dej                  fd
Zdddedeej                     dej                  fdZ ej$                  d      dej&                  dej(                  dej                  fd       Zddddeej                     deej                     dej,                  fdZ ej$                  d      dddedeej                     dej,                  fd       Zy)AsyncPromptOptimizerrG   NrH   rC   r   r   c                R  K   t        j                  ||      }| j                  j                  st	        d      t        |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd       d}|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d	|||       d{   }	|	j                   si nt#        j$                  |	j                         }
t         j&                  j)                  |
|j+                         
      }| j                  j-                  |       |S 7 }wrJ   )r	   rS   rT   rU   rV   rD   rW   rX   r   rY   r   rZ   r   r[   r\   async_requestr^   r_   r`   ra   rb   rc   rd   re   s               r   rn   z%AsyncPromptOptimizer._optimize_prompt1  s      ::
 ((UVV?PL+//72==>NO2#''1V1Y|456D4(48"".&&33?*11>>L..|<::<H))77D,
 
 #+--TZZ5N55DD"?+E+E+G E 
 	)),7
s   D%F''F%(A>F'ro   r   c                  K   t        j                  ||      }| j                  j                  st	        d      t        |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd       d}|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d	|||       d{   }	|	j                   si nt#        j$                  |	j                         }
| j                  j                  rt'        |
      }
t         j(                  j+                  |
|j-                         
      }| j                  j/                  |       |S 7 wrq   )r	   rs   rT   rU   rV   r   rW   rX   r   rY   r   rZ   r   r[   r\   r   r^   r_   r`   r9   rt   rb   rc   rd   ru   s               r   rv   z0AsyncPromptOptimizer._create_custom_job_resourceh  s      44!
 ((UVV9/JL+//7#../?@##''1V1Y|456D4(48"".&&33?*11>>L..|<::<H))77D,
 
 #+--TZZ5N$$2=AM55"?+E+E+G 6 
 	)),7
   D%G'G(BGr-   c                  K   t        j                  ||      }| j                  j                  st	        d      t        |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  dd       d}|j                  ,|j                  j                  |j                  j                  }t        j                  |      }t        j                  |      }| j                  j                  d	|||       d{   }	|	j                   si nt#        j$                  |	j                         }
| j                  j                  rt'        |
      }
t         j(                  j+                  |
|j-                         
      }| j                  j/                  |       |S 7 wrx   )r	   ry   rT   rU   rV   r=   rW   rX   r   rY   r   rZ   r   r[   r\   r   r^   r_   r`   r9   rt   rb   rc   rd   rz   s               r   r{   z$AsyncPromptOptimizer._get_custom_job  s      77
 ((UVV<_ML+//7*556FG*#''1V1Y|456D4(48"".&&33?*11>>L..|<::<H))774|
 
 #+--TZZ5N$$2=AM55"?+E+E+G 6 
 	)),7
r   r   r   c                    K   t        j                  | j                        }|j                  ||       d{   S 7 w)a  Call async Vertex AI Prompt Optimizer (VAPO).


        Note: The `wait_for_completion` parameter in the config will be
        ignored when using the AsyncClient, as it is not supported.

        Example usage:
        client = vertexai.Client(project=PROJECT_NAME, location='us-central1')
        vapo_config = vertexai.types.PromptOptimizerConfig(
            config_path='gs://you-bucket-name/your-config.json',
            service_account=service_account,
        )
        job = await client.aio.prompt_optimizer.optimize(
            method=types.PromptOptimizerMethod.VAPO, config=vapo_config)

        Args:
          method: The method for optimizing multiple prompts. Supported methods:
            VAPO, OPTIMIZATION_TARGET_GEMINI_NANO.
          config: PromptOptimizerConfig instance containing the
            configuration for prompt optimization.
        Returns:
          The custom job that was created.
        r   r   N)r   AsyncPromptsrT   r   r   s       r   r   zAsyncPromptOptimizer.optimize  sF     @ !--$:J:JK#;;& < 
 
 	
 
   7A >A c                H  K   t        |t              r|j                  dd       n|rt        |d      r|`t        j                  ||      }| j                  j                  st        d      t        |      }|j                  d      }|rdj                  |      }nd}|j                  d      }|r| dt        |       }|j                  d	d       d}|j                  ,|j                  j                  |j                  j                  }t!        j"                  |      }t!        j$                  |      }| j                  j'                  d
|||       d{   }	|	j(                  sdnt+        j,                  |	j(                        }
g }|
D ]  }t
        j.                  j1                  ||j3                               }| j                  j5                  |       |j6                  }|\|j8                  }|sk|d   j:                  {|j=                  |d   j:                          dj?                  |      }t        j@                  |      }	 tC        jD                  |      |_#        |S 7 # tH        $ r$}tJ        jM                  d| d       Y d}~|S d}~ww xY ww)zOptimize a single prompt.r   NrH   rK   r<   rL   rM   rN   r   rO   r   rP   r   r   r   r   )'r   r   rY   r   r   r	   rS   rT   rU   rV   rD   rW   rX   r   r   rZ   r   r[   r\   r   r^   r_   r`   ra   rb   rc   rd   rC   r   r   r   r   r   r   r   r   r   r   r   r   s                     r   r   z,AsyncPromptOptimizer._custom_optimize_prompt   sx     fd#JJ+T2(<=)::

 ((UVV?PL+//72==>NO2#''1V1Y|456D4(48"".&&33?*11>>L..|<::<H))77D,
 
 #+--TZZ5N* 		7M";;JJ&/I/I/K K N --n=$,,G"U1X]]6 ''a6		7 &//&I	-D-K-KF-SN*
 7
.  	NN,QC/RS  		sP   EJ"I/BJ",J";J"AJ"I2 -J"2	J;JJ"JJ"r   r   c                   K   t        j                  | j                        }|j                  ||       d{   S 7 w)a  Makes an async request to _optimize_prompt and returns an optimized prompt.

        Example usage:
        client = vertexai.Client(project=PROJECT_NAME, location='us-central1')
        prompt = "Generate system instructions for analyzing medical articles"
        response = await client.aio.prompt_optimizer.optimize_prompt(prompt=prompt)

        Args:
          prompt: The prompt to optimize.
          config: Optional.The configuration for prompt optimization. To optimize
            prompts from Android API provide
            types.OptimizeConfig(
                optimization_target=types.OptimizeTarget.OPTIMIZATION_TARGET_GEMINI_NANO
            )
            For few-shot optimization, provide:
            optim_target = types.OptimizeTarget.OPTIMIZATION_TARGET_FEW_SHOT_RUBRICS # or types.OptimizeTarget.OPTIMIZATION_TARGET_FEW_SHOT_TARGET_RESPONSE
            types.OptimizeConfig(
                optimization_target=optim_target,
                examples_dataframe=dataframe
            )
            OPTIMIZATION_TARGET_FEW_SHOT_RUBRICS indicates that the few-shot
              examples include specific scoring rubrics and their corresponding
              evaluations.
            OPTIMIZATION_TARGET_FEW_SHOT_TARGET_RESPONSE indicates that the few-shot
              examples include a ground-truth target response.
        Returns:
          The parsed response from the API request.
        r   r   N)r   r   rT   r   r   s       r   r   z$AsyncPromptOptimizer.optimize_promptH  sF     L !--$:J:JK#,,& - 
 
 	
 
r   )r   r   r   r   r   r   r   r	   r   ra   rn   r   r   rt   rv   r   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   .  s   
 8<7;	5 +3345 334	5
 
	'	'5v :>	8 ))8 556	8
 
8v NR55$,U-I-I$J5	5p 2^11	4 
++ 
 11 
 
	 
	 
J 8<7;	F +334F 334	F
 
		FP 2^11	% 8<	&
 &
 334	&

 
		&
	&
r   r   )N)%r_   loggingr   typingr   r   r   urllib.parser   google.genair   r   r	   r   google.genai._commonr
   r   r   r   r   r   r   r   	getLoggerr   r   r   objectr   r9   r   r=   rA   rD   
BaseModulerF   r   r   r   r   <module>r      s6  $    ' ' " $   - : :  %   
		;	<
 /3tCH~v-.DcN+ 
#s(^( /3/tCH~v-./DcN+/ 
#s(^/h /3/tCH~v-./DcN+/ 
#s(^/h /3tCH~v-.DcN+ 
#s(^  /3tCH~v-.DcN+ 
#s(^$ /3tCH~v-.DcN+ 
#s(^$^k,, ^BD
;11 D
r   