in prompt/prompt-executor/prompt-executor-clients/prompt-executor-mistralai-client/src/commonMain/kotlin/ai/koog/prompt/executor/clients/mistralai/MistralAILLMClient.kt [222:280]
public override suspend fun moderate(prompt: Prompt, model: LLModel): ModerationResult {
logger.debug { "Moderating text and image content with model: $model" }
model.requireCapability(LLMCapability.Moderation)
require(prompt.messages.isNotEmpty()) { "Can't moderate an empty prompt" }
val input = prompt.messages
.map { message ->
require(!message.hasAttachments()) {
"Only text input is supported for MistralAI moderation"
}
message.toMessageContent(model)
}
.let { contents ->
when {
contents.all { it is Content.Text } -> {
val text = contents.joinToString(separator = "\n\n") { (it as Content.Text).value }
Content.Text(text)
}
else -> {
val parts = contents.flatMap { content ->
when (content) {
is Content.Parts -> content.value
is Content.Text -> listOf(OpenAIContentPart.Text(content.value))
}
}
Content.Parts(parts)
}
}
}
val request = MistralAIModerationRequest(model = model.id, input = input)
val response = try {
httpClient.post(
path = settings.moderationPath,
request = request,
requestBodyType = MistralAIModerationRequest::class,
responseType = MistralAIModerationResponse::class
)
} catch (e: CancellationException) {
throw e
} catch (e: Exception) {
throw LLMClientException(
clientName = clientName,
message = e.message,
cause = e
)
}
val result = response.results.firstOrNull() ?: run {
val exception = LLMClientException(clientName, "Empty results in MistralAI moderation response")
logger.error(exception) { exception.message }
throw exception
}
return result.toModerationResult()
}