o
    Ej                     @   s   d dl 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mZ d dlmZ d dlZd dlmZmZ ed	geegd
d Zed	geegdd Zed	geegdedefddZdS )    )api_viewpermission_classes)AllowAny)Responsestatus)AgentConfigAgentVoiceConfigAgentGuardrailAgentSystemTool)connectionsN)_q_identensure_business_cluster_tablesGETc                 C   s    t tjjddd}td|iS )z+List available agent names (for discovery).nameT)flatagents)listr   objectsvalues_listr   )requestnames r   8/var/www/html/livekitdocker/backend/apps/agents/views.py
agent_list   s   r   c              	   C   s`  zt jddddj|d}W n t jy"   tdditjd Y S w t|dd	}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rct|jnd	d|r|rm|jnd	|rs|jnd	|ry|jnd	|r|jnd	|r|jnd	|r|jnd	dni ddd |jjddD ddd |jjddD }t|S )z0Worker fetches full config for an agent by name.voice_config
guardrailssystem_toolsknowledge_base)r   errorzAgent not foundr   Nidr   mcube_exenumber	mcube_gidstt_providertts_providerllm_provider	llm_modelsystem_promptdefault_languagefirst_message_inboundfirst_message_outboundknowledge_base_idvoice)voice_idtts_model_family
similarityspeed	stabilityoutput_formatc                 S      g | ]}|j qS r   )guardrail_key).0gr   r   r   
<listcomp>6       z agent_config.<locals>.<listcomp>T)enabledc                 S   r3   r   )tool_key)r5   tr   r   r   r7   7   r8   ) r   r   prefetch_relatedgetDoesNotExistr   r   HTTP_404_NOT_FOUNDgetattrpkr   r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   strr-   r.   r/   r0   r1   r2   r   filterr   )r   
agent_nameagentr,   datar   r   r   agent_config   sl   
	
rG   business_idbot_idc              	   C   s  z
t |}t |}W n ty   tdditjd Y S w t| | d}td  :}|dt	| d|g |
 }|sPtdditjdW  d	   S d
d |jD }tt||}	W d	   n1 siw   Y  t|	dpz|	dpzd }
i }z`td  P}|d|t||
g |
 }|r|d d	ur|d }t|ttfr|jddd}t|trzt|}W n ty   i }Y nw t|tr|}W d	   n1 sw   Y  W n ty   i }Y nw |dp|dp|dp|	dpd}|d	u rd}t|}d}|	d}t|ttfr'|jddd}t|tr^| r^zt|}t|trPt|dpL|dpLd }W n ty]   d}Y nw dd }||d|d|	d}||d|d|	d|	d }||d!|d"|	d!}||d#|d$|	d#}ti d%|d&|d|d't|d'p|d(p|	d)pd d)t|	d)pd d*t|	d*pd d+t|d+p|	d+pd d,t|d,p|	d,pd d-t|d-p|	d-pd d|d|d.t|d.p.|	d.p.d d!|d#|d/t|d/pD|pDd d0t|d0pW|	d0pWd d1t|d1pj|	d1pjd |	d2|	d3d4S )5z
    Internal helper endpoint for MCube runtime.

    Reads bot settings from cluster DB table `{business_id}_bots` and returns only the subset
    required to start an MCube call (prompt/providers/models/voice/exenumber/gid).
    r   zInvalid business_id or bot_idr   _botsclusterzSELECT * FROM z WHERE bot_id = %s LIMIT 1zBot not foundNc                 S   s   g | ]}|d  qS )r   r   )r5   cr   r   r   r7   S   s    z,cluster_bot_mcube_config.<locals>.<listcomp>bot_namer    z
                SELECT config FROM business_id_bots
                WHERE business_id = %s AND (name = %s OR name = %s)
                ORDER BY updated_at DESC
                LIMIT 1
                r   zutf-8replace)errorsr'   MCUBE_SYSTEM_PROMPTpromptr,   r-   voiceIdc                  W   s0   | D ]}|d u r	qt | }|r|  S qdS )NrN   )rB   strip)valsvsr   r   r   	_pick_str   s   z+cluster_bot_mcube_config.<locals>._pick_strstt_model_idMCUBE_STT_MODEL_IDstt_language_codeMCUBE_STT_LANGUAGE_CODEr(   	tts_modelMCUBE_TTS_MODELtts_encodingMCUBE_TTS_ENCODINGrH   rI   first_messageMCUBE_FIRST_MESSAGEmessage_outboundmessage_inboundr&   r%   r#   r$   tts_voice_idr!   r"   platform_settingsconversation_behavior)rf   rg   )int	Exceptionr   r   HTTP_400_BAD_REQUESTr   r   cursorexecuter   fetchoner?   descriptiondictziprB   r=   rT   
isinstancebytes	bytearraydecodejsonloads)r   rH   rI   bidbot_pktablecurrowcolsrF   rM   override_cfgrrawr'   r-   	voice_raw	voice_objrX   rY   r[   r]   r_   r   r   r   cluster_bot_mcube_config<   s  	
 
	




$	
$$$$$$r   )rest_framework.decoratorsr   r   rest_framework.permissionsr   rest_framework.responser   rest_frameworkr   apps.agents.modelsr   r	   r
   r   	django.dbr   ru   apps.cluster.dynamic_tablesr   r   r   rG   rh   r   r   r   r   r   <module>   s"    &