in prompt/prompt-executor/prompt-executor-clients/prompt-executor-openai-client/src/commonMain/kotlin/ai/koog/prompt/executor/clients/openai/OpenAILLMClient.kt [127:181]
override fun serializeProviderChatRequest(
messages: List<OpenAIMessage>,
model: LLModel,
tools: List<OpenAITool>?,
toolChoice: OpenAIToolChoice?,
params: LLMParams,
stream: Boolean
): String {
val chatParams = params.toOpenAIChatParams()
val modalities = if (model.supports(LLMCapability.Audio)) {
listOf(OpenAIModalities.Text, OpenAIModalities.Audio)
} else {
null
}
val audioConfig = if (chatParams.audio == null && model.supports(LLMCapability.Audio)) {
OpenAIAudioConfig(OpenAIAudioFormat.MP3, OpenAIAudioVoice.Alloy)
} else {
chatParams.audio
}
val responseFormat = createResponseFormat(chatParams.schema, model)
val request = OpenAIChatCompletionRequest(
messages = messages,
model = model.id,
audio = audioConfig,
frequencyPenalty = chatParams.frequencyPenalty,
logprobs = chatParams.logprobs,
maxCompletionTokens = chatParams.maxTokens,
modalities = modalities,
numberOfChoices = model.takeIf { it.supports(LLMCapability.MultipleChoices) }
?.let { chatParams.numberOfChoices },
parallelToolCalls = chatParams.parallelToolCalls,
prediction = chatParams.speculation?.let { OpenAIStaticContent(OpenAIContent.Text(it)) },
presencePenalty = chatParams.presencePenalty,
promptCacheKey = chatParams.promptCacheKey,
reasoningEffort = chatParams.reasoningEffort,
responseFormat = responseFormat,
safetyIdentifier = chatParams.safetyIdentifier,
serviceTier = chatParams.serviceTier,
stop = chatParams.stop,
store = chatParams.store,
stream = stream,
temperature = chatParams.temperature,
toolChoice = toolChoice,
tools = tools,
topLogprobs = chatParams.topLogprobs,
topP = chatParams.topP,
user = chatParams.user,
webSearchOptions = chatParams.webSearchOptions,
additionalProperties = chatParams.additionalProperties,
)
return json.encodeToString(OpenAIChatCompletionRequestSerializer, request)
}