override suspend fun moderate()

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)
    }