
    	]jC                        d Z ddlZddlmZ ddlmZ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mZmZ dd
lmZ ddlmZmZ ddlmZ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%  ejL                  e'      Z(ddddddddddddddddddddgdddddd ddd!ddd"dd#
g d$Z) e
d% ed&gd'd(jU                  ejV                  xs d)*      d+e)id,d-d.gd/0      1       e
d2 ed&gd3d4jU                  ejV                  xs d)*       ed5ejX                  d6d7      gd,d8d.gd/9      1       G d: d;ejZ                                      Z. e
d< ed&gd=d>jU                  ejV                  xs d)*      d+e)id,d?d.gd/0      1       e
d2 ed&gd@dAjU                  ejV                  xs d)*      dd,d2d.gd/0      1       e
dB ed&gdCdDjU                  ejV                  xs d)*      dd,dBd.gd/0      1       e
dE edFG      1       G dH dIej^                                                    Z0 e
d% ed&gdJdK edLejX                  dMdN7      gd+ddOddPdidQi edRS       edTdUddVdWX      dYd,dZd.gd/[      1       G d\ d]e%             Z1 e
d% ed&gd^d_ edLejX                  dMdN7      g ed`S       edadUddVdWX      dYd,dbdcgd/d      1       G de dfe%             Z2 e
d% ed&gdgdh edLejX                  dMdN7      gedi edjS      id,dkd.gd/[      1       G dl dme%             Z3 e
d2 ed&gdndodi edpddqdrdidsdrdidtdQX      id,dud.gd/v      1       G dw dxejh                               Z5y)yzThis file and its contents are licensed under the Apache License 2.0. Please see the included NOTICE for copyright information and LICENSE for a copy of the license.
    N)flag_set)ViewClassPermissionall_permissions)settings)method_decorator)DjangoFilterBackend)OpenApiTypes)OpenApiParameterOpenApiResponseextend_schema)	MLBackend)MLBackendSerializerMLInteractiveAnnotatingRequest)ProjectTask)genericsstatus)
FormParser
JSONParserMultiPartParser)Response)APIViewobjectstringzML backend URL)typedescriptionintegerz
Project IDbooleanzIs interactiveTitleDescriptionzAuth methodNONE
BASIC_AUTH)r   r   enumzBasic auth userzBasic auth passwordzExtra parameterszResponse model timeout)
urlprojectis_interactivetitler   auth_methodbasic_auth_userbasic_auth_passextra_paramstimeout)r   
propertiesrequiredpostzMachine LearningzAdd ML BackendaC  
    Add an ML backend to a project using the Label Studio UI or by sending a POST request using the following cURL 
    command:
    ```bash
    curl -X POST -H 'Content-type: application/json' {host}/api/ml -H 'Authorization: Token abc123'\
    --data '{{"url": "http://localhost:9090", "project": {{project_id}}}}' 
    zhttps://localhost:8080)hostzapplication/jsonmlcreatepublic)zx-fern-sdk-group-namezx-fern-sdk-method-namezx-fern-audiences)tagssummaryr   request
extensions)name	decoratorgetzList ML backendsz
    List all configured ML backends for a specific project by ID.
    Use the following cURL command:
    ```bash
    curl {host}/api/ml?project={{project_id}} -H 'Authorization: Token abc123'
    r%   query)r8   r   locationr   list)r4   r5   r   
parametersr7   c                   n    e Zd ZeeefZ eej                  ej                        ZeZegZdgZd Zd Zy)MLBackendListAPI)GETPOSTr&   c                     | j                   j                  j                  d      }t        j                  t
        |      }| j                  | j                   |       |j                         }|S )Nr%   pk)r6   query_paramsr:   r   get_object_or_404r   check_object_permissionsupdate_ml_backends_state)self
project_pkr%   ml_backendss       =/root/env/lib/python3.12/site-packages/label_studio/ml/api.pyget_querysetzMLBackendListAPI.get_queryset   sV    \\..229=
,,WD%%dllG<668    c                     |j                         }|j                          |j                  }|j                  r2|j                  s%|j
                  |_        |j                  dg       y y y )Nmodel_version)update_fields)saveupdate_stater%   show_collab_predictionsrQ   r'   )rJ   
serializer
ml_backendr%   s       rM   perform_createzMLBackendListAPI.perform_create   s`    __&
!$$
 **73H3H$.$4$4G!LL'8L9 4I*rO   N)__name__
