
    Ti@                     X    d dl 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
  G d d      Zy)    N)DictAnyOptionalList)
HttpClient)config_servicec                      e Zd ZdZd ZdefdZdeeef   fdZ	dedefdZ
	 	 	 	 dd	ed
edee   dee   dee   deee      dedefdZ	 	 ddedee   dee   deeef   fdZdedeeeef      fdZ	 	 	 	 dd	ed
edee   dee   dee   deee      dedeeef   fdZ	 	 	 	 dd	ed
ededededeee      dedeeef   fdZ	 dd	ed
ededefdZ	 dd	ed
ededeeef   fdZdefdZy)JaazServiceu   Jaaz 云端 API 服务
    c                    t         j                  j                  di       }t        |j                  dd            j	                  d      | _        t        |j                  dd            | _        | j
                  st        d      | j                  st        d      | j
                  j                  d      s| j
                   d| _        t        d	| j
                          y
)u   初始化 Jaaz 服务jaazurl /api_keyzJaaz API URL is not configuredz Jaaz API token is not configuredz/api/v1u+   ✅ Jaaz service initialized with API URL: N)
r   
app_configgetstrrstripapi_url	api_token
ValueErrorendswithprint)selfconfigs     O/home/jay/workspace/tools/ai-image-gen/jaaz-app/server/services/jaaz_service.py__init__zJaazService.__init__   s    **..vr:6::eR0188=VZZ	267||=>>~~?@@ ||$$Y/"ll^73DL;DLL>JK    returnc                 H    t        | j                  xr | j                        S )u   检查 Jaaz API 是否已配置)boolr   r   r   s    r   _is_configuredzJaazService._is_configured   s    DLL3T^^44r   c                 &    d| j                    ddS )u   构建请求头zBearer zapplication/json)AuthorizationzContent-Type)r   r"   s    r   _build_headerszJaazService._build_headers#   s       't~~&67.
 	
r   image_contentc           	        K   	 |r|j                  d      st        d       yt        j                         4 d{   }|j	                  | j
                   d| j                         d|it        j                  d      	      4 d{   }|j                  d
