
    Xj                        d dl Z d dlmZmZmZmZmZ d dlmZ d dl	m
Z
 d dlmZmZmZmZ d dlmZ d dlmZm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  ee          Z  edg          Z!e!"                    de#e                   d d ee
           e ed                    fde$de$dedefd            Z%e!"                    de           ee
           e ed                    fde$dededefd            Z&e!'                    de           ee
           e ed                    fdededefd            Z(e!)                    de           ee
           e ed                    fde$dedededef
d            Z*e!+                    d           ee
           e ed                    fde$dededefd            Z,e!'                    d           ee
           e ed                    fde$dedededef
d             Z-e!"                    d!           ee
           e ed                    fde$dededefd"            Z.e!"                    d#           ee
           e ed                    fde$dededefd$            Z/e!'                    d%           ee
           e ed                    fde$dededefd&            Z0dS )'    N)	APIRouterBackgroundTasksDependsHTTPExceptionRequest)Session)get_db)require_createrequire_deleterequire_readrequire_update)get_translator)SFTTaskUser)SFTTaskCreateSFTTaskResponseSFTTaskUpdate)TrainingManager)sync_training_status)
get_logger	sft_tasks)tags/)response_modeld   skiplimitdbcurrent_userc                    |                     t                                        t          j         t          j        |j        k                                  |                               |                                          }|S )N)queryr   filter
is_deleted	tenant_idoffsetr   all)r   r   r   r   taskss        F/lsinfo/ai/hellotax_ai/training_center/backend/app/api/v1/sft_tasks.pyget_sft_tasksr)      sz    HHW$$);%;W=NR^Rh=hiippquvv||  ~C  D  D  H  H  J  JEL    z
/{task_id}task_idrequestc                 J   t          |          }|                    t                                        t          j        | k    t          j         t          j        |j        k                                              }|s$t          d|	                    d                    |S )N  sft_task.not_foundstatus_codedetail)
r   r!   r   r"   idr#   r$   firstr   tr+   r,   r   r   r5   tasks         r(   get_sft_taskr8      s    wA88G##GJ'$9w?Q;QSZSdhth~S~  F  F  H  HD OACC8L4M4MNNNNKr*   task_inc                 B   t          di |                                 |j        |j        d}|                    |           |                                 |                    |           t                              |j                  	                    d           |S )N)r$   
created_byr+   zSFT task created )
r   
model_dumpr$   r3   addcommitrefreshloggerbindinfo)r9   r   r   r7   s       r(   create_sft_taskrE   !   s    hhW''))h\5KXdXghhhhDFF4LLLIIKKKJJt
KKK  %%&8999Kr*   c                    t          |          }|                    t                                        t          j        | k    t          j         t          j        |j        k                                              }|s$t          d|	                    d                    |
                    d                                          D ]\  }}t          |||           |                                 |                    |           |S )Nr.   r/   r0   T)exclude_unset)r   r!   r   r"   r3   r#   r$   r4   r   r5   r>   itemssetattrr@   rA   )	r+   r9   r,   r   r   r5   r7   fieldvalues	            r(   update_sft_taskrL   *   s    wA88G##GJ'$9w?Q;QSZSdhth~S~  F  F  H  HD OACC8L4M4MNNNN***>>DDFF $ $ueU####IIKKKJJtKr*   c                    t          |          }|                    t                                        t          j        | k    t          j         t          j        |j        k                                              }|s$t          d|	                    d                    d|_        |
                                 t                              |                               d           d|	                    d          iS )	Nr.   r/   r0   Tr<   zSFT task deletedmessagezsft_task.deleted)r   r!   r   r"   r3   r#   r$   r4   r   r5   r@   rB   rC   rD   r6   s         r(   delete_sft_taskrO   6   s    wA88G##GJ'$9w?Q;QSZSdhth~S~  F  F  H  HD OACC8L4M4MNNNNDOIIKKK
