diff --git a/rlm/clients/openai.py b/rlm/clients/openai.py index d5fa99966..48e8ed37c 100644 --- a/rlm/clients/openai.py +++ b/rlm/clients/openai.py @@ -13,6 +13,7 @@ # Load API keys from environment variables DEFAULT_OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") DEFAULT_OPENROUTER_API_KEY = os.getenv("OPENROUTER_API_KEY") +DEFAULT_PRIME_INTELLECT_BASE_URL = "https://api.pinference.ai/api/v1/" class OpenAIClient(BaseLM): @@ -58,7 +59,13 @@ def completion(self, prompt: str | list[dict[str, Any]], model: str | None = Non if not model: raise ValueError("Model name is required for OpenAI client.") - response = self.client.chat.completions.create(model=model, messages=messages) + extra_body = {} + if self.client.base_url == DEFAULT_PRIME_INTELLECT_BASE_URL: + extra_body["usage"] = {"include": True} + + response = self.client.chat.completions.create( + model=model, messages=messages, extra_body=extra_body + ) self._track_cost(response, model) return response.choices[0].message.content @@ -76,19 +83,30 @@ async def acompletion( if not model: raise ValueError("Model name is required for OpenAI client.") - response = await self.async_client.chat.completions.create(model=model, messages=messages) + extra_body = {} + if self.base_url == DEFAULT_PRIME_INTELLECT_BASE_URL: + extra_body["usage"] = {"include": True} + + response = await self.async_client.chat.completions.create( + model=model, messages=messages, extra_body=extra_body + ) self._track_cost(response, model) return response.choices[0].message.content def _track_cost(self, response: openai.ChatCompletion, model: str): self.model_call_counts[model] += 1 - self.model_input_tokens[model] += response.usage.prompt_tokens - self.model_output_tokens[model] += response.usage.completion_tokens - self.model_total_tokens[model] += response.usage.total_tokens + + usage = getattr(response, "usage", None) + if usage is None: + raise ValueError("No usage data received. Tracking tokens not possible.") + + self.model_input_tokens[model] += usage.prompt_tokens + self.model_output_tokens[model] += usage.completion_tokens + self.model_total_tokens[model] += usage.total_tokens # Track last call for handler to read - self.last_prompt_tokens = response.usage.prompt_tokens - self.last_completion_tokens = response.usage.completion_tokens + self.last_prompt_tokens = usage.prompt_tokens + self.last_completion_tokens = usage.completion_tokens def get_usage_summary(self) -> UsageSummary: model_summaries = {}