in prompt/prompt-executor/prompt-executor-clients/prompt-executor-bedrock-client/src/jvmMain/kotlin/ai/koog/prompt/executor/clients/bedrock/BedrockLLMClient.kt [518:565]
override suspend fun moderate(
prompt: Prompt,
model: LLModel
): ModerationResult {
if (moderationGuardrailsSettings == null) {
throw LLMClientException(
clientName,
"Moderation Guardrails settings are not provided to the Bedrock client. " +
"Please provide them to the BedrockClientSettings when creating the Bedrock client. " +
"See https://docs.aws.amazon.com/bedrock/latest/userguide/guardrails-use-independent-api.html for more information."
)
}
require(prompt.messages.isNotEmpty()) {
"Can't moderate an empty prompt"
}
val requestMessages = prompt.messages.filterIsInstance<Message.Request>()
val responseMessages = prompt.messages.filterIsInstance<Message.Response>()
logger.debug { "Moderating prompt with ${requestMessages.size} request messages and ${responseMessages.size} response messages" }
val inputGuardrailResponse = if (requestMessages.isNotEmpty()) {
requestGuardrails<Message.Request>(
moderationGuardrailsSettings,
prompt,
GuardrailContentSource.Input
)
} else {
null
}
val outputGuardrailResponse = if (responseMessages.isNotEmpty()) {
requestGuardrails<Message.Response>(
moderationGuardrailsSettings,
prompt,
GuardrailContentSource.Output
)
} else {
null
}
val inputIsHarmful = inputGuardrailResponse?.action is GuardrailAction.GuardrailIntervened
val outputIsHarmful = outputGuardrailResponse?.action is GuardrailAction.GuardrailIntervened
val categories = buildMap {
inputGuardrailResponse?.let { fillCategoriesMap(it) }
outputGuardrailResponse?.let { fillCategoriesMap(it) }
}
return ModerationResult(inputIsHarmful || outputIsHarmful, categories)
}