KKK  %%&8999qss-..//r*   z/{task_id}/startbackground_tasksc                 4  K   t          |          }|                    t                                        t          j        | k    t          j        |j        k                                              }|s$t          d|                    d                    t          |          }|
                    |            d {V }t                              | |                              d           t          j        t!          || d                     |ddS )	Nr.   r/   r0   )r+   job_idzSFT training startedsftzTraining started)rR   rN   )r   r!   r   r"   r3   r$   r4   r   r5   r   start_sft_trainingrB   rC   rD   asynciocreate_taskr   )	r+   rP   r,   r   r   r5   r7   managerrR   s	            r(   rT   rT   A   s      wA88G##GJ'$97;LP\Pf;fggmmooD OACC8L4M4MNNNNb!!G--g66666666F
KKK//445KLLL,R%@@AAA);<<<r*   z/{task_id}/statusc                 d   t          |          }|                    t                                        t          j        | k    t          j        |j        k                                              }|s$t          d|                    d                    |j	        |j
        |j        |j        dS )Nr.   r/   r0   )statusprogresslogserror_message)r   r!   r   r"   r3   r$   r4   r   r5   rY   rZ   r[   r\   r6   s         r(   get_sft_training_statusr]   M   s    wA88G##GJ'$97;LP\Pf;fggmmooD OACC8L4M4MNNNNkt}dibfbtuuur*   z/{task_id}/logsc                 D   t          |          }|                    t                                        t          j        | k    t          j        |j        k                                              }|s$t          d|                    d                    d|j	        pdiS )Nr.   r/   r0   r[    )
r   r!   r   r"   r3   r$   r4   r   r5   r[   r6   s         r(   get_sft_training_logsr`   U   s    wA88G##GJ'$97;LP\Pf;fggmmooD OACC8L4M4MNNNNDIO$$r*   z/{task_id}/cancelc                   K   t          |          }|                    t                                        t          j        | k    t          j        |j        k                                              }|s$t          d|                    d                    t          |          }|
                    | d           d {V }t                              | |                              d           ||rdndd	S )
Nr.   r/   r0   rS   )r+   successzSFT training cancelledzTraining cancelledzFailed to cancel)rb   rN   )r   r!   r   r"   r3   r$   r4   r   r5   r   cancel_trainingrB   rC   rD   )r+   r,   r   r   r5   r7   rW   rb   s           r(   cancel_sft_trainingrd   ]   s      wA88G##GJ'$97;LP\Pf;fggmmooD OACC8L4M4MNNNNb!!G++GU;;;;;;;;G
KKK11667OPPP7+b+?+?Pbcccr*   )1rU   fastapir   r   r   r   r   sqlalchemy.ormr   app.api.depsr	   app.api.permissionsr
   r   r   r   app.core.i18nr   
app.modelsr   r   app.schemas.sft_taskr   r   r   app.services.training_managerr   app.services.training_syncr   common_loggingr   __name__rB   routergetlistintr)   r8   postrE   putrL   deleterO   rT   r]   r`   rd   r=   r*   r(   <module>rw      sc    O O O O O O O O O O O O O O " " " " " "       \ \ \ \ \ \ \ \ \ \ \ \ ( ( ( ( ( ( $ $ $ $ $ $ $ $ N N N N N N N N N N 9 9 9 9 9 9 ; ; ; ; ; ; % % % % % %	H				&	&	&C_ 566#776??_f_fgsgst  hA  hA  `B  `B   c 7 Z^    76 L99=DWV__ahahiuiu  wB  jC  jC  bD  bD  #  W \`    :9 S118?\c\cdrdrs~dd  ]A  ]A  ]  W[    21 L99X_X_`fXgXg  }D  }D  ES  ES  T_  E`  E`  }a  }a 	 	S 	= 	7 	PW 	w{ 	 	 	 :9	 |@Gdkdklzlz  |G  mH  mH  eI  eI 0 0S 07 0 0_c 0 0 0 0   lslstzl{l{  QX  QX  Yg  Yg  hs  Yt  Yt  Qu  Qu 	= 	=c 	=_ 	=W^ 	=dk 	=  LP 	= 	= 	= ! 	=   HOPVlsls  uA  uA  BM  uN  uN  mO  mO v vS v7 v vgk v v v ! v FMgfoojqjqr~r~  @K  sL  sL  kM  kM % %3 % %g %ei % % % %  !!JQ'RX//nunu  wE  wE  FQ  wR  wR  oS  oS d ds dW d' dim d d d "!d d dr*   