| 1272 | } |
| 1273 | |
| 1274 | pub async fn do_generate( |
| 1275 | &self, |
| 1276 | options: GenerateOptions, |
| 1277 | ) -> Result<ResponsesGenerateResult, ProviderError> { |
| 1278 | let prepared = self.get_args(&options).await?; |
| 1279 | let url = (self.config.url)("/responses", &self.model_id); |
| 1280 | let headers = self.build_headers("application/json"); |
| 1281 | let request_body = serde_json::to_string(&prepared.body) |
| 1282 | .map_err(|e| ProviderError::InvalidRequest(format!("failed to encode body: {}", e)))?; |
| 1283 | |
| 1284 | let (status_code, raw) = if let Some(proxy) = get_custom_fetch_proxy(&self.config.provider) |
| 1285 | { |
| 1286 | let response = proxy |
| 1287 | .fetch(CustomFetchRequest { |
| 1288 | url, |
| 1289 | method: "POST".to_string(), |
| 1290 | headers: headers.clone(), |
| 1291 | body: Some(request_body), |
| 1292 | }) |
| 1293 | .await?; |
| 1294 | (response.status, response.body) |
| 1295 | } else { |
| 1296 | let client = self.config.client.clone().unwrap_or_default(); |
| 1297 | let mut request = client.post(url); |
| 1298 | for (k, v) in &headers { |
| 1299 | request = request.header(k, v); |
| 1300 | } |
| 1301 | let response = request |
| 1302 | .body(request_body) |
| 1303 | .send() |
| 1304 | .await |
| 1305 | .map_err(|e| ProviderError::NetworkError(e.to_string()))?; |
| 1306 | let status = response.status().as_u16(); |
| 1307 | let body = response |
| 1308 | .text() |
| 1309 | .await |
| 1310 | .map_err(|e| { |
| 1311 | let mut msg = e.to_string(); |
| 1312 | let mut source = std::error::Error::source(&e); |
| 1313 | while let Some(cause) = source { |
| 1314 | msg.push_str(": "); |
| 1315 | msg.push_str(&cause.to_string()); |
| 1316 | source = cause.source(); |
| 1317 | } |
| 1318 | ProviderError::ApiError(msg) |
| 1319 | })?; |
| 1320 | (status, body) |
| 1321 | }; |
| 1322 | if status_code >= 400 { |
| 1323 | return Err(ProviderError::ApiErrorWithStatus { |
| 1324 | message: raw, |
| 1325 | status_code, |
| 1326 | }); |
| 1327 | } |
| 1328 | |
| 1329 | let body: Value = serde_json::from_str(&raw) |
| 1330 | .map_err(|e| ProviderError::ApiError(format!("invalid responses payload: {}", e)))?; |
| 1331 | |