(
state: web::Data<Arc<RwLock<Master<M>>>>,
request: ChatRequest,
)
| 119 | } |
| 120 | |
| 121 | async fn generate_text_blocking<M: Model>( |
| 122 | state: web::Data<Arc<RwLock<Master<M>>>>, |
| 123 | request: ChatRequest, |
| 124 | ) -> HttpResponse { |
| 125 | let mut master = state.write().await; |
| 126 | |
| 127 | if !master.model.as_ref().is_some_and(|m| m.output_modality() == OutputModality::Text) { |
| 128 | return HttpResponse::NotFound() |
| 129 | .json(serde_json::json!({"error": "No text model loaded"})); |
| 130 | } |
| 131 | |
| 132 | if let Err(e) = master.reset() { |
| 133 | return HttpResponse::InternalServerError().json(serde_json::json!({"error": format!("{e}")})); |
| 134 | } |
| 135 | |
| 136 | let num_messages = request.messages.len(); |
| 137 | let model = master.model.as_mut().unwrap(); |
| 138 | for message in request.messages { |
| 139 | if let Err(e) = model.add_message(message) { |
| 140 | return HttpResponse::InternalServerError().json(serde_json::json!({"error": format!("{e}")})); |
| 141 | } |
| 142 | } |
| 143 | |
| 144 | let mut resp = String::new(); |
| 145 | let mut finish_reason = "length".to_string(); |
| 146 | |
| 147 | let gen_result = master |
| 148 | .generate_text(request.max_tokens, |data| { |
| 149 | if data.is_empty() { |
| 150 | finish_reason = "stop".to_string(); |
| 151 | } else { |
| 152 | resp += data; |
| 153 | } |
| 154 | }) |
| 155 | .await; |
| 156 | |
| 157 | println!(); |
| 158 | |
| 159 | let completion_tokens = master |
| 160 | .model |
| 161 | .as_ref() |
| 162 | .map(|m| m.generated_tokens()) |
| 163 | .unwrap_or(0); |
| 164 | |
| 165 | let _ = master.goodbye().await; |
| 166 | |
| 167 | if let Err(e) = gen_result { |
| 168 | return HttpResponse::InternalServerError().json(serde_json::json!({"error": format!("{e}")})); |
| 169 | } |
| 170 | |
| 171 | let response = ChatResponse::new( |
| 172 | M::MODEL_NAME.to_string(), |
| 173 | resp, |
| 174 | num_messages, |
| 175 | completion_tokens, |
| 176 | finish_reason, |
| 177 | ); |
| 178 |
no test coverage detected