o
    Ej                     @  sT  d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ e	e jd Zed d d d Zed d d d Zede	f ZddddDddZdEd&d'Z ed(dFd,d-Z!dGd0d1Z"dHd4d5Z#dId7d8Z$dJd9d:Z%dKd<d=Z&dLd>d?Z'dMdBdCZ(dS )N    )annotationsN)Callable)Path)Any)ALLOWED_ACTIONS)$provider_call_metrics_from_build_dir)LocalPetApi)LocalJsonStore)build_pet_package_from_photos)LocalPrivateStorage   testsfixturespublicu   周六-合成样例u   一能静-合成样例.)
build_modepackage_builder	state_dirr   storage_dir
output_dirr   
str | Noner   PackageBuilder | Nonereturnr   c                   s   | j ddd |j ddd |j ddd t| |p!tjdd  }|dv r-t}n|dv r>|p4td fdd}nt	dt
t| d || dS )NTparentsexist_okAI_PET_BUILD_RUNNERdemo>   r   fixturer   >   realmodelexternalbuilddict[str, Any]petmedialist[dict[str, Any]]output_rootr   r   c                   s   t | ||| dS )N)r!   r#   r$   r&   media_storager   ) production_external_build_runner)r!   r#   r$   r&   r'   selected_builder ;/opt/sixxie/releases/current/services/api/production_app.pybuild_runner-   s   z+create_production_api.<locals>.build_runnerz,AI_PET_BUILD_RUNNER must be demo or externalzlocal-api-store.json)storer-   r&   r'   
r!   r"   r#   r"   r$   r%   r&   r   r   r"   )mkdirr   osenvirongetstriplowerproduction_demo_build_runnerr
   
ValueErrorr   r	   )r   r   r   r   r   runner_moder-   r+   r)   r,   create_production_api   s"   
r9   r!   r"   r#   r$   r%   r&   c                 C  s   t ||d}t|t| d  }|d }|d }| r!t| |jdd |jdd dD ]}|| }	|	 rAt|	||  q/|d jt	t|
d	pNd
dddd |d  r^dnd}
|d|
ttddddS )N)r#   r$   build_idpackageqaT)r   )pet.jsonzspritesheet.webpspritesheet.pngzcontact-sheet.htmlpet_namer#   z../package/spritesheet.webp)display_namespritesheetutf-8encodingr>   zpackage/spritesheet.pngzpackage/spritesheet.webppackage/pet.json)	build_dirpackage_refpreview_refactionschecksum_validruntime_compatiblevalidation_ok)_select_public_fixturer   strexistsshutilrmtreer0   copy2
write_text_demo_contact_sheetr3   listr   )r!   r#   r$   r&   r   rF   package_dirqa_dirfilenamesourcerH   r+   r+   r,   r6   A   s4   
r6   )r   r'   r   PackageBuilderc              	   C  s  |st dt|d }|jddd tjtt| dpd d|d$}t||t|d	}|t|d
p8dt	||t|d}	W d    n1 sMw   Y  t|	}	|	d d 
 sbt d|	d d 
 rldnd}
|	|
 
 sxt dt|	}|	d|
