
    ci3                         d Z ddl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
Z
ddlmZ ddlmZ e	rddlmZ  ej                  e      Z G d d	      Z G d
 d      Z e       ZeZy)zUtility functions for evals.    N)AnyOptionalUnionTYPE_CHECKING   )_evals_constant)
_gcs_utilstypesc                       e Zd ZU dZi Zeedf   ed<   dZddede	e   de
fd	Zd
e	e   fdZd
e	d   fdZde
ded
efdZde
d
dfdZde
d
dfdZ	 dde	e   de
d
d fdZy)LazyLoadedPrebuiltMetriczA proxy object representing a prebuilt metric to be loaded on demand.

    This can resolve to either an API Predefined Metric or an LLM Metric
    loaded from GCS.
    ztypes.Metric_cachezFgs://vertex-ai-generative-ai-eval-sdk-resources/metrics/{metric_name}/Nnameversionkwargsc                 X    |j                         | _        || _        || _        d | _        y N)upperr   r   metric_kwargs_resolved_metricselfr   r   r   s       L/tmp/pip-target-z3e9_cxr/lib/python/vertexai/_genai/_evals_metric_loaders.py__init__z!LazyLoadedPrebuiltMetric.__init__/   s&    JJL	#:>    returnc                    | j                   j                         }| j                  r7| j                  j                         }| d| }|t        j                  v r|S dS | d}|t        j                  v r|S |t        j                  v r|S y)z;Constructs the metric_spec_name for API Predefined Metrics._N_v1)r   lowerr   r   SUPPORTED_PREDEFINED_METRICS)r   	base_namer   potential_namev1_names        r   _get_api_metric_spec_namez2LazyLoadedPrebuiltMetric._get_api_metric_spec_name5   s    IIOO%	<<ll((*G ){!G95N "_%Q%QQ   #3'G/FFFOHHH  r   c                     ddl m} | j                         }|r?t        j	                  d| j
                  |        |j                  dd|i| j                  S y)z0Attempts to resolve as an API Predefined Metric.r   r
   z:Resolving '%s' as API Predefined Metric with spec name: %sr   N ) r   r%   loggerinfor   Metricr   )r   r   metric_spec_names      r   _resolve_api_predefinedz0LazyLoadedPrebuiltMetric._resolve_api_predefinedJ   sU    99;KKL		 
  5<<L%5L9K9KLLr   
api_clientmetric_gcs_dirc                 Z   t        j                  |      }|j                  |      \  }}|j                  j	                  ||      }g }t        j                  dt
        j                        }|D ]  }	|j                  t        j                  j                  |	j                              }
|
s>t        |
j                  d            }|
j                  d      rt        |
j                  d            nd}|
j                  d      rt        |
j                  d            nd}|j                  |||gt        j                  j                  |	j                        d        |st!        d|       |j#                  d	 d
       |d   d   }t        j                  j%                  ||      S )zCLists files in GCS directory and determines the latest version URI.)prefixz0v(\d+)(?:\.(\d+))?(?:\.(\d+))?\.(yaml|yml|json)$r      r      )version_partsfilenamez#No versioned metric files found in c                     | d   S )Nr4   r'   )xs    r   <lambda>zBLazyLoadedPrebuiltMetric._get_latest_version_uri.<locals>.<lambda>w   s    ?); r   T)keyreverser5   )r	   GcsUtilsparse_gcs_pathstorage_client
list_blobsrecompile
IGNORECASEmatchospathbasenamer   intgroupappendIOErrorsortjoin)r   r.   r/   	gcs_utilsbucket_namer1   blobsversion_filesversion_patternblobrB   majorminorpatchlatest_filenames                  r   _get_latest_version_uriz0LazyLoadedPrebuiltMetric._get_latest_version_uriX   sn   ''
3	'66~FV((33K3O  	 **?
  	D#))"''*:*:499*EFEEKKN+/4{{1~EKKN+1/4{{1~EKKN+1$$*/)>$&GG$4$4TYY$?	 ??OPQQ;TJ'*:6ww||NO<<r   ztypes.LLMMetricc           	      H   ddl m} | j                  j                  | j                  j                               }| j                  dk(  s| j                  | j                  ||      }t        j                  dt        j                  j                  |      t        j                        }|r|j                  d      | _        not        j                  j                  t        j                  j                  |            d   | _        n)t        j                  j!                  || j                   d      }t        j                  j!                  || j                   d	      }t#        j$                  |      }	 |j'                  |      \  }	}
|j(                  j+                  |	      j-                  |
      j/                         r|}nj|j'                  |      \  }}|j(                  j+                  |      j-                  |      j/                         r|}nt1        d
