Source code for oumi.inference.openai_inference_engine

# Copyright 2025 - Oumi
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import copy
from typing import Any

from typing_extensions import override

from oumi.core.configs import GenerationParams, ModelParams, RemoteParams
from oumi.core.types.conversation import Conversation
from oumi.inference.remote_inference_engine import RemoteInferenceEngine

# OpenAI reasoning models that only support temperature=1.0 and don't support
# logit_bias.
# This includes o-series models and GPT-5 family.
# Reference: https://platform.openai.com/docs/guides/reasoning
_REASONING_MODEL_PREFIXES = ("o1", "o3", "o4", "gpt-5")


def _is_reasoning_model(model_name: str) -> bool:
    """Check if a model is an OpenAI reasoning model.

    Reasoning models only support temperature=1.0 and don't support logit_bias.

    Args:
        model_name: The name of the model to check.

    Returns:
        True if the model is a reasoning model, False otherwise.
    """
    return model_name.startswith(_REASONING_MODEL_PREFIXES)


[docs] class OpenAIInferenceEngine(RemoteInferenceEngine): """Engine for running inference against the OpenAI API.""" @property @override def base_url(self) -> str | None: """Return the default base URL for the OpenAI API.""" return "https://api.openai.com/v1/chat/completions" @property @override def api_key_env_varname(self) -> str | None: """Return the default environment variable name for the OpenAI API key.""" return "OPENAI_API_KEY" @override def _convert_conversation_to_api_input( self, conversation: Conversation, generation_params: GenerationParams, model_params: ModelParams, ) -> dict[str, Any]: """Converts a conversation to an OpenAI input. Documentation: https://platform.openai.com/docs/api-reference/chat/create Args: conversation: The conversation to convert. generation_params: Parameters for generation during inference. model_params: Model parameters to use during inference. Returns: Dict[str, Any]: A dictionary representing the OpenAI input. """ if _is_reasoning_model(model_params.model_name): generation_params = copy.deepcopy(generation_params) # Reasoning models do NOT support logit_bias. generation_params.logit_bias = {} # Reasoning models only support temperature = 1.0. generation_params.temperature = 1.0 return super()._convert_conversation_to_api_input( conversation=conversation, generation_params=generation_params, model_params=model_params, ) @override def _default_remote_params(self) -> RemoteParams: """Returns the default remote parameters.""" return RemoteParams(num_workers=50, politeness_policy=60.0)