
    ɧ-ic%                         U d Z ddlZddlmZmZmZmZ ddlmZ ddl	m
Z
 ddlmZ daee         ed<   daee         ed<   d	 Z G d
 d          ZdS )zgOpenAI-powered restaurant website generation with OpenRouter provider config and LangSmith integration.    N)DictAnyAsyncGeneratorOptional)AsyncOpenAI)wrap_openai)settings_SYSTEM_PROMPT_CACHE_FOLLOWUP_PROMPT_CACHEc                      da dadS )zWInvalidate the global prompt cache. Useful for development or when prompts are updated.N)r
   r        D/var/www/html/web-builder-api.evdpl.com/src/workflows/ai_workflow.pyinvalidate_prompt_cacher      s      !r   c                       e Zd ZdZd ZdefdZdeeef         fdZ		 	 dded	ed
ede
edf         fdZ	 dded	edeeef         fdZdS )
AIWorkflowzMOpenAI-powered workflow for handling AI interactions for restaurant websites.c                 <   t          t          j        dt          j        t          j        d          | _        t          j        r%t          j        rt          | j                  | _        | 	                                | _
        |                                 | _        d S )Nzhttps://openrouter.ai/api/v1)zHTTP-RefererzX-Title)api_keybase_urldefault_headers)r   r	   openrouter_api_keyopenrouter_referreropenrouter_titleclientlangsmith_api_keylangsmith_tracingr   _load_system_promptsystem_prompt_build_provider_configprovider_configselfs    r   __init__zAIWorkflow.__init__   s    !/3 ( <#4 
 
 
 % 	3(*D 	3%dk22DK "5577  $::<<r   returnc                    t           t           S 	 t          j                            t          j                            t
                              }t          j                            |dd          }t          |dd          5 }|                                	                                }ddd           n# 1 swxY w Y   |a |S # t          $ r"}d}t          d|            |a |cY d}~S d}~ww xY w)	z:Load system prompt from markdown file with global caching.Npromptszsystem_prompt.mdrzutf-8)encodinga&  ONLY USE HTML, CSS AND JAVASCRIPT. If you want to use ICON make sure to import the library first. Try to create the best UI possible by using only HTML, CSS and JAVASCRIPT. Also, try to ellaborate as much as you can, to create something unique. ALWAYS GIVE THE RESPONSE INTO A SINGLE HTML FILE.z1Warning: Could not load system prompt from file: )r
   ospathdirnameabspath__file__joinopenreadstrip	Exceptionprint)r"   current_dirprompt_filefprompt_contentefallback_prompts          r   r   zAIWorkflow._load_system_prompt+   s5   
  +''	#'//"'//(*C*CDDK',,{I?QRRKk3999 2Q!"!1!12 2 2 2 2 2 2 2 2 2 2 2 2 2 2 $2 !! 	# 	# 	# KOIaIIJJJ $3 """""""	#sB   A4C 'B7+C 7B;;C >B;?C 
C2C-'C2-C2c                     dt           j        rt           j                            d          ng t           j        t           j        rt           j                            d          ng t           j        diS )z(Build OpenRouter provider configuration.provider,)orderallow_fallbacksignoredata_collection)r	   provider_ordersplitprovider_allow_fallbacksprovider_ignoreprovider_data_collectionr!   s    r   r   z!AIWorkflow._build_provider_configH   sk     ?G?V^066s;;;\^#+#DAIAYa(288===_a#+#D	 
 	
r   defaultNprompt	thread_idr   c                   K   ddl }ddlm} |r|nt          j        }|s j        }d|dd|dg fd}d}d}	t          t          d	d
          }
