
    UhB                     d    d Z ddlZddlmZmZmZ ddlmZ ddlm	Z	 ddl
mZ  G d d          ZdS )	zgOpenAI-powered restaurant website generation with OpenRouter provider config and LangSmith integration.    N)DictAnyAsyncGenerator)AsyncOpenAI)wrap_openai)settingsc            	           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
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    D/var/www/html/web-builder-api.evdpl.com/src/workflows/ai_workflow.py__init__zAIWorkflow.__init__   s    !/3 ( <#4 
 
 
 % 	3(*D 	3%dk22DK "5577  $::<<    returnc                    	 t           j                            t           j                            t                              }t           j                            |dd          }t          |dd          5 }|                                                                cddd           S # 1 swxY w Y   dS # t          $ r}t          d|            Y d}~dS d}~ww xY w)	z4Load system prompt from markdown file with fallback.promptszsystem_prompt.mdrzutf-8)encodingNz1Warning: Could not load system prompt from file: a&  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.)ospathdirnameabspath__file__joinopenreadstrip	Exceptionprint)r   current_dirprompt_filefes        r   r   zAIWorkflow._load_system_prompt!   s,   	@'//"'//(*C*CDDK',,{I?QRRKk3999 (Qvvxx~~''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (  	@ 	@ 	@IaIIJJJ @  @  @  @  @  @	@s<   A4B6 6&B)B6 )B--B6 0B-1B6 6
C CC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_config0   sk     ?G?V^066s;;;\^#+#DAIAYa(288===_a#+#D	 
 	
r   defaultprompt	thread_idNc                   K   ddl }ddlm} d j        dd|dg fd}d}d}t	          t
          d	d
          }||k     r"|dz  }	 |                     |            |           d{V }	|	2 3 d{V }
t	          |
dd          rK|
j        rDt	          |
j        d         dd          r(t	          |
j        d         j        dd          }|r|W V  d6 dS # |j	        $ r/ ||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 )a2  
        Generate AI response with streaming for restaurant website generation.
        
        Args:
            prompt: User prompt (restaurant website requirements)
            thread_id: Thread ID for conversation persistence
            
        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_modelrK   rL   r   )rJ   r   s   r   _stream_callz2AIWorkflow.generate_response.<locals>._stream_callU   sh      )5<<*!$0#./ =         r      request_timeout_secondsx      )timeoutchoicesdeltarF   z+Error processing request: request timed outzError processing request: )asyncio	functoolsrB   r   getattrr   wait_forrY   rZ   TimeoutErrorsleepr,   str)r   r?   r@   r[   rB   rS   max_attemptsattemptper_request_timeoutrM   chunkrF   r1   rJ   s   `            @r   generate_responsezAIWorkflow.generate_response<   s_       	%%%%%% $*<==//

		 		 		 		 		 		 %h0I3OO$$qLG&//H[/\\\\\\\\#) * * * * * * *%ui66 *5= *WUZUbcdUegnptMuMu *")%-*:*@)T"R"R" *")MMMM $* '   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/ %$s7   'C 2C8AC E$1E$	E$E;EE$c                 P  K   	 d| j         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
        rC   rD   rG   )rI   rJ   rK   rL   rN   Nr   )responseerror )r   r   rO   rP   rQ   r   rR   rK   rL   r   rY   messagerF   r,   ra   )r   r?   r@   rJ   rh   r1   s         r   generate_response_syncz!AIWorkflow.generate_response_sync   s     	 "d.@AAF33H "[-9@@*!$0#./ A        H %,Q/7?  
  	 	 	Q       	s   A:A? ?
B%	B B% B%)r>   )__name__
__module____qualname____doc__r   ra   r   r   r   r   r   rf   rl    r   r   r
   r
   	   s        WW= = =*@S @ @ @ @	
S#X 	
 	
 	
 	
 #F FF F 
T		"	F F F FV #( (( ( 
c3h	( ( ( ( ( (r   r
   )rp   r#   typingr   r   r   openair   langsmith.wrappersr   core.configr   r
   rq   r   r   <module>rv      s    m m 				 , , , , , , , , , ,       * * * * * *            c c c c c c c c c cr   