(&self, request: LlmRequest)
| 166 | } |
| 167 | |
| 168 | async fn complete(&self, request: LlmRequest) -> GraphBitResult<LlmResponse> { |
| 169 | let url = format!("{}/chat/completions", self.base_url); |
| 170 | |
| 171 | let messages: Vec<PerplexityMessage> = |
| 172 | request.messages.iter().map(Self::convert_message).collect(); |
| 173 | |
| 174 | let tools: Option<Vec<PerplexityTool>> = if request.tools.is_empty() { |
| 175 | None |
| 176 | } else { |
| 177 | Some(request.tools.iter().map(Self::convert_tool).collect()) |
| 178 | }; |
| 179 | |
| 180 | let body = PerplexityRequest { |
| 181 | model: self.model.clone(), |
| 182 | messages, |
| 183 | max_tokens: request.max_tokens, |
| 184 | temperature: request.temperature, |
| 185 | top_p: request.top_p, |
| 186 | tools: tools.clone(), |
| 187 | tool_choice: if tools.is_some() { |
| 188 | Some("auto".to_string()) |
| 189 | } else { |
| 190 | None |
| 191 | }, |
| 192 | }; |
| 193 | |
| 194 | // Add extra parameters |
| 195 | let mut request_json = serde_json::to_value(&body)?; |
| 196 | if let serde_json::Value::Object(ref mut map) = request_json { |
| 197 | for (key, value) in request.extra_params { |
| 198 | map.insert(key, value); |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | let response = self |
| 203 | .client |
| 204 | .post(&url) |
| 205 | .header("Authorization", format!("Bearer {}", self.api_key)) |
| 206 | .header("Content-Type", "application/json") |
| 207 | .header("Accept", "application/json") |
| 208 | .json(&request_json) |
| 209 | .send() |
| 210 | .await |
| 211 | .map_err(|e| { |
| 212 | GraphBitError::llm_provider("perplexity", format!("Request failed: {e}")) |
| 213 | })?; |
| 214 | |
| 215 | if !response.status().is_success() { |
| 216 | let error_text = response |
| 217 | .text() |
| 218 | .await |
| 219 | .unwrap_or_else(|_| "Unknown error".to_string()); |
| 220 | return Err(GraphBitError::llm_provider( |
| 221 | "perplexity", |
| 222 | format!("API error: {error_text}"), |
| 223 | )); |
| 224 | } |
| 225 |
nothing calls this directly
no test coverage detected