|	|k     r|	dz  }		 |                     |            |
           d{V }d}|2 3 d{V }t          |dd          r`|j        rY|j        d         }t          |d          r|j	        r|j	        }t          |dd          rt          |j
        dd          }|r|W V  y6 |dvrmddl}|                    t                    }|                    d| d|	 d|            |	|k    rd| dW V  dS |                    d|	z             d{V  !dS # |j        $ r0 |	|k    rdW V  Y dS |                    d|	z             d{V  Y \t"          $ rJ}|	|k    rdt%          |           W V  Y d}~dS |                    d|	z             d{V  Y d}~d}~ww xY wdS )a}  
        Generate AI response with streaming for restaurant website generation.
        
        Args:
            prompt: User prompt (restaurant website requirements)
            thread_id: Thread ID for conversation persistence
            system_prompt: Optional system prompt override (for edit mode)
            
        Yields:
            Streaming response chunks
        r   N)partialsystemrolecontentuserc                     K   j         j        j                            t          j         t          j        t          j        dj                   d {V S )NT)modelmessagestemperature
max_tokensstream
extra_body)	r   chatcompletionscreater	   agent_modelrS   rT   r    )rR   r"   s   r   _stream_callz2AIWorkflow.generate_response.<locals>._stream_callw   sh      )5<<*!$0#./ =         r      request_timeout_secondsi     )timeoutchoicesfinish_reasondeltarN   )stoplengthz!Stream incomplete: finish_reason=z
, attempt=/z)Error: Stream incomplete (finish_reason: )z+Error processing request: request timed outzError processing request: )asyncio	functoolsrJ   r	   r   getattrwait_forr`   hasattrra   rb   logging	getLogger__name__warningsleepTimeoutErrorr2   str)r"   rG   rH   r   rg   rJ   active_system_promptr[   max_attemptsattemptper_request_timeoutrU   ra   chunkchoicerN   rl   loggerr8   rR   s   `                  @r   generate_responsezAIWorkflow.generate_responseT   sY     $ 	%%%%%%
 1>Y}}8CY $ 	6#'#5  *>??//

		 		 		 		 		 		 %h0I3OO$$qLG1&//H[/\\\\\\\\ $#) . . . . . . .%ui66 .5= .!&q!1 #6?;; A@T A,2,@M #67D99 .&-flIt&L&LG& .&- $*  !(:::"NNN$..x88FNN#x}#x#x`g#x#xjv#x#xyyy,..Z-ZZZZZZZ!--G444444444 '   l**GGGGGFFmmAK000000000   l**?s1vv??????FFFFFmmAK000000000[ %$s=   )E5 DCE5 E5 5HH.	H7G<G<<Hc                   K   	 t           j        rt           j        n| j        }d|dd|dg}| j        j        j                            t           j        |t           j        t           j        | j	                   d{V }|j
        d         j        j        ddS # t          $ r}dt          |          dcY d}~S d}~ww xY w)	aD  
        Generate AI response synchronously for restaurant website generation.
        
        Args:
            prompt: User prompt (restaurant website requirements)
            thread_id: Thread ID for conversation persistence
            
        Returns:
            Dictionary containing response and metadata
        rK   rL   rO   )rQ   rR   rS   rT   rV   Nr   )responseerror )r	   r   r   rW   rX   rY   rZ   rS   rT   r    r`   messagerN   r2   rr   )r"   rG   rH   rs   rR   r|   r8   s          r   generate_response_syncz!AIWorkflow.generate_response_sync   s     	 >F=S#k8#9#9Y]Yk !.BCCF33H "[-9@@*!$0#./ A        H %,Q/7?  
  	 	 	Q       	s   BB 
B?#B:4B?:B?)rF   N)rF   )rn   
__module____qualname____doc__r#   rr   r   r   r   r   r   rz   r   r   r   r   r   r      s       WW= = =*#S # # # #:	
S#X 	
 	
 	
 	
 #!	f ff f 	f
 
T		"f f f fV #+ ++ + 
c3h	+ + + + + +r   r   )r   r)   typingr   r   r   r   openair   langsmith.wrappersr   core.configr	   r
   rr   __annotations__r   r   r   r   r   r   <module>r      s    m m m 				 6 6 6 6 6 6 6 6 6 6 6 6       * * * * * *             '+ hsm * * *(,  , , ," " "T T T T T T T T T Tr   