ttdd|t|	dS )Nz+at least one uploaded pet photo is required_private_upload_inputsTr   r:   r!   -)prefixdir)r$   r'   tmp_dirr?   r#   )r?   notesphoto_pathsr&   r;   r=   z-generated package is missing package/pet.jsonr<   zcontact-sheet.pngzqa/contact-sheet.pngzqa/contact-sheet.htmlz2generated package is missing preview contact sheetrE   )rF   rG   rH   rI   rJ   rK   rL   provider_call_metrics)r7   r   r0   tempfileTemporaryDirectory_safe_temp_prefixrN   r3   _materialize_private_media_pet_generation_notesrO   _generated_validation_okrU   r   r   )r!   r#   r$   r&   r'   r   tmp_roottmpra   rF   rH   rL   r+   r+   r,   r(   _   s:   	(	r(   r_   
list[Path]c           	      C  s   g }t | D ]8\}}|ddvrtdt|dpd}|s$tdt|}|d| |  }||| || q|S )Ndeletion_status>   Nactivez!active uploaded media is requiredstorage_ref z%uploaded media storage ref is missingzinput-)	enumerater3   r7   rN   _media_suffixwrite_bytesreadappend)	r$   r'   r_   ra   indexitemrn   suffix
photo_pathr+   r+   r,   rf      s   rf   rF   boolc                 C  sP   | d }|  s
dS zt|jdd}W n tjy    Y dS w |ddu S )Nzvalidation.jsonFrB   rC   okT)rO   jsonloads	read_textJSONDecodeErrorr3   )rF   validation_path
validationr+   r+   r,   rh      s   rh   rN   c                 C  sP   t t| dpdj }|dv r|S dddddt| d	p"d d
S )Noriginal_filenamero   >   .jpeg.gif.jpg.png.webpr   r   r   r   )z	image/pngz
image/jpegz
image/webpz	image/gif	mime_typez.img)r   rN   r3   rw   r5   )r$   rw   r+   r+   r,   rq      s   rq   c                 C  s@   t | dpd t | dpd g}ddd |D S )Npersonality_notesro   typical_gestures c                 s  s    | ]}|r|V  qd S )Nr+   ).0partr+   r+   r,   	<genexpr>   s    z(_pet_generation_notes.<locals>.<genexpr>)rN   r3   r4   join)r#   partsr+   r+   r,   rg      s   rg   valuec                 C  s"   d dd | D d}|pdS )Nro   c                 s  s$    | ]}|  s|d v r|V  qdS )>   _r\   N)isalnum)r   chr+   r+   r,   r      s   " z$_safe_temp_prefix.<locals>.<genexpr>z._-r!   )r   r4   )r   cleanedr+   r+   r,   re      s   re   c                 C  sZ   d t| dp	dgdd |D dd |D  }d|v s)d|v s)d	|v r+tS tS )
Nr   r?   ro   c                 S     g | ]}t |d pdqS )rn   ro   rN   r3   r   rv   r+   r+   r,   
<listcomp>       z*_select_public_fixture.<locals>.<listcomp>c                 S  r   )r   ro   r   r   r+   r+   r,   r      r   
yinengjingu	   一能静mimi)r   rN   r3   r5   YI_NENG_JING_FIXTUREZHOU_LIU_FIXTURE)r#   r$   haystackr+   r+   r,   rM      s   rM   r@   rA   c                 C  s8   d dd tD }d|  d|  d| d|  d| d	S )
Nro   c                 s  s    | ]	}d | dV  qdS )z<li>z</li>Nr+   )r   actionr+   r+   r,   r      s    z&_demo_contact_sheet.<locals>.<genexpr>zD<!doctype html>
<html lang="zh-CN">
<meta charset="utf-8" />
<title>z) production preview</title>
<body>
  <h1>us    本地生产模式预览</h1>
  <p>公开演示素材，仅用于 production-mode 链路验证。</p>
  <img src="z" alt="z spritesheet preview" />
  <ul>z</ul>
</body>
</html>
)r   r   )r@   rA   rowsr+   r+   r,   rT      s   rT   )r   r   r   r   r   r   r   r   r   r   r   r   r/   )r!   r"   r#   r"   r$   r%   r&   r   r'   r   r   rZ   r   r"   )r$   r%   r'   r   r_   r   r   rk   )rF   r   r   ry   )r$   r"   r   rN   )r#   r"   r   rN   )r   rN   r   rN   )r#   r"   r$   r%   r   r   )r@   rN   rA   rN   r   rN   ))
__future__r   r{   r1   rP   rc   collections.abcr   pathlibr   typingr   packages.pet_package_schemar   services.ai.provider_metricsr   services.api.local_apir   services.api.local_storer	   ,services.pet_builder.photo_generation_workerr
   &services.storage.local_private_storager   __file__resolver   ROOTr   r   rZ   r9   r6   r(   rf   rh   rq   rg   re   rM   rT   r+   r+   r+   r,   <module>   s>    
&%
*




