Ë
    p›Xj¦  ã                  ó’   — d dl mZ d dlZd dlZd dlmZmZ d dlmZm	Z	m
Z
  G d„ de«      Zdd„Z G d„ d	«      Z G d
„ d«      Zdd„Zy)é    )ÚannotationsN)ÚAnyÚProtocol)ÚretryÚstop_after_attemptÚwait_exponentialc                  ó    — e Zd Zddd„Zddd„Zy)Ú
LLMServicec                 ó   — y ©N© ©ÚselfÚsystemÚuserÚ
max_tokenss       ú4/var/www/html/content_generation/src/services/llm.pyÚcompletezLLMService.complete   s   € Èsó    c                 ó   — y r   r   r   s       r   Úcomplete_jsonzLLMService.complete_json   s   € ÐTWr   N©i   ©r   Ústrr   r   r   ÚintÚreturnr   ©r   r   r   r   r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r
   r
   
   s   „ ÜRåWr   r
   c                ó  — | j                  «       } t        j                  d| «      }|r|j                  d«      j                  «       } 	 t	        j
                  | «      S # t        j                  $ r” | j                  d«      }| j                  d«      }|dk\  r"||kD  rt	        j
                  | ||dz    «      cY S | j                  d«      }| j                  d«      }|dk\  r"||kD  rt	        j
                  | ||dz    «      cY S ‚ w xY w)Nz```(?:json)?\s*([\s\S]*?)```é   Ú{Ú}r   Ú[Ú])	ÚstripÚreÚsearchÚgroupÚjsonÚloadsÚJSONDecodeErrorÚfindÚrfind)ÚtextÚfenceÚstartÚends       r   Úparse_json_looser4      så   € Ø�:‰:‹<€DÜ�I‰IÐ5°tÓ<€EÙØ�{‰{˜1‹~×#Ñ#Ó%ˆðÜ�z‰z˜$ÓÐøÜ×Ñò 	Ø—	‘	˜#“ˆØ�j‰j˜‹oˆØ�AŠ:˜# š+Ü—:‘:˜d 5¨3°©7Ð3Ó4Ò4Ø—	‘	˜#“ˆØ�j‰j˜‹oˆØ�AŠ:˜# š+Ü—:‘:˜d 5¨3°©7Ð3Ó4Ò4Øð	ús   Á	A ÁADÂ:ADÄDc                  ód   — e Zd ZdZdd„Z e ed«       edd¬«      d¬«      ddd	„«       Zddd
„Z	y)Ú	ClaudeLLMu7   Anthropic Claude â€” used for ideation + platform copy.c                óH   — dd l }|j                  |¬«      | _        || _        y )Nr   ©Úapi_key)Ú	anthropicÚ	AnthropicÚclientÚmodel)r   r9   r=   r:   s       r   Ú__init__zClaudeLLM.__init__&   s!   € Ûà×)Ñ)°'Ð)Ó:ˆŒØˆ�
r   é   é   é   ©ÚminÚmaxT©ÚstopÚwaitÚreraisec                ó   — | j                   j                  j                  | j                  ||d|dœg¬«      }|j                  D �cg c]  }t        |dd «      dk(  sŒ|j                  ‘Œ! }}dj                  |«      j                  «       S c c}w )Nr   ©ÚroleÚcontent)r=   r   r   ÚmessagesÚtyper0   Ú
)	r<   rM   Úcreater=   rL   Úgetattrr0   Újoinr'   )r   r   r   r   ÚmsgÚbÚpartss          r   r   zClaudeLLM.complete,   s…   € à�k‰k×"Ñ"×)Ñ)Ø—*‘*Ø!ØØ%°$Ñ7Ð8ð	 *ó 
ˆð "%§¢ÓS¡˜A´¸¸6À4Ó0HÈFÓ0R�—“ ˆÐSØ�y‰y˜Ó×%Ñ%Ó'Ð'ùò Ts   ÁBÁBc                óF   — | j                  |dz   ||¬«      }t        |«      S )Nú3

Respond with valid JSON only. No markdown fences.©r   r   r   )r   r4   )r   r   r   r   Úraws        r   r   zClaudeLLM.complete_json7   s1   € Ø�m‰mØÐSÑSØØ!ð ó 
ˆô
   Ó$Ð$r   N©r9   r   r=   r   r   r   r   ©
