override suspend fun execute()

in prompt/prompt-executor/prompt-executor-clients/prompt-executor-bedrock-client/src/jvmMain/kotlin/ai/koog/prompt/executor/clients/bedrock/BedrockLLMClient.kt [207:274]


    override suspend fun execute(
        prompt: Prompt,
        model: LLModel,
        tools: List<ToolDescriptor>
    ): List<Message.Response> {
        logger.debug { "Executing prompt for model: ${model.id}" }
        val modelFamily = getBedrockModelFamily(model)
        model.requireCapability(LLMCapability.Completion, "Model ${model.id} does not support chat completions")
        // Check tool support
        if (tools.isNotEmpty() && !model.capabilities.contains(LLMCapability.Tools)) {
            throw LLMClientException(clientName, "Model ${model.id} does not support tools")
        }
        val requestBody = createRequestBody(prompt, model, tools)
        val invokeRequest = InvokeModelRequest {
            this.modelId = model.id
            this.contentType = "application/json"
            this.accept = "*/*"
            this.body = requestBody.encodeToByteArray()
        }
        logger.debug { "Bedrock InvokeModel Request: ModelID: ${model.id}, Body: $requestBody" }
        return withContext(Dispatchers.SuitableForIO) {
            try {
                val response = bedrockClient.invokeModel(invokeRequest)
                val responseBodyString = response.body.decodeToString()
                logger.debug { "Bedrock InvokeModel Response: $responseBodyString" }
                if (responseBodyString.isBlank()) {
                    val exception =
                        LLMClientException(clientName, "Received null or empty body from Bedrock model ${model.id}")
                    logger.error(exception) { exception.message }
                    throw exception
                }
                return@withContext when (modelFamily) {
                    is BedrockModelFamilies.AI21Jamba -> BedrockAI21JambaSerialization.parseJambaResponse(
                        responseBodyString,
                        clock
                    )

                    is BedrockModelFamilies.AmazonNova -> BedrockAmazonNovaSerialization.parseNovaResponse(
                        responseBodyString,
                        clock
                    )

                    is BedrockModelFamilies.AnthropicClaude -> BedrockAnthropicClaudeSerialization.parseAnthropicResponse(
                        responseBodyString,
                        clock
                    )

                    is BedrockModelFamilies.Meta -> BedrockMetaLlamaSerialization.parseLlamaResponse(
                        responseBodyString,
                        clock
                    )

                    is BedrockModelFamilies.TitanEmbedding, is BedrockModelFamilies.Cohere -> throw LLMClientException(
                        clientName,
                        "Model family ${modelFamily.display} does not support chat completions; use embed() API instead."
                    )
                }
            } catch (e: CancellationException) {
                throw e
            } catch (e: Exception) {
                throw LLMClientException(
                    clientName = clientName,
                    message = e.message,
                    cause = e
                )
            }
        }
    }