batch_mode_batch_workflow/
language_model_batch_workflow.rs1crate::ix!();
3
4pub type LanguageModelClientArc = Arc<dyn LanguageModelClientInterface<LanguageModelBatchWorkflowError>>;
5
6pub trait ComputeSystemMessage {
14 fn system_message() -> String;
16}
17
18pub trait ComputeLanguageModelCoreQuery {
19 type Seed: HasAssociatedOutputName + Named;
21
22 fn compute_language_model_core_query(
25 &self,
26 input: &Self::Seed
27 ) -> String;
28}
29
30#[async_trait]
31pub trait FinishProcessingUncompletedBatches {
32 type Error;
33
34 async fn finish_processing_uncompleted_batches(
38 &self,
39 expected_content_type: &ExpectedContentType
40 ) -> Result<(), Self::Error>;
41}
42
43pub trait ComputeLanguageModelRequests {
45
46 type Seed: HasAssociatedOutputName + Send + Sync;
47
48 fn compute_language_model_requests(
52 &self,
53 model: &LanguageModelType,
54 input_tokens: &[Self::Seed]
55 ) -> Vec<LanguageModelBatchAPIRequest>;
56}
57
58#[async_trait]
59pub trait ProcessBatchRequests {
60
61 type Error;
62
63 async fn process_batch_requests(
67 &self,
68 batch_requests: &[LanguageModelBatchAPIRequest],
69 expected_content_type: &ExpectedContentType,
70 ) -> Result<(), Self::Error>;
71}
72
73#[async_trait]
83pub trait LanguageModelBatchWorkflow<E: From<LanguageModelBatchCreationError>>:
84 FinishProcessingUncompletedBatches<Error = E>
85 + ComputeLanguageModelRequests
86 + ProcessBatchRequests<Error = E>
87{
88 const REQUESTS_PER_BATCH: usize = 80;
89
90 async fn plant_seed_and_wait(
91 &mut self,
92 input_tokens: &[<Self as ComputeLanguageModelRequests>::Seed]
93 ) -> Result<(), E>;
94
95 async fn execute_language_model_batch_workflow(
99 &mut self,
100 model: LanguageModelType,
101 expected_content_type: ExpectedContentType,
102 input_tokens: &[<Self as ComputeLanguageModelRequests>::Seed]
103 ) -> Result<(), E>
104 {
105 info!("Beginning full batch workflow execution");
106
107 self.finish_processing_uncompleted_batches(&expected_content_type).await?;
108
109 let requests: Vec<_> = self.compute_language_model_requests(&model, input_tokens);
110
111 let enumerated_batches = construct_batches(&requests, Self::REQUESTS_PER_BATCH, false)?;
113
114 for (batch_idx, batch_requests) in enumerated_batches {
116 info!("Processing batch #{}", batch_idx);
117 self.process_batch_requests(batch_requests, &expected_content_type).await?;
120 }
121
122 Ok(())
123 }
124}
125
126#[async_trait]
129pub trait LanguageModelBatchWorkflowGatherResults {
130 type Error;
131 type Seed: HasAssociatedOutputName + Clone + Named;
132 type Output: LoadFromFile<Error = SaveLoadError>;
133
134 async fn gather_results(
137 &self,
138 seeds: &[Self::Seed]
139 ) -> Result<Vec<(Self::Seed, Self::Output)>, Self::Error>;
140}