(&self, request: ChatRequest)
| 307 | } |
| 308 | |
| 309 | async fn chat(&self, request: ChatRequest) -> Result<ChatResponse, ProviderError> { |
| 310 | let endpoint = self.get_endpoint(); |
| 311 | let model_id = request.model.clone(); |
| 312 | let model_id_encoded = urlencoding::encode(&model_id); |
| 313 | |
| 314 | let bedrock_request = self.convert_request(request); |
| 315 | let body = serde_json::to_vec(&bedrock_request) |
| 316 | .map_err(|e| ProviderError::ApiError(e.to_string()))?; |
| 317 | |
| 318 | let headers = self |
| 319 | .sign_request( |
| 320 | "POST", |
| 321 | &format!("/model/{}/converse", model_id_encoded), |
| 322 | &body, |
| 323 | ) |
| 324 | .await?; |
| 325 | |
| 326 | let url = format!("{}/model/{}/converse", endpoint, model_id_encoded); |
| 327 | |
| 328 | let response = self |
| 329 | .client |
| 330 | .post(&url) |
| 331 | .headers(headers) |
| 332 | .body(body) |
| 333 | .send() |
| 334 | .await |
| 335 | .map_err(|e| ProviderError::NetworkError(e.to_string()))?; |
| 336 | |
| 337 | if !response.status().is_success() { |
| 338 | let status = response.status(); |
| 339 | let body = response.text().await.unwrap_or_default(); |
| 340 | return Err(ProviderError::ApiError(format!("{}: {}", status, body))); |
| 341 | } |
| 342 | |
| 343 | let bedrock_response: BedrockConverseResponse = response |
| 344 | .json() |
| 345 | .await |
| 346 | .map_err(|e| ProviderError::ApiError(e.to_string()))?; |
| 347 | |
| 348 | Ok(convert_bedrock_response(bedrock_response)) |
| 349 | } |
| 350 | |
| 351 | async fn chat_stream(&self, request: ChatRequest) -> Result<StreamResult, ProviderError> { |
| 352 | let endpoint = self.get_endpoint(); |
nothing calls this directly
no test coverage detected