__module____qualname__r   r   r   parser_classesr   r   projects_viewprojects_changepermission_requiredr   serializer_classr   filter_backendsfilterset_fieldsrN   rX    rO   rM   r@   r@   G   sQ    ` !*o>N-)),, +*+O():rO   r@   patchzUpdate ML Backenda5  
    Update ML backend parameters using the Label Studio UI or by sending a PATCH request using the following cURL command:
    ```bash
    curl -X PATCH -H 'Content-type: application/json' {host}/api/ml/{{ml_backend_ID}} -H 'Authorization: Token abc123'\
    --data '{{"url": "http://localhost:9091"}}' 
    updatezGet ML Backendz
    Get details about a specific ML backend connection by ID. For example, make a GET request using the
    following cURL command:
    ```bash
    curl {host}/api/ml/{{ml_backend_ID}} -H 'Authorization: Token abc123'
    deletezRemove ML Backendz
    Remove an existing ML backend connection by ID. For example, use the
    following cURL command:
    ```bash
    curl -X DELETE {host}/api/ml/{{ml_backend_ID}} -H 'Authorization: Token abc123'
    putT)excludec                   ~     e Zd ZeeefZeZe	j                  Zej                  j                         Z fdZd Z xZS )MLBackendDetailAPIc                 L    t         t        |          }|j                          |S N)superrj   
