(&self, request: ChatRequest)
| 218 | } |
| 219 | |
| 220 | async fn chat(&self, request: ChatRequest) -> Result<ChatResponse, ProviderError> { |
| 221 | let url = self.build_url(&request.model, "generateContent"); |
| 222 | let vertex_request = self.convert_request(request); |
| 223 | |
| 224 | let response = self |
| 225 | .client |
| 226 | .post(&url) |
| 227 | .header("Content-Type", "application/json") |
| 228 | .header( |
| 229 | "Authorization", |
| 230 | format!("Bearer {}", self.config.access_token), |
| 231 | ) |
| 232 | .json(&vertex_request) |
| 233 | .send() |
| 234 | .await |
| 235 | .map_err(|e| ProviderError::NetworkError(e.to_string()))?; |
| 236 | |
| 237 | if !response.status().is_success() { |
| 238 | let status = response.status(); |
| 239 | let body = response.text().await.unwrap_or_default(); |
| 240 | return Err(ProviderError::api_error_with_status( |
| 241 | format!("{}: {}", status, body), |
| 242 | status.as_u16(), |
| 243 | )); |
| 244 | } |
| 245 | |
| 246 | let vertex_response: VertexResponse = response |
| 247 | .json() |
| 248 | .await |
| 249 | .map_err(|e| ProviderError::ApiError(e.to_string()))?; |
| 250 | |
| 251 | Ok(convert_vertex_response(vertex_response)) |
| 252 | } |
| 253 | |
| 254 | async fn chat_stream(&self, request: ChatRequest) -> Result<StreamResult, ProviderError> { |
| 255 | let url = self.build_url(&request.model, "streamGenerateContent"); |
nothing calls this directly
no test coverage detected