(&self, request: LlmRequest)
| 195 | } |
| 196 | |
| 197 | async fn complete(&self, request: LlmRequest) -> GraphBitResult<LlmResponse> { |
| 198 | let url = format!("{}/chat/completions", self.base_url); |
| 199 | |
| 200 | let messages: Vec<FireworksMessage> = |
| 201 | request.messages.iter().map(Self::convert_message).collect(); |
| 202 | |
| 203 | let tools: Option<Vec<FireworksTool>> = if request.tools.is_empty() { |
| 204 | None |
| 205 | } else { |
| 206 | Some(request.tools.iter().map(Self::convert_tool).collect()) |
| 207 | }; |
| 208 | |
| 209 | let body = FireworksRequest { |
| 210 | model: self.model.clone(), |
| 211 | messages, |
| 212 | max_tokens: request.max_tokens, |
| 213 | temperature: request.temperature, |
| 214 | top_p: request.top_p, |
| 215 | tools: tools.clone(), |
| 216 | tool_choice: if tools.is_some() { |
| 217 | Some("auto".to_string()) |
| 218 | } else { |
| 219 | None |
| 220 | }, |
| 221 | }; |
| 222 | |
| 223 | // Add extra parameters |
| 224 | let mut request_json = serde_json::to_value(&body)?; |
| 225 | if let serde_json::Value::Object(ref mut map) = request_json { |
| 226 | for (key, value) in request.extra_params { |
| 227 | map.insert(key, value); |
| 228 | } |
| 229 | } |
| 230 | |
| 231 | let response = self |
| 232 | .client |
| 233 | .post(&url) |
| 234 | .header("Authorization", format!("Bearer {}", self.api_key)) |
| 235 | .header("Content-Type", "application/json") |
| 236 | .json(&request_json) |
| 237 | .send() |
| 238 | .await |
| 239 | .map_err(|e| { |
| 240 | GraphBitError::llm_provider("fireworks", format!("Request failed: {e}")) |
| 241 | })?; |
| 242 | |
| 243 | if !response.status().is_success() { |
| 244 | let error_text = response |
| 245 | .text() |
| 246 | .await |
| 247 | .unwrap_or_else(|_| "Unknown error".to_string()); |
| 248 | return Err(GraphBitError::llm_provider( |
| 249 | "fireworks", |
| 250 | format!("API error: {error_text}"), |
| 251 | )); |
| 252 | } |
| 253 | |
| 254 | let fireworks_response: FireworksResponse = response.json().await.map_err(|e| { |
nothing calls this directly
no test coverage detected