// Package openai implements the go-llm v2 provider interface for OpenAI. // // The actual wire-protocol logic lives in the shared openaicompat package; // this file encodes OpenAI-specific Rules (temperature is rejected on o-series // and gpt-5* models) and supplies the default base URL. package openai import ( "strings" "gitea.stevedudenhoeffer.com/steve/go-llm/v2/openaicompat" ) // DefaultBaseURL is the public OpenAI Chat Completions endpoint. const DefaultBaseURL = "https://api.openai.com/v1" // Provider is the OpenAI chat-completion provider. It's a type alias over // openaicompat.Provider so existing callers using openai.Provider keep compiling. type Provider = openaicompat.Provider // New creates a new OpenAI provider. An empty baseURL uses DefaultBaseURL. func New(apiKey string, baseURL string) *Provider { if baseURL == "" { baseURL = DefaultBaseURL } return openaicompat.New(apiKey, baseURL, openaicompat.Rules{ RestrictTemperature: isReasoningModel, SupportsReasoning: isReasoningModel, }) } // isReasoningModel reports whether the named OpenAI model is a reasoning // model (o-series or gpt-5*). Reasoning models reject a user-supplied // temperature and accept a reasoning_effort parameter; everything else // rejects reasoning_effort. func isReasoningModel(model string) bool { return strings.HasPrefix(model, "o") || strings.HasPrefix(model, "gpt-5") }