k(  r|j                          d{   }|j                  dd      }|r2t        d|        |cddd      d{    cddd      d{    S t        d       	 ddd      d{    ddd      d{    y|j                          d{   }t        d|j                   d|        	 ddd      d{    ddd      d{    y7 C7 7 7 7 7 u7 g7 P7 &7 # 1 d{  7  sw Y   nxY wddd      d{  7   y# 1 d{  7  sw Y   yxY w# t        $ r}t        d|        Y d}~yd}~ww xY ww)u   
        创建云端魔法图像生成任务

        Args:
            image_content: 图片内容（base64 或 URL）

        Returns:
            str: 任务 ID，失败时返回空字符串
        zdata:image/u    ❌ Invalid image content formatr   Nz/image/magicimage      N@totalheadersjsontimeout   task_idu   ✅ Magic task created: u   ❌ No task_id in responseu!   ❌ Failed to create magic task:  - u   ❌ Error creating magic task: )
startswithr   r   create_aiohttppostr   r&   aiohttpClientTimeoutstatusr/   r   text	Exception)r   r'   sessionresponsedatar2   
error_textes           r   create_magic_taskzJaazService.create_magic_task*   s    	 (@(@(O89!002 " "g"<<||nL1 //1 $11= (  " " #-%-]]_4"&((9b"9"!$<WI"FG#*" " "" " "  "">?#%!" "" " "& ,4==?%:
??PPST^S_`b!+" "" " ""  5""""& &;%""" " "" " " " "0  	3A378	s  G3G G3G E>G AF:
FF:#F1F2'FF:%F&F:*G 6F7G ;G3<FF:F	F:G #F$G (G3)F<F= FF:(F)F:-G 8F9G =G3>G F:FF:G 	F:G FF:G F%	FF%	!F:(G 3F64G 9G3:G GGG G3G 	G0G+&G3+G00G3Npromptmodel
resolutiondurationaspect_ratioinput_imageskwargsc           	        K   t        j                         4 d{   }|||||d|}	|r||	d<   |j                  | j                   d| j	                         |	t        j                  d            4 d{   }
|
j                  dk(  ri|
j                          d{   }|j                  d	d
      }|r2t        d|        |cddd      d{    cddd      d{    S t        d      |
j                          d{   }t        d|
j                   d|       7 7 7 7 [7 L7 *# 1 d{  7  sw Y   nxY wddd      d{  7   y# 1 d{  7  sw Y   yxY ww)u  
        创建云端视频生成任务

        Args:
            prompt: 视频生成提示词
            model: 视频生成模型
            resolution: 视频分辨率
            duration: 视频时长（秒）
            aspect_ratio: 宽高比
            input_images: 输入图片列表（可选）
            **kwargs: 其他参数

        Returns:
            str: 任务 ID

        Raises:
            Exception: 当任务创建失败时抛出异常
        NrB   rC   rD   rE   rF   rG   z/video/sunra/generations      ^@r+   r-   r1   r2   r   u   ✅ Video task created: No task_id in responsez"Failed to create video task: HTTP r3   r   r5   r6   r   r&   r7   r8   r9   r/   r   r   r;   r:   )r   rB   rC   rD   rE   rF   rG   rH   r<   payloadr=   r>   r2   r?   s                 r   create_video_taskzJaazService.create_video_taskU   s    8 ,,. 	k 	k' ($ , G *6'||<<. 89++---E:	 $  k k
 ??c)!)0D"hhy"5G 8	BC&k k k	k 	k 	k4 ((@AA'/}}!6J#&HHYY\]g\h$ijj;	kk 1k	k8 "7k k k	k 	k 	k 	k 	ks   E2D)E2AE9D,:E=#D6 D.!'D6ED0EE2%D2&E2+D6	D4
D6)E2,E.D60E2E24D66E	<D?=E	EE2EE2E/#E&$E/+E2r2   max_attemptsintervalc           	      >  K   |xs d}|xs d}t        j                         4 d{   }t        |      D ]  }|j                  | j                   d| | j                         t        j                  d            4 d{   }|j                  dk(  r |j                          d{   }|j                  d	      r|j                  d
i       j                  d      r|d
   d   }|j                  d      }	|	dk(  r5t        d| d       |cddd      d{    c cddd      d{    S |	dk(  r |j                  dd      }
t        d|
       |	dk(  rt        d      |	dk(  r0t        j                  |       d{    	 ddd      d{    it        d|	       t        d      t        d|j                          t        d| d      7 7 `7 ;7 7 7 e7 V# 1 d{  7  sw Y   xY w# 1 d{  7  sw Y   yxY ww)uE  
        等待任务完成并返回结果

        Args:
            task_id: 任务 ID
            max_attempts: 最大轮询次数
            interval: 轮询间隔（秒）

        Returns:
            Dict[str, Any]: 任务结果

        Raises:
            Exception: 当任务失败或超时时抛出异常
                  @Nz/task/g      4@r+   )r.   r0   r1   successr>   foundtaskr9   	succeededu	   ✅ Task z completed successfullyfailederrorzUnknown errorzTask failed: 	cancelledzTask was cancelled
processingzUnknown task status: zTask not foundz Failed to get task status: HTTP zTask polling timeout after z	 attempts)r   r5   ranger   r   r&   r7   r8   r9   r/   r   r;   asynciosleep)r   r2   rP   rQ   r<   _r=   r>   rW   r9   	error_msgs              r   poll_for_task_completionz$JaazService.poll_for_task_completion   sM    ( $*s?s,,. !	S !	S'<( ^";;||nF7)4 //1#11= '  ^ ^ #-%-]]_488I.488FB3G3K3KG3T#'<#7D%)XXh%7F%4 %&/y8O$P!R'+^ ^ ^!	S !	S !	S" "(8!3,0HHWo,N	&/-	{0K&L L!';!6&/0D&E E!'<!7&-mmH&= = = (/^ ^ ^2 '02Gx0P&Q Q"+,<"=='*J8??J[(\]]=^@ 9,yQRRC!	S^  5^!	S0 !>-^ ^ ^ ^!	S !	S !	Ss   %HG!HAHG$
H$G2,G'
-A$G2HG*
H$H0G,1H6AG2G.
	G2HG0H 1G2H!H$H'G2*H,H.G20H2H8G;9H HHHHHc                   K   	 | j                  |       d{   }|st        d       ddiS | j                  |dd       d{   }|st        d       dd	iS |j                  d
      s'|j                  dd      }t        d|        dd| iS t        d|j                  d
              |S 7 7 n# t        $ r*}dt        |       }t        d|        d|icY d}~S d}~ww xY ww)u   
        生成魔法图像的完整流程

        Args:
            image_content: 图片内容（base64 或 URL）

        Returns:
            Dict[str, Any]: 包含 result_url 的任务结果，失败时返回包含 error 信息的字典
        Nu   ❌ Failed to create magic taskrZ   zFailed to create magic taskx   g      @rP   rQ   u   ❌ Magic generation failedzMagic generation failed
result_urlzNo result URL foundu   ❌ Magic generation failed: zMagic generation failed: u(   ✅ Magic image generated successfully: z!Error in magic image generation: u   ❌ )rA   r   rb   r   r;   r   )r   r'   r2   resultra   r@   s         r   generate_magic_imagez JaazService.generate_magic_image   s    	( 22=AAG78!>??  88s]`8aaF34!:;;::l+"JJw0EF	5i[AB#<YK!HII:6::l;S:TUWM% B b  	(;CF8DID$%Y''	(sx   C,B6 B2B6 C,B6 B4B6 C,7B6 C,B6 1C,2B6 4B6 6	C)?C$C)C,$C))C,c           
      t  K    | j                   d
||||||d| d{   }|st        d      | j                  |       d{   }	|	st        d      |	j                  d      rt        d|	d          |	j                  d      st        d      t	        d	|	j                  d              |	S 7 7 pw)u  
        生成视频的完整流程

        Args:
            prompt: 视频生成提示词
            model: 视频生成模型
            resolution: 视频分辨率
            duration: 视频时长（秒）
            aspect_ratio: 宽高比
            input_images: 输入图片列表（可选）
            **kwargs: 其他参数

        Returns:
            Dict[str, Any]: 包含 result_url 的任务结果

        Raises:
            Exception: 当视频生成失败时抛出异常
        )rB   rC   rD   rE   rF   rG   NzFailed to create video taskzVideo generation failedrZ   zVideo generation failed: rf   z0No result URL found in video generation responseu"   ✅ Video generated successfully:  )rO   r;   rb   r   r   )
r   rB   rC   rD   rE   rF   rG   rH   r2   rg   s
             r   generate_videozJaazService.generate_video   s     : /.. 
!%%
 
 
 9:: 44W==566::g7w7HIJJzz,'NOO0L1I0JK	M5
 >s"   B8B4%B8B6A/B86B8c           	        K   t        j                         4 d{   }|||||d|}	|r||	d<   |j                  | j                   d| j	                         |	t        j                  d            4 d{   }
|
j                  dk(  r7|
j                          d{   }|j                  d	d
      }|s>t        d      |
j                          d{   }t        d|
j                   d|       ddd      d{    ddd      d{    t        d        | j                  |       d{   }|st        d      |j                  d      rt        d|d          |j                  d      st        d      t        d|j                  d              |S 7 7 27 7 7 # 1 d{  7  sw Y   xY w7 # 1 d{  7  sw Y   xY w7 w)u  
        使用 Seedance 模型生成视频的完整流程

        Args:
            prompt: 视频生成提示词
            model: 视频生成模型
            resolution: 视频分辨率
            duration: 视频时长（秒）
            aspect_ratio: 宽高比
            input_images: 输入图片列表（可选）
            **kwargs: 其他参数

        Returns:
            Dict[str, Any]: 包含 result_url 的任务结果

        Raises:
            Exception: 当视频生成失败时抛出异常
        NrJ   rG   z/video/seedance/generationrK   r+   r-   r1   r2   r   rL   z+Failed to create Seedance video task: HTTP r3   u!   ✅ Seedance video task created: z Seedance video generation failedrZ   z"Seedance video generation failed: rf   z9No result URL found in Seedance video generation responseu+   ✅ Seedance video generated successfully: )r   r5   r6   r   r&   r7   r8   r9   r/   r   r;   r:   r   rb   )r   rB   rC   rD   rE   rF   rG   rH   r<   rN   r=   r>   r2   r?   rg   s                  r   generate_video_by_seedancez&JaazService.generate_video_by_seedance(  s
    : ,,. 	t 	t' ($ , G *6'||<<. :;++---E:	 $  t t
 ??c)!)0D"hhy"5G"'(@AA'/}}!6J#&QRZRaRaQbbefpeq$rsst t	t 	t8 	1';< 44W==>??::g@@QRSSzz,'WXX9&**\:R9ST	VW	tt 1
 "7t t t t	t 	t 	t 	t> >s   G#F(G#AG9F+:G=#F5 F.!6F5F1F57GF3GG#G
&G#9G!:A/G#+G.F51F53G5G	;F><G	G
G#GGGG#c           	        K   t        j                         4 d{   }||d|}|j                  | j                   d| j	                         |t        j                  d            4 d{   }|j                  dk(  ri|j                          d{   }|j                  dd	      }|r2t        d
|        |cddd      d{    cddd      d{    S t        d      |j                          d{   }	t        d|j                   d|	       7 7 7 7 [7 L7 *# 1 d{  7  sw Y   nxY wddd      d{  7   y# 1 d{  7  sw Y   yxY ww)ud  
        创建云端 Midjourney 图像生成任务

        Args:
            prompt: 图像生成提示词
            model: 图像生成模型（默认为 midjourney）
            **kwargs: 其他参数（如 mode 等）

        Returns:
            str: 任务 ID

        Raises:
            Exception: 当任务创建失败时抛出异常
        NrB   rC   z/image/midjourney/generationr*   r+   r-   r1   r2   r   u   ✅ Midjourney task created: rL   z'Failed to create Midjourney task: HTTP r3   rM   )
r   rB   rC   rH   r<   rN   r=   r>   r2   r?   s
             r   create_midjourney_taskz"JaazService.create_midjourney_taskr  s    ( ,,. 	p 	p'  G ||<<. <=++---D9	 $  p p
 ??c)!)0D"hhy"5G =gYGH&p p p	p 	p 	p( ((@AA'/}}!6J#&MhooM^^ablam$noo/	pp 1p	p, "7p p p	p 	p 	p 	p 	ps   E(DE(AE/D"0E3#D,D$'D,>E
D&EE(D(E(!D,?D* D,E("E$D,&E(E(*D,,D>	2D53D>	:EE(EE(E%EE%!E(c                   K    | j                   d||d| d{   }|st        d      | j                  |dd       d{   }t        d|        |st        d      |j	                  d	      rt        d
|d	          |j	                  d      st        d      |j	                  d      }t        d|        |xs i S 7 7 w)u  
        使用 Midjourney 生成图像的完整流程

        Args:
            prompt: 图像生成提示词
            model: 图像生成模型（默认为 midjourney）
            **kwargs: 其他参数（如 mode 等）

        Returns:
            Dict[str, Any]: 包含 result_url 的任务结果

        Raises:
            Exception: 当图像生成失败时抛出异常
        ro   Nz Failed to create Midjourney taskrS   rT   re   u   🎨 Midjourney task result: z"Midjourney image generation failedrZ   z$Midjourney image generation failed: rg   z7No result found in Midjourney image generation responseu-   ✅ Midjourney image generated successfully: rj   )rp   r;   rb   r   r   )r   rB   rC   rH   r2   task_resultrg   s          r   generate_image_by_midjourneyz(JaazService.generate_image_by_midjourney  s     * 433 

 
 
 >?? !99'PS^a9bb-k];<@AA??7#B;wCWBXYZZx(UVV*=fXFG|/
 cs"   CC(CC	BC	Cc                 "    | j                         S )uj   
        检查服务是否已正确配置

        Returns:
            bool: 配置是否有效
        )r#   r"   s    r   is_configuredzJaazService.is_configured  s     ""$$r   )NNNN)NN)480p   z16:9N)
midjourney)__name__
__module____qualname____doc__r   r!   r#   r   r   r&   rA   r   intr   r   rO   floatrb   rh   rk   rm   rp   rs   ru   rj   r   r   r
   r
   
   s   L"5 5
S#X 
)S )S )^ %)"&&*,09k9k 9k SM	9k
 3-9k sm9k tCy)9k 9k 
9k| '+$(	8S8S sm8S 5/	8S
 
c3h8St#( #(cSVh@X #(R %)"&&*,077 7 SM	7
 3-7 sm7 tCy)7 7 
c3h7z !",0HH H 	H
 H H tCy)H H 
c3hHZ "+p+p +p 	+p
 
+p` ",, , 	,
 
c3h,\%t %r   r
   )r^   r7   typingr   r   r   r   utils.http_clientr   services.config_servicer   r
   rj   r   r   <module>r      s%      , , ( 2J% J%r   