
    /cj(                     n    d Z ddlZddlmZ ddlZddlZ ej        ej        j                   d Zd Z	dS )a5  
ACRS (Automated Complaint Resolution System) dispatch logic.

Classifies conversations via LLM and POSTs to ACRS API.
Extracted from PipelineSession for maintainability.

All functions take `p` (pipeline session instance) as first argument
to access session state (conversation_log, acrs config, llm, etc.).
    N)datetimec                 	   | j         sdddS d                    d | j         D                       }d}| j        D ]\}d                    d |                    d	g           D                       }|d
|d          d|d          z  }|r	|d| dz  }|dz  }]d                    d | j        D                       }d                    d | j        D                       }d                    d | j        D                       }d|r|nd d|r|nd d|r|nd d|r|nd d| d}t          dt          | j                    d           	 | j	        j
        j                            | j        d|dgd          }	|	j        d          j        j                                        }
|
                    d!          r=|
                    d!d                              d"d                                          }
n=|
                    d"          r(|
                    d"d                                          }
t)          j        |
          }t          d#t)          j        |d$%                      n1# t.          $ r$}t          d&|            dd'| dcY d(}~S d(}~ww xY w| j        pd)t3          j                                        d*          |                    d+          |                    d,          |                    d-          |                    d.          | j        pd/||                    d0d          |                    d1d          |                    d2          d3}| j                                        D ]\  }}||vr|||<   t          d4t)          j        |d$%                      | j        d5d5d6}	 tA          j!        | j"        ||d7d8          }t          d9|j#                    |j#        d:v rwi }	 |                                }n# t.          $ r Y nw xY w|                    d;|                    dd                    }t          d<|            d=d>tI          |          d?S |j%        d(d@         }t          dA|j#         dB|            ddC|j#         dS # t.          $ r$}t          dD|            ddE| dcY d(}~S d(}~ww xY w)Fz}Classify conversation via LLM and POST to ACRS API. Returns result dict.

    Args:
        p: PipelineSession instance.
    FzNo conversation to dispatchsuccessmessage
c              3   P   K   | ]!}d |d          d|d          d|d          V  "dS [	timestampz] speaker: textN .0ms     K/home/m1-ai/DEPLOYMENTS/AI-PHONE/ZACK-UPDATE/fixing_leaked/acrs_dispatch.py	<genexpr>z#dispatch_to_acrs.<locals>.<genexpr>   Z       " " 	:AkN99a	l99ai99" " " " " "     z, c              3   >   K   | ]}d |d          d|d          V  dS )zID idr   nameNr   r   cs     r   r   z#dispatch_to_acrs.<locals>.<genexpr>%   s;      WW!5qw55!F)55WWWWWWr   
categoriesz  - Department ID r   r   r   z (Categories: )c              3   >   K   | ]}d |d          d|d          V  dS )z  - Type ID r   r   r   Nr   )r   ts     r   r   z#dispatch_to_acrs.<locals>.<genexpr>+   s;      VVA?4??AfI??VVVVVVr   c              3   >   K   | ]}d |d          d|d          V  dS z  - Subcategory ID r   r   r   Nr   r   ss     r   r   z#dispatch_to_acrs.<locals>.<genexpr>,   ;      ggQH!D'HHQvYHHggggggr   c              3   >   K   | ]}d |d          d|d          V  dS )z  - Rating ID r   r   r   Nr   )r   rs     r   r   z#dispatch_to_acrs.<locals>.<genexpr>-   s;      \\CQtWCC&	CC\\\\\\r   a  Analyze this customer service conversation and classify it.

Your response MUST be a valid JSON object with these fields:
{
  "departmentId": <integer>,
  "typeId": <integer>,
  "categoryId": <integer>,
  "subCategoryId": <integer>,
  "ratingId": <integer>,
  "summary": "<1-2 sentence summary>",
  "emailSubject": "<short subject/topic>"
}

AVAILABLE OPTIONS:

Departments and their categories:
  (none configured)z	

Types:


Subcategories:
z

Ratings:
ai  

