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