
    {h(                        d Z ddlmZ ddlmZmZ ddlZ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  G d	 d
ee         Zy)z
Batch processor for unified batch processing across providers.

This module contains the BatchProcessor class that provides a unified interface
for batch processing across different LLM providers.
    )annotations)AnyGenericN   )BatchResultBatchSuccess
BatchErrorBatchJobInfoT)BatchRequest)get_providerc                      e Zd ZdZddZ	 	 d	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 ddZddZddZdddZ		 d	 	 	 	 	 dd	Z
dd
ZddZddZddZy)BatchProcessorz7Unified batch processor that works across all providersc                    || _         || _        	 |j                  dd      \  | _        | _        t        | j                        | _        y # t
        $ r}t        d      |d }~ww xY w)N/r   ziModel string must be in format "provider/model-name" (e.g. "openai/gpt-4" or "anthropic/claude-3-sonnet"))modelresponse_modelsplitprovider_name
model_name
ValueErrorr   provider)selfr   r   errs       [/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/instructor/batch/processor.py__init__zBatchProcessor.__init__   sn    
,	27++c12E/D %T%7%78  	G 	s   A
 
	A$AA$c           	        t         j                  j                  |      rt        j                  |       g }t	        |      D ]g  \  }}t        | j                     d| || j                  | j                  ||      }|j                  || j                         |j                  |       i t        d| dt        |       d       |S )a  Create batch file from list of message conversations

        Args:
            messages_list: List of message conversations, each as a list of message dicts
            file_path: Path to save the batch request file
            max_tokens: Maximum tokens per request
            temperature: Temperature for generation

        Returns:
            The file path where the batch was saved
        zrequest-)	custom_idmessagesr   r   
max_tokenstemperaturezCreated batch file z with z	 requests)ospathexistsremove	enumerater   r   r   save_to_filer   appendprintlen)	r   messages_list	file_pathr    r!   batch_requestsir   batch_requests	            r   create_batch_from_messagesz)BatchProcessor.create_batch_from_messages$   s    & 77>>)$IIi $]3 
	1KAx()<)<=$QC.!#22oo%'M &&y$2D2DE!!-0
	1 	#I;fS5H4IST    Nc                L    |ddi} | j                   j                  |fd|i|S )a   Submit batch job to the provider and return job ID

        Args:
            file_path: Path to the batch request file
            metadata: Optional metadata to attach to the batch job
            **kwargs: Additional provider-specific arguments
        descriptionzInstructor batch jobmetadata)r   submit_batch)r   r,   r4   kwargss       r   r5   zBatchProcessor.submit_batchJ   s6     %'=>H)t}})))QhQ&QQr1   c                8    | j                   j                  |      S )z&Get batch job status from the provider)r   
get_statusr   batch_ids     r   get_batch_statuszBatchProcessor.get_batch_statusY   s    }}''11r1   c                Z    | j                   j                  |      }| j                  |      S )z2Retrieve and parse batch results from the provider)r   retrieve_resultsparse_results)r   r:   results_contents      r   r=   zBatchProcessor.retrieve_results]   s'    --88B!!/22r1   c                8    | j                   j                  |      S )zList batch jobs for the current provider

        Args:
            limit: Maximum number of batch jobs to return

        Returns:
            List of BatchJobInfo objects with normalized batch information
        )r   list_batches)r   limits     r   rA   zBatchProcessor.list_batchesb   s     }}))%00r1   c                d    | j                  |      }|| j                  j                  ||       |S )a  Get batch results, optionally saving raw results to a file

        Args:
            batch_id: The batch job ID
            file_path: Optional file path to save raw results. If provided,
                      raw results will be saved to this file. If not provided,
                      results are only kept in memory.

        Returns:
            List of BatchResult objects (BatchSuccess[T] or BatchError)
        )r=   r   download_results)r   r:   r,   r?   s       r   get_resultszBatchProcessor.get_resultsm   s6     //9  MM**8Y?r1   c                8    | j                   j                  |      S )zCancel a batch job

        Args:
            batch_id: The batch job ID to cancel

        Returns:
            Dict containing the cancelled batch information
        )r   cancel_batchr9   s     r   rG   zBatchProcessor.cancel_batch        }}))(33r1   c                8    | j                   j                  |      S )zDelete a batch job (only available for completed batches)

        Args:
            batch_id: The batch job ID to delete

        Returns:
            Dict containing the deletion confirmation
        )r   delete_batchr9   s     r   rJ   zBatchProcessor.delete_batch   rH   r1   c           
        g }|j                         j                  d      }|D ]5  }|j                         s	 t        j                  |      }|j	                  dd      }| j                  |      }|r9	  | j                  di |}t        t           ||      }	|j                  |	       nd
}d}| j                  dk(  rzd|v rv|d   }|j	                  d      dk(  r]|j	                  di       }t        |t              r.d|v r*|d   }|j	                  dd      }|j	                  dd      }nt!        |      }d}t        ||||      }|j                  |       8 |S # t        $ rD}
t        |dd| j                  j                   d|
 |      }|j                  |       Y d	}