RULES:
- You MUST pick IDs from the options above. Do not invent new IDs.
- If no clear match, pick the closest available option.
- "summary" should be a concise 1-2 sentence description of the conversation.
- "emailSubject" should be a short topic/subject (max 100 chars).
- Response must be valid JSON only, no additional text.

Conversation to analyze:
""""""z![ACRS] Classifying conversation (z messages)...userrolecontent皙?modelmessagestemperaturer   ```json```z[ACRS] Classification:    indentz[ACRS] Classification error: zClassification failed: Nadmin%Y-%m-%ddepartmentIdtypeId
categoryIdsubCategoryIdUnknownsummaryemailSubjectratingId)	spAccountincidentDater<   r=   r>   r?   r   originalEmailContentnocrB   rC   z[ACRS] Payload: application/jsonz	X-API-KEYzContent-TypeAccept
   jsonheaderstimeoutverifyz[ACRS] Response:       caseNoz"[ACRS] Dispatch successful. Case: TzDispatch successfulr   r   case_norR   z[ACRS] Dispatch failed (): API returned z[ACRS] Request error: Request failed: )&conversation_logjoinacrs_departmentsget
acrs_typesacrs_subcategoriesacrs_ratingsprintlenllmchatcompletionscreate	llm_modelchoicesr   r/   strip
startswithreplacerM   loadsdumps	Exceptionacrs_sp_accountr   nowstrftimesession_profileacrs_custom_fieldsitemsacrs_api_keyrequestspostacrs_api_urlstatus_codestrr   )pconversation_text	dept_descdcats	type_descsubcat_descrating_descpromptresponserawclassificationepayloadkvrN   resp	resp_datarV   bodys                        r   dispatch_to_acrsr      s"     L -JKKK 		 " "#" " "   I  yyWWquu\SU?V?VWWWWW@!D'@@QvY@@@	 	21$1111IT				VVVVVVVI))ggRSRfgggggK))\\Q^\\\\\K##  22!## ##& 22'## ##, 6!6-## ##2 6!63## ##F G## ## ##FL 

Tc!2D.E.E
T
T
TUUUL5:)00+%&99: 1 
 

 q!)17799>>)$$ 	1++i,,44UB??EEGGCC^^E"" 	1++eR((..00CCN
>!(L(L(LNNOOOO L L L1a11222 -Jq-J-JKKKKKKKKL &1' //
;;&**>:: $$X..$((66'++O<<!.Y 1!!)R00&**>2>>"&&z22 G $**,,  1GGAJ	
<TZ:::
<
<=== ^*$ G
E}NR
 
 
 	4$"244555z))I IIKK		   mmHimmD".E.EFFG@w@@AAA#0ERUV]R^R^___9TcT?DHT-=HH$HHIII$1SAQ1S1STTT E E E*q**+++ -C-C-CDDDDDDDDEsi   D"I. .
J8JJJ A R+ P R+ 
P# R+ "P##AR+ 55R+ +
S5SSSc                 Z   | j         r$d                    d | j         D                       nd}d}d}g }| j        D ]8}|                    d          | j        k    r|                    dg           } n9d                    d |D                       }	d                    d | j        D                       }
|s| j        r|s|rd	|	r|	nd
 d|
