| 67 | } |
| 68 | |
| 69 | async fn chat(&self, request: ChatRequest) -> Result<ChatResponse, ProviderError> { |
| 70 | let url = CEREBRAS_API_URL; |
| 71 | |
| 72 | let mut body = serde_json::json!({ |
| 73 | "model": request.model, |
| 74 | "messages": request.messages, |
| 75 | }); |
| 76 | |
| 77 | if let Some(temp) = request.temperature { |
| 78 | body["temperature"] = serde_json::json!(temp); |
| 79 | } |
| 80 | if let Some(max_tokens) = request.max_tokens { |
| 81 | body["max_tokens"] = serde_json::json!(max_tokens); |
| 82 | } |
| 83 | if let Some(tools) = &request.tools { |
| 84 | if !tools.is_empty() { |
| 85 | body["tools"] = serde_json::json!(tools); |
| 86 | } |
| 87 | } |
| 88 | |
| 89 | let response = self |
| 90 | .client |
| 91 | .post(url) |
| 92 | .header("Authorization", format!("Bearer {}", self.api_key)) |
| 93 | .header("Content-Type", "application/json") |
| 94 | .json(&body) |
| 95 | .send() |
| 96 | .await |
| 97 | .map_err(|e| ProviderError::NetworkError(e.to_string()))?; |
| 98 | |
| 99 | if !response.status().is_success() { |
| 100 | let error_text = response.text().await.unwrap_or_default(); |
| 101 | return Err(ProviderError::ApiError(error_text)); |
| 102 | } |
| 103 | |
| 104 | let chat_response: ChatResponse = response |
| 105 | .json() |
| 106 | .await |
| 107 | .map_err(|e| ProviderError::ApiError(e.to_string()))?; |
| 108 | |
| 109 | Ok(chat_response) |
| 110 | } |
| 111 | |
| 112 | async fn chat_stream(&self, request: ChatRequest) -> Result<StreamResult, ProviderError> { |
| 113 | let url = CEREBRAS_API_URL; |