~
Md	}
~
ww xY w# t        $ r0}
t        ddd|
 d|i      }|j                  |       Y d	}
~
d	}
~
ww xY w)zWParse batch results from content string into Maybe-like results with custom_id tracking
r   unknown)r   resultparsing_errorzFailed to parse into z: )r   
error_typeerror_messageraw_dataNzUnknown errorextraction_error	anthropicrN   typeerrormessagezUnknown Anthropic erroranthropic_errorjson_parse_errorzFailed to parse JSON: raw_line )stripr   jsonloadsget_extract_from_responser   r   r   r(   	Exceptionr	   __name__r   
isinstancedictstr)r   r?   resultslineslinedatar   extracted_datarN   batch_resulteerror_resultrQ   rP   
error_infoerror_detailss                   r   r>   zBatchProcessor.parse_results   s   %'%%'--d3 =	-D::<9-zz$' HH[)<	!%!<!<T!B!5!4!4!4!F~!F'3A&/(  |4 %4M!3J))[8X=M!%h!::f-8)/GR)@J)*d;:@U0:70C0=0A0A$-/H1" .;->->$*,=."
 14J->
#-"+#-&3!%	$L NN<0i=	-~ ] % 5'1&/'6,A$BUBUB^B^A__abcad*e%3	(  |445J  -)'1$:1#">($/	  |,,-sB   :F/57E,B.F/	F,(:F'"F/'F,,F//	G(8%G##G(c                   	 | j                   dk(  r)|d   d   d   d   d   d   }t        j                  |      S | j                   dk(  rd	|vry
|d	   }|j                  d      dk(  ry
|j                  d      dk(  rd|v r|d   d   }t	        |t
              rt        |      dkD  rt|D ]*  }|j                  d      dk(  s|j                  di       c S  |D ]@  }|j                  d      dk(  s|j                  dd      }	 t        j                  |      c S  y
	 y
# t        j                  $ r Y [w xY w# t        $ r Y y
w xY w)z>Extract structured data from provider-specific response formatopenairesponsebodychoicesr   rW   contentrT   rN   NrU   rV   	succeededtool_useinputtext )	r   r]   r^   r_   rc   listr*   JSONDecodeErrorra   )r   ri   ru   rN   itemry   s         r   r`   z%BatchProcessor._extract_from_response   sq   '	!!X-z*629=a@KIVzz'**##{24'h ::f%0 ::f%4f9L$Y/	:G!'40S\A5E$+ =D#xx/:='+xx'< <=
 %, -D#xx/69'+xx';!-+/::d+;$;	- = 3F  (,';'; !-$,!-
  		s_   7D6 D6 D6 (AD6  D6 D6 /D6 DD6 D6 D30D6 2D33D6 6	EE)r   re   r   ztype[T])i  g?)
r+   zlist[list[dict[str, Any]]]r,   re   r    z
int | Noner!   zfloat | Nonereturnre   )N)r,   re   r4   dict[str, Any] | Noner~   re   )r:   re   r~   dict[str, Any])r:   re   r~   list[BatchResult])
   )rB   intr~   zlist[BatchJobInfo])r:   re   r,   z
str | Noner~   r   )r?   re   r~   r   )ri   r   r~   r   )rb   
__module____qualname____doc__r   r0   r5   r;   r=   rA   rE   rG   rJ   r>   r`   r[   r1   r   r   r      s    A9( "&$'$1$ $ 	$
 "$ 
$N AERR(=R	R23
	1 6:(2	.	4	4DL+r1   r   )r   
__future__r   typingr   r   r]   r"   modelsr   r   r	   r
   r   requestr   	providersr   r   r[   r1   r   <module>r      s6    #   	 J J ! #zWQZ zr1   