r|
nd
 d| d| d	}t          d           	 | j        j        j	        
                    | j        d|dgd          }|j        d         j        j                                        }|                    d          r=|                    dd                              dd                                          }n=|                    d          r(|                    dd                                          }t%          j        |          }|                    d          }|                    d          }t          d| d|            n)# t(          $ r}t          d|            Y d}~nd}~ww xY w| j        pdt-          j                                        d          | j        | j        ||| j        |p| j        pd|d| d | d!| d"|dd#          d$}| j                                        D ]\  }}||vr|||<   t          d%t%          j        |d&'                      | j        d(d(d)}	 tA          j!        | j"        ||d*d+,          }t          d-|j#                    |j#        d.v rwi }	 |                                }n# t(          $ r Y nw xY w|                    d/|                    dd                    }t          d0|            d1d2tI          |          d3S |j%        dd4         }t          d5|j#         d6|            d+d7|j#         d8S # t(          $ r$}t          d9|            d+d:| d8cY d}~S d}~ww xY w);a#  POST callback request to ACRS API.

    Department/type/rating from defaults, category/subcategory from LLM.

    Args:
        p: PipelineSession instance.
        customer_name: Customer's name.
        customer_phone: Customer's phone number.
        reason: Reason for the callback.
    r   c              3   P   K   | ]!}d |d          d|d          d|d          V  "dS r
   r   r   s     r   r   z,dispatch_callback_to_acrs.<locals>.<genexpr>   r   r   r   Nr   r   c              3   >   K   | ]}d |d          d|d          V  dS )z  - Category ID r   r   r   Nr   r   s     r   r   z,dispatch_callback_to_acrs.<locals>.<genexpr>   s;      VVqBAdGBBqyBBVVVVVVr   c              3   >   K   | ]}d |d          d|d          V  dS r#   r   r$   s     r   r   z,dispatch_callback_to_acrs.<locals>.<genexpr>   r&   r   zClassify this callback request into a category and subcategory.

Your response MUST be a valid JSON object:
{"categoryId": <integer or null>, "subCategoryId": <integer or null>}

AVAILABLE OPTIONS:

Categories:
r)   r*   z

RULES:
- Pick IDs from the options above only. Do not invent new IDs.
- If no clear match, pick the closest available option.
- Response must be valid JSON only, no additional text.

Callback reason: z

Conversation:
"""r+   z3[ACRS Callback] Classifying category/subcategory...r,   r-   r0   r1   r   r5   r6   r>   r?   z+[ACRS Callback] Classification: categoryId=z, subCategoryId=z;[ACRS Callback] Classification error (proceeding without): r:   r;   r@   z
Callback: z (z). Reason: zCallback Request: P   )rD   rE   r<   r=   r>   r?   rC   r   rF   rG   rB   z[ACRS Callback] Payload: r7   r8   rH   rI   rK   FrL   z[ACRS Callback] Response: rQ   rT   z+[ACRS Callback] Dispatch successful. Case: TzCallback dispatch successfulrU   rR   z![ACRS Callback] Dispatch failed (rW   rX   r   z[ACRS Callback] Request error: rY   )&rZ   r[   r\   r]   acrs_callback_dept_idr_   ra   rc   rd   re   rf   rg   rh   r   r/   ri   rj   rk   rM   rl   rn   ro   r   rp   rq   acrs_callback_type_idacrs_callback_rating_idrr   rs   rt   rm   ru   rv   rw   rx   ry   rz   r   )r{   customer_namecustomer_phonereasonr|   category_idsubcategory_id	dept_catsr~   cat_descr   r   r   r   r   r   r   r   r   rN   r   r   rV   r   s                           r   dispatch_callback_to_acrsr      s    
	$		 " "#" " "    "$  KN I  55;;!111lB//IE 2 yyVVIVVVVVH))ggRSRfgggggK )UQ) )U0A )UV )U# 00# # 6!6# #$ %# #* +# # #. 	DEEE	Uuz-44k#)f==> 5  H
 "1%-5;;==C~~i(( 5kk)R0088CCIIKK&& 5kk%,,2244!Z__N(,,\::K+//@@Nmmm]kmmnnnn 	U 	U 	USPQSSTTTTTTTT	U &1' //
;;/)!'-?!2?i 1PMPP^PPPP:VCRC[:: G $**,,  1GGAJ	
Edj&C&C&C
E
EFFF ^*$ G
E}NR
 
 
 	=4+;==>>>z))I IIKK		   mmHimmD".E.EFFGIIIJJJ#0N[^_f[g[ghhh9TcT?DQd6FQQ4QQRRR$1SAQ1S1STTT E E E333444 -C-C-CDDDDDDDDEsc   -D;H) )
I3I

IA O< M' &O< '
M41O< 3M44AO< 5O< <
P*P%P*%P*)
__doc__rM   r   rv   urllib3disable_warnings
exceptionsInsecureRequestWarningr   r   r   r   r   <module>r      s               +B C C CDE DE DENvE vE vE vE vEr   