| j                   d|       t4        j7                  d| j                  | j                  |       t#        j$                  |      }|j9                  |      }t        j                  j                  |      d   j                         }|dk(  s|dk(  r't:        t=        d      t;        j>                  |      }n)|d	k(  rtA        jB                  |      }ntE        d|       tG        |tH              stE        d      |jJ                  jM                  i || jN                        }d|_(        ||_)        | j                  |_*        |S # t2        $ r$}t1        d| j                   d| d|       |d}~ww xY w)z2Fetches and parses the metric definition from GCS.r   r
   )metric_namelatestNz#(v\d+(?:\.\d+)*)\.(?:yaml|yml|json)r   z.yamlz.jsonzMetric file for version 'z!' not found as .yaml or .json in z(Error checking for metric file version 'z' in z: z-Fetching predefined metric '%s@%s' from %s...z.ymlzsYAML parsing requires the pyyaml library. Please install it with `pip install google-cloud-aiplatform[evaluation]`.zUnsupported file extension: z6Metric config content did not parse into a dictionary.T)+r(   r   _base_gcs_pathformatr   r    r   rV   r?   rB   rC   rD   rE   rA   rG   splitextrK   r	   r;   r<   r=   bucketrQ   existsrI   	Exceptionr)   r*   read_file_contentsyamlImportError	safe_loadjsonloads
ValueError
isinstancedict	LLMMetricmodel_validater   _is_predefined_config_source_version)r   r.   r   r/   uriresolved_version_matchyaml_urijson_urirL   rM   	blob_pathbucket_name_jsonblob_path_jsonecontent_strfile_extensiondata
metric_objs                     r   _fetch_and_parsez)LazyLoadedPrebuiltMetric._fetch_and_parse|   s:    	,,33		@Q3R<<8#t||';..z>JC%'XX6  %&"
 &5;;A>  "ww//0@0@0EFqIww||Nt||nE4JKHww||Nt||nE4JKH"++J7I)2)A)A()K&Y,,33K@T)_VX #C7@7O7O 84$n "00778HIn-" '%7~ F>>L=MO  	;IILL		
 ''
3	2237))#.q1779W$&(@|!O  >>+.Dw&::k*D;N;KLMM$%UVV__334Rt4Rt?Q?Q4RS
$(
!$'
!"ll
K  >t||n M&'r!. s   :B9M4 4	N!=NN!c                     | j                   r| j                   S | j                   d| j                  xs d }|t        j                  v r:t        j                  |   | _         t
        j                  d|       | j                   S | j                         }|r0|| _         | j                   t        j                  |<   | j                   S t
        j                  d| j                         	 | j                  |      }| j                   d| j                   }|t        j                  |<   || _         | j                   S # t        $ rK}t
        j                  d| j                  | j                  |       t        d| j                   d      |d}~ww xY w)	zJResolves the metric by checking API Predefined, then GCS, caching results.@defaultzMetric '%s' found in cache.z7Metric '%s' not an API Predefined Metric, trying GCS...z<Error loading metric %s (requested version: %s) from GCS: %szMetric 'zG' could not be resolved as an API Predefined Metric or loaded from GCS.N)r   r   r   r   r   r)   debugr-   rz   r_   errorrf   )r   r.   	cache_key