r   r   r    Ú__doc__r>   r   r   r   r   r   r   r   r   r6   r6   #   s<   „ ÙAóñ Ñ" 1Ó%Ñ,<ÀÈÔ,KÐUYÔZó(ó [ð(õ%r   r6   c                  ód   — e Zd ZdZdd„Z e ed«       edd¬«      d¬«      ddd	„«       Zddd
„Z	y)Ú	OpenAILLMu;   OpenAI Chat Completions â€” optional fallback for ideation.c                ó:   — ddl m}  ||¬«      | _        || _        y )Nr   )ÚOpenAIr8   )Úopenair`   r<   r=   )r   r9   r=   r`   s       r   r>   zOpenAILLM.__init__C   s   € Ý!á WÔ-ˆŒØˆ�
r   r?   r@   rA   rB   TrE   c                óô   — | j                   j                  j                  j                  | j                  |d|dœd|dœg¬«      }|j
                  d   j                  j                  xs dj                  «       S )Nr   rJ   r   )r=   r   rM   r   Ú )	r<   ÚchatÚcompletionsrP   r=   ÚchoicesÚmessagerL   r'   )r   r   r   r   Úresponses        r   r   zOpenAILLM.completeI   ss   € à—;‘;×#Ñ#×/Ñ/×6Ñ6Ø—*‘*Ø!à!¨fÑ5Ø¨DÑ1ðð 7ó 
ˆð × Ñ  Ñ#×+Ñ+×3Ñ3Ò9°r×@Ñ@ÓBÐBr   c           	     óz  — 	 | j                   j                  j                  j                  | j                  |ddid|dz   dœd|dœg¬«      }|j
                  d   j                  j                  xs d	j                  «       }t        |«      S # t        $ r% | j                  |d
z   ||¬«      }t        |«      cY S w xY w)NrN   Újson_objectr   z

Respond with valid JSON only.rJ   r   )r=   r   Úresponse_formatrM   r   rc   rW   rX   )r<   rd   re   rP   r=   rf   rg   rL   r'   r4   Ú	Exceptionr   )r   r   r   r   rh   rY   s         r   r   zOpenAILLM.complete_jsonU   sÎ   € ð	)Ø—{‘{×'Ñ'×3Ñ3×:Ñ:Ø—j‘jØ%Ø!'¨Ð 7à%°&Ð;^Ñ2^Ñ_Ø#°Ñ5ðð	 ;ó ˆHð ×#Ñ# AÑ&×.Ñ.×6Ñ6Ò<¸"×CÑCÓEˆCÜ# CÓ(Ð(øÜò 	)Ø—-‘-ØÐ WÑWØØ%ð  ó ˆCô
 $ CÓ(Ò(ð	)ús   ‚B	B Â+B:Â9B:NrZ   r   r   r   r[   r   r   r   r^   r^   @   s>   „ ÙEóñ Ñ" 1Ó%Ñ,<ÀÈÔ,KÐUYÔZó	Có [ð	Cõ)r   r^   c                óÜ   — | xs dj                  «       j                  «       } | dk(  r|st        d«      ‚t        ||«      S | dk(  r|st        d«      ‚t	        ||«      S t        d| › d�«      ‚)Nra   z1LLM_PROVIDER=openai but OPENAI_API_KEY is missingÚclaudez4LLM_PROVIDER=claude but ANTHROPIC_API_KEY is missingzUnknown LLM_PROVIDER: z (use claude or openai))r'   ÚlowerÚRuntimeErrorr^   r6   )ÚproviderÚanthropic_keyÚclaude_modelÚ
openai_keyÚopenai_models        r   Ú
create_llmrv   k   s|   € ØÒ$˜H×+Ñ+Ó-×3Ñ3Ó5€HØ�8ÒÙÜÐRÓSÐSÜ˜ \Ó2Ð2Ø�8ÒÙÜÐUÓVÐVÜ˜¨Ó5Ð5Ü
Ð/°¨zÐ9PÐQÓ
RÐRr   )r0   r   r   r   )
rq   r   rr   r   rs   r   rt   r   ru   r   )Ú
__future__r   r+   r(   Útypingr   r   Útenacityr   r   r   r
   r4   r6   r^   rv   r   r   r   Ú<module>rz      sE   ðÝ "ã Û 	ß  ç @Ñ @ôX�ô Xó÷&%ñ %÷:()ñ ()ôV
Sr   