Process a recognition request. Args: request_data: Request payload containing messages, etc. Returns: (response_dict, http_status_code)
(self, request_data: Dict)
| 256 | ) |
| 257 | |
| 258 | def process(self, request_data: Dict) -> Tuple[Dict, int]: |
| 259 | """ |
| 260 | Process a recognition request. |
| 261 | |
| 262 | Args: |
| 263 | request_data: Request payload containing messages, etc. |
| 264 | |
| 265 | Returns: |
| 266 | (response_dict, http_status_code) |
| 267 | """ |
| 268 | if self._session is None: |
| 269 | self._session = self._make_session() |
| 270 | |
| 271 | # Convert request format based on API mode |
| 272 | if self.api_mode == "ollama_generate": |
| 273 | request_data = self._convert_to_ollama_generate(request_data) |
| 274 | else: |
| 275 | # Inject model field if configured (required by Ollama/MLX) |
| 276 | if self.model: |
| 277 | request_data["model"] = self.model |
| 278 | |
| 279 | headers = {"Content-Type": "application/json", **self.extra_headers} |
| 280 | if self.api_key: |
| 281 | headers["Authorization"] = f"Bearer {self.api_key}" |
| 282 | |
| 283 | total_attempts = int(self.retry_max_attempts) + 1 |
| 284 | last_error: Optional[str] = None |
| 285 | |
| 286 | for attempt in range(total_attempts): |
| 287 | try: |
| 288 | with profiler.measure("http_request"): |
| 289 | response = self._session.post( |
| 290 | self.api_url, |
| 291 | headers=headers, |
| 292 | data=json.dumps(request_data), |
| 293 | timeout=self.request_timeout, |
| 294 | verify=self.verify_ssl, |
| 295 | ) |
| 296 | |
| 297 | if response.status_code == 200: |
| 298 | result = response.json() |
| 299 | |
| 300 | # Parse response based on API mode |
| 301 | if self.api_mode == "ollama_generate": |
| 302 | # Ollama generate format: {"response": "...", "done": true, ...} |
| 303 | # Check for error field first |
| 304 | if "error" in result: |
| 305 | error_msg = result.get("error", "Unknown error") |
| 306 | logger.error("Ollama API returned error: %s", error_msg) |
| 307 | return {"error": f"Ollama API error: {error_msg}"}, 500 |
| 308 | |
| 309 | # Extract response field |
| 310 | output = result.get("response") |
| 311 | if output is None: |
| 312 | logger.error( |
| 313 | "Ollama API response missing 'response' field. Response: %s", |
| 314 | str(result)[:500], |
| 315 | ) |