o
    i2                  +   @   sL  d 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	m
Z
 G dd deZd	ee fd
dZddddddddddddddddddddddee dee deee  dee dee dee dee dee dee dee dee dee dee dedededed ed!ed"ed	ef*d#d$Zd%ed	efd&d'Zd(ed	efd)d*ZdS )+zKValidation and configuration building for non-interactive project creation.    N)Path)Optional)ProjectConfig)ServiceLoaderServiceRegistryc                       s*   e Zd ZdZdee f fddZ  ZS )ConfigValidationErrorzRaised when project configuration validation fails.

    Collects all validation errors so agents see every problem at once.
    errorsc                    s.   || _ dddd |D  }t | d S )Nz!Configuration validation failed:

c                 s   s    | ]}d | V  qdS )z  - N ).0er
   r
   P/home/ubuntu/.local/lib/python3.10/site-packages/pipecat_cli/config_validator.py	<genexpr>       z1ConfigValidationError.__init__.<locals>.<genexpr>)r   joinsuper__init__)selfr   msg	__class__r
   r   r      s   zConfigValidationError.__init__)__name__
__module____qualname____doc__liststrr   __classcell__r
   r
   r   r   r      s    r   returnc                 C   s   dd | D S )z>Extract valid value strings from a list of ServiceDefinitions.c                 S   s   g | ]}|j qS r
   )value)r   svcr
   r
   r   
<listcomp>   s    z%_get_valid_values.<locals>.<listcomp>r
   )service_listr
   r
   r   _get_valid_values   s   r#   FT)namebot_type	transportmodesttllmttsrealtimevideoclient_frameworkclient_serverdaily_pstn_modetwilio_daily_sip_mode	recordingtranscriptionvideo_inputvideo_outputdeploy_to_cloudenable_krispobservabilityr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   c           %   	   C   s|  g }| s	| d |s| d n|dvr| d| d |s%| d |s-| d n|dvr:| d	| d tjtj }t|}d
dh}ttj}ttj}g }|r|D ]t}|d
kr|sf| d qX|dvrt| d| d qXd|dd }| | qX|dkr|s| d qX|dvr| d| d qXd|dd }| | qX||v r| | qXtt||B }| d| dd|  qX|r|r|D ]}|dkr||v r| d| d q|dkr||v r	 q|dkrd|s| d n|ttj	vr| d| ddttj	  |s | d  n|ttj
vr9| d!| ddttj
  |sB| d" n|ttjvr[| d#| ddttj  |rc| d$ n?|d%kr|sr| d& n|ttjvr| d'| ddttj  |r| d( |r| d) |r| d* |r|ttjvr| d+| ddttj  |dkr| d, d-}|	}|
} |	r|	d.vr| d/|	 d |dkr| d0 |	d1krd2}|
r|
d3vr| d4|
 d n|	d5krd2}d6} n|	d7krd8}|
r|	s| d9 |r,|dkr,| d: |r9|dkr9| d; |rD|sD| d< |r`|r`d
|vr`td=d> |D }!|!s`| d? |r||r|d|vr|td@d> |D }"|"s|| dA |rt||rd2}d8}#d8}$|D ]%}|dBkrdC}#q|dDkrdE}#q|dFkrdC}$q|dGkrdE}$qtd]i dH| dI|dJ|dK|dL|dkr|nd8dM|dkr|nd8dN|dkr|nd8dO|d%kr|n+d8dP|dQ|dR|dS| dT|#dU|$dV|dW|dX|dY|dZ|d[|d\|S dP|dQ|dR|dS| dT|#dU|$dV|dW|dX|dY|dZ|d[|d\|S )^zValidate all inputs and build a ProjectConfig.

    Collects all errors before raising, so callers see every problem at once.

    Returns:
        A fully-populated ProjectConfig.

    Raises:
        ConfigValidationError: If any validation fails.
    z--name is requiredz)--bot-type is required (web or telephony))web	telephonyz.--bot-type must be 'web' or 'telephony', got ''z$At least one --transport is requiredz(--mode is required (cascade or realtime))cascader+   z---mode must be 'cascade' or 'realtime', got '