api_metric
gcs_metricfinal_cache_keyru   s          r   resolvez LazyLoadedPrebuiltMetric.resolve   sr     (((yyk4<<#<9"=>	0777$<$C$CI$ND!LL6	B((( 113
$.D!9=9N9N$++I6((( 	Etyy	
	..z:J!%1T\\N;O?I$++O<$.D!((( 
	LLN			 499+ &8 8 
	s   'AD9 9	FAFFc                     | j                   j                         }|j                  |       t        d| j                  |xs | j
                  d|S )z>Allows setting a specific version and other metric attributes.r   r   r'   )r   copyupdater   r   r   )r   r   r   updated_kwargss       r   __call__z!LazyLoadedPrebuiltMetric.__call__   sR     ++002f%' 
G$;t||
?M
 	
r   r   )__name__
__module____qualname____doc__r   rh   str__annotations__rZ   r   r   r   r%   r-   rV   rz   r   r   r'   r   r   r   r   #   s     )+FDn$%*P ?S ?8C= ?3 ?8C= *.)A "=# "=s "=s "=HT3 T3D Tl&# &. &R (,
}
7:
	#
r   r   c            	          e Zd ZdZ	 ddedee   dedefdZe	defd       Z
e	defd	       Ze	defd
       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Ze	defd       Zy)PrebuiltMetricLoaderao  Provides access to predefined evaluation metrics via attributes.

    This class provides a set of predefined LLM-based metrics (Autorater recipes)
    for evaluation. These metrics are lazily loaded from a GCS repository
    when they are first accessed.

    Example:
      from vertexai import types
      text_quality_metric = types.RubricMetric.TEXT_QUALITY
    Nr   r   r   r   c                     t        d||d|S )Nr   r'   )r   r   s       r   __getattr__z PrebuiltMetricLoader.__getattr__  s     (MT7MfMMr   c                 $    | j                  d      S )NGENERAL_QUALITYr   r   s    r   r   z$PrebuiltMetricLoader.GENERAL_QUALITY  s     122r   c                 $    | j                  d      S )NTEXT_QUALITYr   r   s    r   r   z!PrebuiltMetricLoader.TEXT_QUALITY  s    //r   c                 $    | j                  d      S )NINSTRUCTION_FOLLOWINGr   r   s    r   r   z*PrebuiltMetricLoader.INSTRUCTION_FOLLOWING       788r   c                 $    | j                  d      S )NSAFETYr   r   s    r   r   zPrebuiltMetricLoader.SAFETY"  s    ))r   c                 $    | j                  d      S )NMULTI_TURN_GENERAL_QUALITYr   r   s    r   r   z/PrebuiltMetricLoader.MULTI_TURN_GENERAL_QUALITY&       <==r   c                 $    | j                  d      S )NMULTI_TURN_TEXT_QUALITYr   r   s    r   r   z,PrebuiltMetricLoader.MULTI_TURN_TEXT_QUALITY*       9::r   c                 (    | j                  dd      S )NFINAL_RESPONSE_MATCHv2)r   r   r   s    r   r   z)PrebuiltMetricLoader.FINAL_RESPONSE_MATCH.  s     6EEr   c                 $    | j                  d      S )NFINAL_RESPONSE_REFERENCE_FREEr   r   s    r   r   z2PrebuiltMetricLoader.FINAL_RESPONSE_REFERENCE_FREE2  s     ?@@r   c                 $    | j                  d      S )N	COHERENCEr   r   s    r   r   zPrebuiltMetricLoader.COHERENCE6      ,,r   c                 $    | j                  d      S )NFLUENCYr   r   s    r   r   zPrebuiltMetricLoader.FLUENCY:  s    	**r   c                 $    | j                  d      S )N	VERBOSITYr   r   s    r   r   zPrebuiltMetricLoader.VERBOSITY>  r   r   c                 $    | j                  d      S )NSUMMARIZATION_QUALITYr   r   s    r   r   z*PrebuiltMetricLoader.SUMMARIZATION_QUALITYB  r   r   c                 $    | j                  d      S )NQUESTION_ANSWERING_QUALITYr   r   s    r   r   z/PrebuiltMetricLoader.QUESTION_ANSWERING_QUALITYF  r   r   c                 $    | j                  d      S )NMULTI_TURN_CHAT_QUALITYr   r   s    r   r   z,PrebuiltMetricLoader.MULTI_TURN_CHAT_QUALITYJ  r   r   c                 $    | j                  d      S )NMULTI_TURN_SAFETYr   r   s    r   r   z&PrebuiltMetricLoader.MULTI_TURN_SAFETYN  s     344r   c                 $    | j                  d      S )NFINAL_RESPONSE_QUALITYr   r   s    r   r   z+PrebuiltMetricLoader.FINAL_RESPONSE_QUALITYR  s     899r   c                 $    | j                  d      S )NHALLUCINATIONr   r   s    r   r   z"PrebuiltMetricLoader.HALLUCINATIONV  s    00r   c                 $    | j                  d      S )NTOOL_USE_QUALITYr   r   s    r   r   z%PrebuiltMetricLoader.TOOL_USE_QUALITYZ       233r   c                 $    | j                  d      S )NGECKO_TEXT2IMAGEr   r   s    r   r   z%PrebuiltMetricLoader.GECKO_TEXT2IMAGE^  r   r   c                 $    | j                  d      S )NGECKO_TEXT2VIDEOr   r   s    r   r   z%PrebuiltMetricLoader.GECKO_TEXT2VIDEOb  r   r   r   )r   r   r   r   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r   r   r   r     sp   	 37NN"*3-NBEN	!N
 3!9 3 3 06 0 0 9'? 9 9 *0 * * >,D > > ;)A ; ; F&> F F A/G A A -3 - - +1 + + -3 - - 9'? 9 9 >,D > > ;)A ; ; 5#; 5 5 :(@ : : 17 1 1 4": 4 4 4": 4 4 4": 4 4r   r   )r   rd   loggingrC   r?   typingr   r   r   r   ra   r(   r   r	   r   	getLoggerr   r)   r   r   PrebuiltMetricRubricMetricr'   r   r   <module>r      sh    #   	 	 6 6    
		8	$_
 _
D_4 _4D &'r   