
    {i0                        d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZ  e         e j                   d      Zes ed       e j                   d	d
      Z e j                   dd      Z ede      ZdZ G d de      ZdedefdZdedefdZddedefdZ e       Zej=                  d      defd       Zej=                  d      defd       Z y)    N)FastAPIHTTPException)JSONResponseStreamingResponse)	BaseModel)OpenAI)load_dotenvOPENROUTER_API_KEYz"Missing OPENROUTER_API_KEY in .envFRONTEND_URLzhttp://localhost:5173APP_NAMEzSiteGen Agentzhttps://openrouter.ai/api/v1)base_urlapi_keyz&meta-llama/llama-3.3-70b-instruct:freec                       e Zd ZU eed<   y)GenerateRequestpromptN)__name__
__module____qualname__str__annotations__      /var/www/sitegen/backend/main.pyr   r      s    Kr   r   textreturnc                     t        j                  d| t         j                  t         j                  z        }|r|j	                  d      j                         S | j                         S )Nz```(?:html)?\s*(.*?)\s*```   )researchDOTALL
IGNORECASEgroupstrip)r   matchs     r   extract_htmlr%      sH    II3T299r}};TUE{{1~##%%::<r   htmlc                 ,     t         fddD              S )Nc              3   B   K   | ]  }|j                         v   y w)N)lower).0tagr&   s     r   	<genexpr>z is_valid_html.<locals>.<genexpr>&   s     Tssdjjl"Ts   )z<htmlz<bodyz<divz<header)any)r&   s   `r   is_valid_htmlr.   %   s    T.STTTr   r   c           	         d}d|dd| dg}t        |      D ]  }	 t        j                  j                  j	                  t
        t        dt        |d      }|j                  d   j                  j                  }t        |      }t        |      r|c S |j                  d	|ddd
dg        t        dd      # t        $ r*}||dz
  k(  rt        ddt!        |             Y d }~d }~ww xY w)Nu   You are a senior frontend engineer. Generate a complete, self-contained, responsive HTML file with embedded CSS and JS. No external resources. Include <!DOCTYPE html>. Return ONLY the code — no explanations, no markdown.system)rolecontentuser)zHTTP-RefererzX-TitleZ   )extra_headersmodelmessagestimeoutr   	assistantz&Fix this. Return ONLY valid full HTML.r   i  zGeneration failed: zFailed after retries)rangeclientchatcompletionscreateYOUR_SITE_URLYOUR_SITE_NAMEMODELchoicesmessager2   r%   r.   extend	Exceptionr   r   )	r   max_attempts
system_msgr7   attemptresprawr&   es	            r   ai_generaterL   (   s   	A 
 "j9FW];^_H& I	I;;**11/<X!	 2 D ,,q/))11C$DT"OO$5,TU I* 3
44  	I,**#C+>s1vh)GHH +	Is   A6B<B<<	C/ C**C/z	/generatereqc                 <   K   t        | j                        }d|iS w)Nr&   )rL   r   )rM   r&   s     r   generaterO   I   s     szz"DD>s   z	/downloadc                   K   t        | j                        }t        j                         }t	        j
                  |d      5 }|j                  d|       d d d        |j                  d       t        |dddi      S # 1 sw Y   *xY ww)Nwz
index.htmlr   zapplication/zipzContent-Dispositionz(attachment; filename=sitegen_website.zip)
media_typeheaders)	rL   r   ioBytesIOzipfileZipFilewritestrseekr   )rM   r&   bufzfs       r   downloadr\   N   sx     szz"D
**,C	c	" (b
L$'(HHQK$&(RS ( (s   A B
A>)B
>BB
)   )!osr   rT   rV   fastapir   r   fastapi.responsesr   r   pydanticr   openair   dotenvr	   getenvr
   
ValueErrorr?   r@   r;   rA   r   r   r%   boolr.   rL   apppostrO   r\   r   r   r   <module>ri      s   	 	 	  * =    RYY34 
9
::		.*AB:7	+

 	1i s s U U U5 5 5> i+   +
 
 
r   