get_objectrT   )rJ   rW   	__class__s     rM   rn   zMLBackendDetailAPI.get_object   s%    -t?A
!rO   c                 D    |j                         }|j                          y rl   )rS   rT   )rJ   rV   rW   s      rM   perform_updatez!MLBackendDetailAPI.perform_update   s    __&
!rO   )rY   rZ   r[   r   r   r   r\   r   r`   r   r^   r_   r   objectsallquerysetrn   rq   __classcell__)ro   s   @rM   rj   rj      sB    F !*o>N*)99  $$&H
"rO   rj   Traina  
        After you add an ML backend, call this API with the ML backend ID to start training with 
        already-labeled tasks. 
        
        Get the ML backend ID by [listing the ML backends for a project](https://labelstud.io/api/#operation/api_ml_list).
        idpathz3A unique integer value identifying this ML backend.use_ground_truthz7Whether to include ground truth annotations in training)r   r-   z"Training has successfully started.)r   zTraining errorzError messagezServer responded with an error.)r   r   example)r   response)     train)r4   r5   r   r>   r6   	responsesr7   c                   *    e Zd Zej                  Zd Zy)MLBackendTrainAPIc                     t        j                  t        | j                  d         }| j	                  | j
                  |       |j                          t        t        j                        S )NrE   rD   r   )
r   rG   r   kwargsrH   r6   r~   r   r   HTTP_200_OK)rJ   r6   argsr   rW   s        rM   r/   zMLBackendTrainAPI.post  sN    //	dkk$>OP
%%dllJ?v1122rO   N)rY   rZ   r[   r   r^   r_   r/   rc   rO   rM   r   r      s    d *993rO   r   zTest predictionz
        After you add an ML backend, call this API with the ML backend ID to run a test prediction on specific task data               
        z$Predicting has successfully started.zPredicting errortest_predictinternal)r4   r5   r   r>   r   r7   c                   .    e Zd ZeZej                  Zd Zy)MLBackendPredictTestAPIc                    t        j                  t        | j                  d         }| j	                  | j
                  |       |j                  j                  dd      }|rzt        j                  |j                        }|st        t        j                  ddi      S |j                  |      }|st        t        j                  dd	i      S t        di |S t        t        j                  d
di      S )NrE   rD   randomF)r%   detailzSProject has no tasks to run prediction on, import at least 1 task to run prediction)r   datazQML backend did not return any predictions, check ML backend logs for more detailserrorz>Not implemented - you must provide random=true query parameterrc   )r   rG   r   r   rH   r6   rF   r:   r   
get_randomr%   r   r   HTTP_500_INTERNAL_SERVER_ERROR_predictHTTP_501_NOT_IMPLEMENTED)rJ   r6   r   r   rW   r   tasks          rM   r/   zMLBackendPredictTestAPI.postL  s    //	dkk$>OP
%%dllJ?%%))(E:??:+=+=>D!@@ "w   ((.F!@@ "u  %f%% 66_` rO   N)	rY   rZ   r[   r   r`   r   r^   r_   r/   rc   rO   rM   r   r   &  s    F +)99rO   r   zRequest Interactive Annotationa&  
        Send a request to the machine learning backend set up to be used for interactive preannotations to retrieve a
        predicted region based on annotator input. 
        See [set up machine learning](https://labelstud.io/guide/ml.html#Get-interactive-preannotations) for more.
        r|   z%Interactive annotation has succeeded.predict_interactivec                   X    e Zd ZdZej
                  Zej                  fdZ	d Z
d Zd Zy)MLBackendInteractiveAnnotatingz
    Send a request to the machine learning backend set up to be used for interactive preannotations to retrieve a
    predicted region based on annotator input.
    c                 N     ||       t        d|git        j                        S )Nerrorsr   )r   r   r   )rJ   messagelog_functions      rM   _error_responsez.MLBackendInteractiveAnnotating._error_response  s$    WG9-f6H6HIIrO   c                 T    t        j                  t        |d   |j                        S )Nr   )rE   r%   )r   rG   r   r%   )rJ   rW   validated_datas      rM   	_get_taskz(MLBackendInteractiveAnnotating._get_task  s#    ))$>&3IS]SeSeffrO   c                     t        d|j                        r'|j                  |j                  |j                         |S )N1ff_back_dev_2362_project_credentials_060722_short)project_credentials_loginproject_credentials_password)r   userre   task_data_logintask_data_password)rJ   r6   contextr%   s       rM   _get_credentialsz/MLBackendInteractiveAnnotating._get_credentials  s;    GVNN*1*A*A-4-G-G   rO   c                    t        j                  t        | j                  d         }| j	                  | j
                  |       t        |j                        }|j                  d       | j                  ||j                        }| j                  ||j                  j                  di       |j                        }|j                  |||j                        }t!        |t"        j$                        S )	z
        Send a request to the machine learning backend set up to be used for interactive preannotations to retrieve a
        predicted region based on annotator input.
        rE   rD   )r   T)raise_exceptionr   )r   r   )r   rG   r   r   rH   r6   r   r   is_validr   r   r   r:   r%   interactive_annotatingr   r   r   r   )	rJ   r6   r   r   rW   rV   r   r   results	            rM   r/   z#MLBackendInteractiveAnnotating.post  s    
 //	dkk$>OP
%%dllJ?3F
D1~~j**C*CD''1J1J1N1NyZ\1]_c_k_kl224w||2T%%
 	
rO   N)rY   rZ   r[   __doc__r   
tasks_viewr_   loggerinfor   r   r   r/   rc   rO   rM   r   r   l  s2    <
 *444:KK Jg
rO   r   zGet model versionsz$Get available versions of the model.zList of available versions.arrayr   )r   itemsversionsr   list_model_versions)r4   r5   r   r   r7   c                   *    e Zd Zej                  Zd Zy)MLBackendVersionsAPIc                    t        j                  t        | j                  d         }| j	                  | j
                  |       |j                         }|j                  dk(  r+d|j                  j                  dg       i}t        |d      S |j                  dk(  r|j                  gdd}t        |d      S d	t        |j                        i}|j                  d
kD  r|j                  nd}t        ||      S )NrE   rD   r|   r   )r   r   i  z*Upgrade your ML backend version to latest.r   r   r   r}   )r   rG   r   r   rH   r6   get_versionsstatus_coder{   r:   r   rQ   strerror_message)rJ   r6   r   r   rW   versions_responser   r   s           rM   r:   zMLBackendVersionsAPI.get  s    //	dkk$>OP
%%dllJ?&335((C/ "3"<"<"@"@R"PQF44**c1#-#;#;"<IuvF44s#4#B#BCDF;L;X;X[\;\+77beK<<rO   N)rY   rZ   r[   r   r^   r_   r:   rc   rO   rM   r   r     s    D *99=rO   r   )6r   loggingcore.feature_flagsr   core.permissionsr   r   django.confr   django.utils.decoratorsr   django_filters.rest_frameworkr   drf_spectacular.typesr	   drf_spectacular.utilsr
   r   r   	ml.modelsr   ml.serializersr   r   projects.modelsr   r   rest_frameworkr   r   rest_framework.parsersr   r   r   rest_framework.responser   rest_framework.viewsr   	getLoggerrY   r   _ml_backend_schemaformatHOSTNAMEINTListCreateAPIViewr@   RetrieveUpdateDestroyAPIViewrj   r   r   r   RetrieveAPIViewr   rc   rO   rM   <module>r      s    ' A   4 = . R R  N ) + J J , (			8	$  +

 '

 +

 "

 (

 (\*
 ,

 0

 -

 3
M*V [. b 	 !  	##?'? 	 	
  2
 &*&.!)

0 	 !"
 	##?'? 	 	
 ),2B2BWbno
 &*&,!)

.:x11 :/1^:D 	 !#
 	##?'? 	 	
  2
 &*&.!)

. 	 ! 
 	##?'? 	 	
 %)&+!)

* 	 !#
 	##?'? 	 	
 %)&.!)

* ud(CD">> " E++/D"  	 ! !%%Q	
  & )'`)!

 !-QR ,#2$@

 &*&-!)

O,/`	3 	3a/`	3 	 !! !%%Q	
 !-ST .#2$@

 &*&4!+
3!D!g !E!D!H 	 !0 !%%Q	
 /-TU
 &*&;!)

):)
W )
;:)
X 	 !$:9$ %, &&% #H$
#
( &*&;!)

/@=833 =A@=rO   