daily_pstntwilio_daily_sipzR--daily-pstn-mode is required when transport is 'daily_pstn' (dial-in or dial-out))dial-indial-outz8--daily-pstn-mode must be 'dial-in' or 'dial-out', got 'daily_pstn_- z^--twilio-daily-sip-mode is required when transport is 'twilio_daily_sip' (dial-in or dial-out)z>--twilio-daily-sip-mode must be 'dial-in' or 'dial-out', got 'twilio_daily_sip_zUnknown transport 'z'. Valid transports: z, r8   zTransport 'z0' is a telephony transport but bot-type is 'web'r9   r;   z"--stt is required for cascade modezUnknown STT service 'z
'. Valid: z"--llm is required for cascade modezUnknown LLM service 'z"--tts is required for cascade modezUnknown TTS service 'z2--realtime should not be specified in cascade moder+   z(--realtime is required for realtime modezUnknown realtime service 'z.--stt should not be specified in realtime modez.--llm should not be specified in realtime modez.--tts should not be specified in realtime modezUnknown video service 'z.Video services are only available for web botsF)reactvanillanonez?--client-framework must be 'react', 'vanilla', or 'none', got 'z1--client-framework is only available for web botsrD   T)vitenextjsz1--client-server must be 'vite' or 'nextjs', got 'rE   rG   rF   Nz+--client-server requires --client-frameworkz,--video-input is only available for web botsz---video-output is only available for web botsz)--enable-krisp requires --deploy-to-cloudc                 s       | ]}| d V  qdS )r<   N
startswithr   tr
   r
   r   r      r   z,validate_and_build_config.<locals>.<genexpr>z9--daily-pstn-mode specified but no 'daily_pstn' transportc                 s   rI   )r=   NrJ   rL   r
   r
   r   r      r   zE--twilio-daily-sip-mode specified but no 'twilio_daily_sip' transportdaily_pstn_dialinr>   daily_pstn_dialoutr?   twilio_daily_sip_dialintwilio_daily_sip_dialoutproject_namer%   
transportsr'   stt_servicellm_servicetts_servicerealtime_servicevideo_servicegenerate_clientr-   r.   r/   r0   r3   r4   r1   r2   r5   r6   enable_observabilityr
   )appendr   WEBRTC_TRANSPORTSTELEPHONY_TRANSPORTSr#   replacesortedsetr   STT_SERVICESLLM_SERVICESTTS_SERVICESREALTIME_SERVICESVIDEO_SERVICESanyr   r   )%r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r   all_transportsvalid_transport_valuesgeneric_transport_nameswebrtc_valuestelephony_valuesresolved_transportsrM   resolved	all_validrY   resolved_client_frameworkresolved_client_serverhas_pstnhas_sipresolved_daily_pstn_moderesolved_twilio_daily_sip_moder
   r
   r   validate_and_build_config"   s  !




























	
	
ru   pathc                 C   s6   t | }t|W  d   S 1 sw   Y  dS )zLoad a JSON config file and return it as a dict.

    Raises:
        FileNotFoundError: If the file does not exist.
        json.JSONDecodeError: If the file is not valid JSON.
    N)openjsonload)rv   fr
   r
   r   load_config_from_file)  s   
$r{   configc                 C   s   i d| j d| jd| jd| jd| jd| jd| jd| jd	| jd
| j	d| j
d| jd| jd| jd| jd| jd| j| j| j| j| jd}tj|ddS )z:Serialize a ProjectConfig to a pretty-printed JSON string.rR   r%   rS   r'   rT   rU   rV   rW   rX   rY   r-   r.   r/   r0   r3   r4   r1   )r2   r5   r6   rZ      )indent)rR   r%   rS   r'   rT   rU   rV   rW   rX   rY   r-   r.   r/   r0   r3   r4   r1   r2   r5   r6   rZ   rx   dumps)r|   datar
   r
   r   config_to_json4  sR   	
r   )r   rx   pathlibr   typingr   pipecat_cli.prompts.questionsr   pipecat_cli.registryr   r   	Exceptionr   r   r   r#   boolru   dictr{   r   r
   r
   r
   r   <module>   s   
	

  	