diff --git a/docs/clients/bedrock-runtime.md b/docs/clients/bedrock-runtime.md
index f690ca3fc..434f9cf3d 100644
--- a/docs/clients/bedrock-runtime.md
+++ b/docs/clients/bedrock-runtime.md
@@ -41,3 +41,28 @@ echo $response['content'][0]['text'];
 
 ```
 more information [InvokeModel](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html)
+
+### Converse
+
+```php
+use AsyncAws\BedrockRuntime\BedrockRuntimeClient;
+use AsyncAws\BedrockRuntime\Input\ConverseRequest;
+use AsyncAws\BedrockRuntime\ValueObject\ContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\Message;
+
+$bedrockRuntime = new BedrockRuntimeClient();
+
+$result = $bedrockRuntime->converse(new ConverseRequest([
+    'modelId' => 'us.anthropic.claude-3-7-sonnet-20250219-v1:0',
+    'messages' => [new Message([
+        'role' => 'user',
+        'content' => [new ContentBlock([
+            'text' => 'Write me a love poem.'
+        ])],
+    ])]
+]));
+
+echo $result->getOutput()->getMessage()->getContent()[0]->getText();
+
+```
+more information [Converse](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html)
diff --git a/manifest.json b/manifest.json
index 5aee20eda..ca5dec90c 100644
--- a/manifest.json
+++ b/manifest.json
@@ -71,6 +71,7 @@
             "example": "https://raw.githubusercontent.com/aws/aws-sdk-php/${LATEST}/src/data/bedrock-runtime/2023-09-30/examples-1.json",
             "api-reference": "https://docs.aws.amazon.com/bedrock/latest/APIReference",
             "methods": [
+                "Converse",
                 "InvokeModel"
             ]
         },
diff --git a/src/Service/BedrockRuntime/composer.json b/src/Service/BedrockRuntime/composer.json
index 93ab0a6fc..77b81b573 100644
--- a/src/Service/BedrockRuntime/composer.json
+++ b/src/Service/BedrockRuntime/composer.json
@@ -12,6 +12,7 @@
     ],
     "require": {
         "php": "^7.2.5 || ^8.0",
+        "ext-json": "*",
         "async-aws/core": "^1.9"
     },
     "autoload": {
diff --git a/src/Service/BedrockRuntime/src/BedrockRuntimeClient.php b/src/Service/BedrockRuntime/src/BedrockRuntimeClient.php
index ad61d58cc..a2a12868f 100644
--- a/src/Service/BedrockRuntime/src/BedrockRuntimeClient.php
+++ b/src/Service/BedrockRuntime/src/BedrockRuntimeClient.php
@@ -14,8 +14,18 @@
 use AsyncAws\BedrockRuntime\Exception\ServiceUnavailableException;
 use AsyncAws\BedrockRuntime\Exception\ThrottlingException;
 use AsyncAws\BedrockRuntime\Exception\ValidationException;
+use AsyncAws\BedrockRuntime\Input\ConverseRequest;
 use AsyncAws\BedrockRuntime\Input\InvokeModelRequest;
+use AsyncAws\BedrockRuntime\Result\ConverseResponse;
 use AsyncAws\BedrockRuntime\Result\InvokeModelResponse;
+use AsyncAws\BedrockRuntime\ValueObject\Document;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\InferenceConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\Message;
+use AsyncAws\BedrockRuntime\ValueObject\PerformanceConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\PromptVariableValues;
+use AsyncAws\BedrockRuntime\ValueObject\SystemContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ToolConfiguration;
 use AsyncAws\Core\AbstractApi;
 use AsyncAws\Core\AwsError\AwsErrorFactoryInterface;
 use AsyncAws\Core\AwsError\JsonRestAwsErrorFactory;
@@ -24,6 +34,91 @@
 
 class BedrockRuntimeClient extends AbstractApi
 {
+    /**
+     * Sends messages to the specified Amazon Bedrock model. `Converse` provides a consistent interface that works with all
+     * models that support messages. This allows you to write code once and use it with different models. If a model has
+     * unique inference parameters, you can also pass those unique parameters to the model.
+     *
+     * Amazon Bedrock doesn't store any text, images, or documents that you provide as content. The data is only used to
+     * generate the response.
+     *
+     * You can submit a prompt by including it in the `messages` field, specifying the `modelId` of a foundation model or
+     * inference profile to run inference on it, and including any other fields that are relevant to your use case.
+     *
+     * You can also submit a prompt from Prompt management by specifying the ARN of the prompt version and including a map
+     * of variables to values in the `promptVariables` field. You can append more messages to the prompt by using the
+     * `messages` field. If you use a prompt from Prompt management, you can't include the following fields in the request:
+     * `additionalModelRequestFields`, `inferenceConfig`, `system`, or `toolConfig`. Instead, these fields must be defined
+     * through Prompt management. For more information, see Use a prompt from Prompt management [^1].
+     *
+     * For information about the Converse API, see *Use the Converse API* in the *Amazon Bedrock User Guide*. To use a
+     * guardrail, see *Use a guardrail with the Converse API* in the *Amazon Bedrock User Guide*. To use a tool with a
+     * model, see *Tool use (Function calling)* in the *Amazon Bedrock User Guide*
+     *
+     * For example code, see *Converse API examples* in the *Amazon Bedrock User Guide*.
+     *
+     * This operation requires permission for the `bedrock:InvokeModel` action.
+     *
+     * ! To deny all inference access to resources that you specify in the modelId field, you need to deny access to the
+     * ! `bedrock:InvokeModel` and `bedrock:InvokeModelWithResponseStream` actions. Doing this also denies access to the
+     * ! resource through the base inference actions (InvokeModel [^2] and InvokeModelWithResponseStream [^3]). For more
+     * ! information see Deny access for inference on specific models [^4].
+     *
+     * For troubleshooting some of the common errors you might encounter when using the `Converse` API, see Troubleshooting
+     * Amazon Bedrock API Error Codes [^5] in the Amazon Bedrock User Guide
+     *
+     * [^1]: https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-management-use.html
+     * [^2]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html
+     * [^3]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModelWithResponseStream.html
+     * [^4]: https://docs.aws.amazon.com/bedrock/latest/userguide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-deny-inference
+     * [^5]: https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html
+     *
+     * @see https://docs.aws.amazon.com/bedrock/latest/APIReference/API_Converse.html
+     * @see https://docs.aws.amazon.com/aws-sdk-php/v3/api/api-bedrock-runtime-2023-09-30.html#converse
+     *
+     * @param array{
+     *   modelId: string,
+     *   messages?: null|array<Message|array>,
+     *   system?: null|array<SystemContentBlock|array>,
+     *   inferenceConfig?: null|InferenceConfiguration|array,
+     *   toolConfig?: null|ToolConfiguration|array,
+     *   guardrailConfig?: null|GuardrailConfiguration|array,
+     *   additionalModelRequestFields?: null|Document|array,
+     *   promptVariables?: null|array<string, PromptVariableValues|array>,
+     *   additionalModelResponseFieldPaths?: null|string[],
+     *   requestMetadata?: null|array<string, string>,
+     *   performanceConfig?: null|PerformanceConfiguration|array,
+     *   '@region'?: string|null,
+     * }|ConverseRequest $input
+     *
+     * @throws AccessDeniedException
+     * @throws ResourceNotFoundException
+     * @throws ThrottlingException
+     * @throws ModelTimeoutException
+     * @throws InternalServerException
+     * @throws ServiceUnavailableException
+     * @throws ValidationException
+     * @throws ModelNotReadyException
+     * @throws ModelErrorException
+     */
+    public function converse($input): ConverseResponse
+    {
+        $input = ConverseRequest::create($input);
+        $response = $this->getResponse($input->request(), new RequestContext(['operation' => 'Converse', 'region' => $input->getRegion(), 'exceptionMapping' => [
+            'AccessDeniedException' => AccessDeniedException::class,
+            'ResourceNotFoundException' => ResourceNotFoundException::class,
+            'ThrottlingException' => ThrottlingException::class,
+            'ModelTimeoutException' => ModelTimeoutException::class,
+            'InternalServerException' => InternalServerException::class,
+            'ServiceUnavailableException' => ServiceUnavailableException::class,
+            'ValidationException' => ValidationException::class,
+            'ModelNotReadyException' => ModelNotReadyException::class,
+            'ModelErrorException' => ModelErrorException::class,
+        ]]));
+
+        return new ConverseResponse($response);
+    }
+
     /**
      * Invokes the specified Amazon Bedrock model to run inference using the prompt and inference parameters provided in the
      * request body. You use model inference to generate text, images, and embeddings.
diff --git a/src/Service/BedrockRuntime/src/Enum/ConversationRole.php b/src/Service/BedrockRuntime/src/Enum/ConversationRole.php
new file mode 100644
index 000000000..30f0929c7
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/ConversationRole.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class ConversationRole
+{
+    public const ASSISTANT = 'assistant';
+    public const USER = 'user';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::ASSISTANT => true,
+            self::USER => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/DocumentFormat.php b/src/Service/BedrockRuntime/src/Enum/DocumentFormat.php
new file mode 100644
index 000000000..efdae4d01
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/DocumentFormat.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class DocumentFormat
+{
+    public const CSV = 'csv';
+    public const DOC = 'doc';
+    public const DOCX = 'docx';
+    public const HTML = 'html';
+    public const MD = 'md';
+    public const PDF = 'pdf';
+    public const TXT = 'txt';
+    public const XLS = 'xls';
+    public const XLSX = 'xlsx';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::CSV => true,
+            self::DOC => true,
+            self::DOCX => true,
+            self::HTML => true,
+            self::MD => true,
+            self::PDF => true,
+            self::TXT => true,
+            self::XLS => true,
+            self::XLSX => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailContentFilterConfidence.php b/src/Service/BedrockRuntime/src/Enum/GuardrailContentFilterConfidence.php
new file mode 100644
index 000000000..dff88782f
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailContentFilterConfidence.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailContentFilterConfidence
+{
+    public const HIGH = 'HIGH';
+    public const LOW = 'LOW';
+    public const MEDIUM = 'MEDIUM';
+    public const NONE = 'NONE';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::HIGH => true,
+            self::LOW => true,
+            self::MEDIUM => true,
+            self::NONE => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailContentFilterStrength.php b/src/Service/BedrockRuntime/src/Enum/GuardrailContentFilterStrength.php
new file mode 100644
index 000000000..a78caafdb
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailContentFilterStrength.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailContentFilterStrength
+{
+    public const HIGH = 'HIGH';
+    public const LOW = 'LOW';
+    public const MEDIUM = 'MEDIUM';
+    public const NONE = 'NONE';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::HIGH => true,
+            self::LOW => true,
+            self::MEDIUM => true,
+            self::NONE => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailContentFilterType.php b/src/Service/BedrockRuntime/src/Enum/GuardrailContentFilterType.php
new file mode 100644
index 000000000..b3a251c97
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailContentFilterType.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailContentFilterType
+{
+    public const HATE = 'HATE';
+    public const INSULTS = 'INSULTS';
+    public const MISCONDUCT = 'MISCONDUCT';
+    public const PROMPT_ATTACK = 'PROMPT_ATTACK';
+    public const SEXUAL = 'SEXUAL';
+    public const VIOLENCE = 'VIOLENCE';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::HATE => true,
+            self::INSULTS => true,
+            self::MISCONDUCT => true,
+            self::PROMPT_ATTACK => true,
+            self::SEXUAL => true,
+            self::VIOLENCE => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailContentPolicyAction.php b/src/Service/BedrockRuntime/src/Enum/GuardrailContentPolicyAction.php
new file mode 100644
index 000000000..e514bcdf7
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailContentPolicyAction.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailContentPolicyAction
+{
+    public const BLOCKED = 'BLOCKED';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::BLOCKED => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailContextualGroundingFilterType.php b/src/Service/BedrockRuntime/src/Enum/GuardrailContextualGroundingFilterType.php
new file mode 100644
index 000000000..c0f460d88
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailContextualGroundingFilterType.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailContextualGroundingFilterType
+{
+    public const GROUNDING = 'GROUNDING';
+    public const RELEVANCE = 'RELEVANCE';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::GROUNDING => true,
+            self::RELEVANCE => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailContextualGroundingPolicyAction.php b/src/Service/BedrockRuntime/src/Enum/GuardrailContextualGroundingPolicyAction.php
new file mode 100644
index 000000000..f328fcbfd
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailContextualGroundingPolicyAction.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailContextualGroundingPolicyAction
+{
+    public const BLOCKED = 'BLOCKED';
+    public const NONE = 'NONE';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::BLOCKED => true,
+            self::NONE => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailConverseContentQualifier.php b/src/Service/BedrockRuntime/src/Enum/GuardrailConverseContentQualifier.php
new file mode 100644
index 000000000..2647c3570
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailConverseContentQualifier.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailConverseContentQualifier
+{
+    public const GROUNDING_SOURCE = 'grounding_source';
+    public const GUARD_CONTENT = 'guard_content';
+    public const QUERY = 'query';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::GROUNDING_SOURCE => true,
+            self::GUARD_CONTENT => true,
+            self::QUERY => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailConverseImageFormat.php b/src/Service/BedrockRuntime/src/Enum/GuardrailConverseImageFormat.php
new file mode 100644
index 000000000..27bc5ccd5
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailConverseImageFormat.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailConverseImageFormat
+{
+    public const JPEG = 'jpeg';
+    public const PNG = 'png';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::JPEG => true,
+            self::PNG => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailManagedWordType.php b/src/Service/BedrockRuntime/src/Enum/GuardrailManagedWordType.php
new file mode 100644
index 000000000..b26945c91
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailManagedWordType.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailManagedWordType
+{
+    public const PROFANITY = 'PROFANITY';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::PROFANITY => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailPiiEntityType.php b/src/Service/BedrockRuntime/src/Enum/GuardrailPiiEntityType.php
new file mode 100644
index 000000000..a75c4a985
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailPiiEntityType.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailPiiEntityType
+{
+    public const ADDRESS = 'ADDRESS';
+    public const AGE = 'AGE';
+    public const AWS_ACCESS_KEY = 'AWS_ACCESS_KEY';
+    public const AWS_SECRET_KEY = 'AWS_SECRET_KEY';
+    public const CA_HEALTH_NUMBER = 'CA_HEALTH_NUMBER';
+    public const CA_SOCIAL_INSURANCE_NUMBER = 'CA_SOCIAL_INSURANCE_NUMBER';
+    public const CREDIT_DEBIT_CARD_CVV = 'CREDIT_DEBIT_CARD_CVV';
+    public const CREDIT_DEBIT_CARD_EXPIRY = 'CREDIT_DEBIT_CARD_EXPIRY';
+    public const CREDIT_DEBIT_CARD_NUMBER = 'CREDIT_DEBIT_CARD_NUMBER';
+    public const DRIVER_ID = 'DRIVER_ID';
+    public const EMAIL = 'EMAIL';
+    public const INTERNATIONAL_BANK_ACCOUNT_NUMBER = 'INTERNATIONAL_BANK_ACCOUNT_NUMBER';
+    public const IP_ADDRESS = 'IP_ADDRESS';
+    public const LICENSE_PLATE = 'LICENSE_PLATE';
+    public const MAC_ADDRESS = 'MAC_ADDRESS';
+    public const NAME = 'NAME';
+    public const PASSWORD = 'PASSWORD';
+    public const PHONE = 'PHONE';
+    public const PIN = 'PIN';
+    public const SWIFT_CODE = 'SWIFT_CODE';
+    public const UK_NATIONAL_HEALTH_SERVICE_NUMBER = 'UK_NATIONAL_HEALTH_SERVICE_NUMBER';
+    public const UK_NATIONAL_INSURANCE_NUMBER = 'UK_NATIONAL_INSURANCE_NUMBER';
+    public const UK_UNIQUE_TAXPAYER_REFERENCE_NUMBER = 'UK_UNIQUE_TAXPAYER_REFERENCE_NUMBER';
+    public const URL = 'URL';
+    public const USERNAME = 'USERNAME';
+    public const US_BANK_ACCOUNT_NUMBER = 'US_BANK_ACCOUNT_NUMBER';
+    public const US_BANK_ROUTING_NUMBER = 'US_BANK_ROUTING_NUMBER';
+    public const US_INDIVIDUAL_TAX_IDENTIFICATION_NUMBER = 'US_INDIVIDUAL_TAX_IDENTIFICATION_NUMBER';
+    public const US_PASSPORT_NUMBER = 'US_PASSPORT_NUMBER';
+    public const US_SOCIAL_SECURITY_NUMBER = 'US_SOCIAL_SECURITY_NUMBER';
+    public const VEHICLE_IDENTIFICATION_NUMBER = 'VEHICLE_IDENTIFICATION_NUMBER';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::ADDRESS => true,
+            self::AGE => true,
+            self::AWS_ACCESS_KEY => true,
+            self::AWS_SECRET_KEY => true,
+            self::CA_HEALTH_NUMBER => true,
+            self::CA_SOCIAL_INSURANCE_NUMBER => true,
+            self::CREDIT_DEBIT_CARD_CVV => true,
+            self::CREDIT_DEBIT_CARD_EXPIRY => true,
+            self::CREDIT_DEBIT_CARD_NUMBER => true,
+            self::DRIVER_ID => true,
+            self::EMAIL => true,
+            self::INTERNATIONAL_BANK_ACCOUNT_NUMBER => true,
+            self::IP_ADDRESS => true,
+            self::LICENSE_PLATE => true,
+            self::MAC_ADDRESS => true,
+            self::NAME => true,
+            self::PASSWORD => true,
+            self::PHONE => true,
+            self::PIN => true,
+            self::SWIFT_CODE => true,
+            self::UK_NATIONAL_HEALTH_SERVICE_NUMBER => true,
+            self::UK_NATIONAL_INSURANCE_NUMBER => true,
+            self::UK_UNIQUE_TAXPAYER_REFERENCE_NUMBER => true,
+            self::URL => true,
+            self::USERNAME => true,
+            self::US_BANK_ACCOUNT_NUMBER => true,
+            self::US_BANK_ROUTING_NUMBER => true,
+            self::US_INDIVIDUAL_TAX_IDENTIFICATION_NUMBER => true,
+            self::US_PASSPORT_NUMBER => true,
+            self::US_SOCIAL_SECURITY_NUMBER => true,
+            self::VEHICLE_IDENTIFICATION_NUMBER => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailSensitiveInformationPolicyAction.php b/src/Service/BedrockRuntime/src/Enum/GuardrailSensitiveInformationPolicyAction.php
new file mode 100644
index 000000000..876474e91
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailSensitiveInformationPolicyAction.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailSensitiveInformationPolicyAction
+{
+    public const ANONYMIZED = 'ANONYMIZED';
+    public const BLOCKED = 'BLOCKED';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::ANONYMIZED => true,
+            self::BLOCKED => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailTopicPolicyAction.php b/src/Service/BedrockRuntime/src/Enum/GuardrailTopicPolicyAction.php
new file mode 100644
index 000000000..73fa7280b
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailTopicPolicyAction.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailTopicPolicyAction
+{
+    public const BLOCKED = 'BLOCKED';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::BLOCKED => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailTopicType.php b/src/Service/BedrockRuntime/src/Enum/GuardrailTopicType.php
new file mode 100644
index 000000000..a916866a1
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailTopicType.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailTopicType
+{
+    public const DENY = 'DENY';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::DENY => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailTrace.php b/src/Service/BedrockRuntime/src/Enum/GuardrailTrace.php
new file mode 100644
index 000000000..b6d47f17c
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailTrace.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailTrace
+{
+    public const DISABLED = 'disabled';
+    public const ENABLED = 'enabled';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::DISABLED => true,
+            self::ENABLED => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/GuardrailWordPolicyAction.php b/src/Service/BedrockRuntime/src/Enum/GuardrailWordPolicyAction.php
new file mode 100644
index 000000000..f1981c075
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/GuardrailWordPolicyAction.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class GuardrailWordPolicyAction
+{
+    public const BLOCKED = 'BLOCKED';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::BLOCKED => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/ImageFormat.php b/src/Service/BedrockRuntime/src/Enum/ImageFormat.php
new file mode 100644
index 000000000..cb77b60ec
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/ImageFormat.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class ImageFormat
+{
+    public const GIF = 'gif';
+    public const JPEG = 'jpeg';
+    public const PNG = 'png';
+    public const WEBP = 'webp';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::GIF => true,
+            self::JPEG => true,
+            self::PNG => true,
+            self::WEBP => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/StopReason.php b/src/Service/BedrockRuntime/src/Enum/StopReason.php
new file mode 100644
index 000000000..8e221350f
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/StopReason.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class StopReason
+{
+    public const CONTENT_FILTERED = 'content_filtered';
+    public const END_TURN = 'end_turn';
+    public const GUARDRAIL_INTERVENED = 'guardrail_intervened';
+    public const MAX_TOKENS = 'max_tokens';
+    public const STOP_SEQUENCE = 'stop_sequence';
+    public const TOOL_USE = 'tool_use';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::CONTENT_FILTERED => true,
+            self::END_TURN => true,
+            self::GUARDRAIL_INTERVENED => true,
+            self::MAX_TOKENS => true,
+            self::STOP_SEQUENCE => true,
+            self::TOOL_USE => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/ToolResultStatus.php b/src/Service/BedrockRuntime/src/Enum/ToolResultStatus.php
new file mode 100644
index 000000000..8eb0b580a
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/ToolResultStatus.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class ToolResultStatus
+{
+    public const ERROR = 'error';
+    public const SUCCESS = 'success';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::ERROR => true,
+            self::SUCCESS => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Enum/VideoFormat.php b/src/Service/BedrockRuntime/src/Enum/VideoFormat.php
new file mode 100644
index 000000000..64f39060f
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Enum/VideoFormat.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Enum;
+
+final class VideoFormat
+{
+    public const FLV = 'flv';
+    public const MKV = 'mkv';
+    public const MOV = 'mov';
+    public const MPEG = 'mpeg';
+    public const MPG = 'mpg';
+    public const MP_4 = 'mp4';
+    public const THREE_GP = 'three_gp';
+    public const WEBM = 'webm';
+    public const WMV = 'wmv';
+
+    public static function exists(string $value): bool
+    {
+        return isset([
+            self::FLV => true,
+            self::MKV => true,
+            self::MOV => true,
+            self::MPEG => true,
+            self::MPG => true,
+            self::MP_4 => true,
+            self::THREE_GP => true,
+            self::WEBM => true,
+            self::WMV => true,
+        ][$value]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Input/ConverseRequest.php b/src/Service/BedrockRuntime/src/Input/ConverseRequest.php
new file mode 100644
index 000000000..08f31f0fb
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Input/ConverseRequest.php
@@ -0,0 +1,464 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Input;
+
+use AsyncAws\BedrockRuntime\ValueObject\Document;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\InferenceConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\Message;
+use AsyncAws\BedrockRuntime\ValueObject\PerformanceConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\PromptVariableValues;
+use AsyncAws\BedrockRuntime\ValueObject\SystemContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\Tool;
+use AsyncAws\BedrockRuntime\ValueObject\ToolConfiguration;
+use AsyncAws\Core\Exception\InvalidArgument;
+use AsyncAws\Core\Input;
+use AsyncAws\Core\Request;
+use AsyncAws\Core\Stream\StreamFactory;
+
+final class ConverseRequest extends Input
+{
+    /**
+     * Specifies the model or throughput with which to run inference, or the prompt resource to use in inference. The value
+     * depends on the resource that you use:
+     *
+     * - If you use a base model, specify the model ID or its ARN. For a list of model IDs for base models, see Amazon
+     *   Bedrock base model IDs (on-demand throughput) [^1] in the Amazon Bedrock User Guide.
+     * - If you use an inference profile, specify the inference profile ID or its ARN. For a list of inference profile IDs,
+     *   see Supported Regions and models for cross-region inference [^2] in the Amazon Bedrock User Guide.
+     * - If you use a provisioned model, specify the ARN of the Provisioned Throughput. For more information, see Run
+     *   inference using a Provisioned Throughput [^3] in the Amazon Bedrock User Guide.
+     * - If you use a custom model, first purchase Provisioned Throughput for it. Then specify the ARN of the resulting
+     *   provisioned model. For more information, see Use a custom model in Amazon Bedrock [^4] in the Amazon Bedrock User
+     *   Guide.
+     * - To include a prompt that was defined in Prompt management [^5], specify the ARN of the prompt version to use.
+     *
+     * The Converse API doesn't support imported models [^6].
+     *
+     * [^1]: https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html#model-ids-arns
+     * [^2]: https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference-support.html
+     * [^3]: https://docs.aws.amazon.com/bedrock/latest/userguide/prov-thru-use.html
+     * [^4]: https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-use.html
+     * [^5]: https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-management.html
+     * [^6]: https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-import-model.html
+     *
+     * @required
+     *
+     * @var string|null
+     */
+    private $modelId;
+
+    /**
+     * The messages that you want to send to the model.
+     *
+     * @var Message[]|null
+     */
+    private $messages;
+
+    /**
+     * A prompt that provides instructions or context to the model about the task it should perform, or the persona it
+     * should adopt during the conversation.
+     *
+     * @var SystemContentBlock[]|null
+     */
+    private $system;
+
+    /**
+     * Inference parameters to pass to the model. `Converse` and `ConverseStream` support a base set of inference
+     * parameters. If you need to pass additional parameters that the model supports, use the `additionalModelRequestFields`
+     * request field.
+     *
+     * @var InferenceConfiguration|null
+     */
+    private $inferenceConfig;
+
+    /**
+     * Configuration information for the tools that the model can use when generating a response.
+     *
+     * For information about models that support tool use, see Supported models and model features [^1].
+     *
+     * [^1]: https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html#conversation-inference-supported-models-features
+     *
+     * @var ToolConfiguration|null
+     */
+    private $toolConfig;
+
+    /**
+     * Configuration information for a guardrail that you want to use in the request. If you include `guardContent` blocks
+     * in the `content` field in the `messages` field, the guardrail operates only on those messages. If you include no
+     * `guardContent` blocks, the guardrail operates on all messages in the request body and in any included prompt
+     * resource.
+     *
+     * @var GuardrailConfiguration|null
+     */
+    private $guardrailConfig;
+
+    /**
+     * Additional inference parameters that the model supports, beyond the base set of inference parameters that `Converse`
+     * and `ConverseStream` support in the `inferenceConfig` field. For more information, see Model parameters [^1].
+     *
+     * [^1]: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html
+     *
+     * @var Document|null
+     */
+    private $additionalModelRequestFields;
+
+    /**
+     * Contains a map of variables in a prompt from Prompt management to objects containing the values to fill in for them
+     * when running model invocation. This field is ignored if you don't specify a prompt resource in the `modelId` field.
+     *
+     * @var array<string, PromptVariableValues>|null
+     */
+    private $promptVariables;
+
+    /**
+     * Additional model parameters field paths to return in the response. `Converse` and `ConverseStream` return the
+     * requested fields as a JSON Pointer object in the `additionalModelResponseFields` field. The following is example JSON
+     * for `additionalModelResponseFieldPaths`.
+     *
+     * `[ "/stop_sequence" ]`
+     *
+     * For information about the JSON Pointer syntax, see the Internet Engineering Task Force (IETF) [^1] documentation.
+     *
+     * `Converse` and `ConverseStream` reject an empty JSON Pointer or incorrectly structured JSON Pointer with a `400`
+     * error code. if the JSON Pointer is valid, but the requested field is not in the model response, it is ignored by
+     * `Converse`.
+     *
+     * [^1]: https://datatracker.ietf.org/doc/html/rfc6901
+     *
+     * @var string[]|null
+     */
+    private $additionalModelResponseFieldPaths;
+
+    /**
+     * Key-value pairs that you can use to filter invocation logs.
+     *
+     * @var array<string, string>|null
+     */
+    private $requestMetadata;
+
+    /**
+     * Model performance settings for the request.
+     *
+     * @var PerformanceConfiguration|null
+     */
+    private $performanceConfig;
+
+    /**
+     * @param array{
+     *   modelId?: string,
+     *   messages?: null|array<Message|array>,
+     *   system?: null|array<SystemContentBlock|array>,
+     *   inferenceConfig?: null|InferenceConfiguration|array,
+     *   toolConfig?: null|ToolConfiguration|array,
+     *   guardrailConfig?: null|GuardrailConfiguration|array,
+     *   additionalModelRequestFields?: null|Document|array,
+     *   promptVariables?: null|array<string, PromptVariableValues|array>,
+     *   additionalModelResponseFieldPaths?: null|string[],
+     *   requestMetadata?: null|array<string, string>,
+     *   performanceConfig?: null|PerformanceConfiguration|array,
+     *   '@region'?: string|null,
+     * } $input
+     */
+    public function __construct(array $input = [])
+    {
+        $this->modelId = $input['modelId'] ?? null;
+        $this->messages = isset($input['messages']) ? array_map([Message::class, 'create'], $input['messages']) : null;
+        $this->system = isset($input['system']) ? array_map([SystemContentBlock::class, 'create'], $input['system']) : null;
+        $this->inferenceConfig = isset($input['inferenceConfig']) ? InferenceConfiguration::create($input['inferenceConfig']) : null;
+        $this->toolConfig = isset($input['toolConfig']) ? ToolConfiguration::create($input['toolConfig']) : null;
+        $this->guardrailConfig = isset($input['guardrailConfig']) ? GuardrailConfiguration::create($input['guardrailConfig']) : null;
+        $this->additionalModelRequestFields = isset($input['additionalModelRequestFields']) ? Document::create($input['additionalModelRequestFields']) : null;
+
+        if (isset($input['promptVariables'])) {
+            $this->promptVariables = [];
+            foreach ($input['promptVariables'] as $key => $item) {
+                $this->promptVariables[$key] = PromptVariableValues::create($item);
+            }
+        }
+        $this->additionalModelResponseFieldPaths = $input['additionalModelResponseFieldPaths'] ?? null;
+        $this->requestMetadata = $input['requestMetadata'] ?? null;
+        $this->performanceConfig = isset($input['performanceConfig']) ? PerformanceConfiguration::create($input['performanceConfig']) : null;
+        parent::__construct($input);
+    }
+
+    /**
+     * @param array{
+     *   modelId?: string,
+     *   messages?: null|array<Message|array>,
+     *   system?: null|array<SystemContentBlock|array>,
+     *   inferenceConfig?: null|InferenceConfiguration|array,
+     *   toolConfig?: null|ToolConfiguration|array,
+     *   guardrailConfig?: null|GuardrailConfiguration|array,
+     *   additionalModelRequestFields?: null|Document|array,
+     *   promptVariables?: null|array<string, PromptVariableValues|array>,
+     *   additionalModelResponseFieldPaths?: null|string[],
+     *   requestMetadata?: null|array<string, string>,
+     *   performanceConfig?: null|PerformanceConfiguration|array,
+     *   '@region'?: string|null,
+     * }|ConverseRequest $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getAdditionalModelRequestFields(): ?Document
+    {
+        return $this->additionalModelRequestFields;
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getAdditionalModelResponseFieldPaths(): array
+    {
+        return $this->additionalModelResponseFieldPaths ?? [];
+    }
+
+    public function getGuardrailConfig(): ?GuardrailConfiguration
+    {
+        return $this->guardrailConfig;
+    }
+
+    public function getInferenceConfig(): ?InferenceConfiguration
+    {
+        return $this->inferenceConfig;
+    }
+
+    /**
+     * @return Message[]
+     */
+    public function getMessages(): array
+    {
+        return $this->messages ?? [];
+    }
+
+    public function getModelId(): ?string
+    {
+        return $this->modelId;
+    }
+
+    public function getPerformanceConfig(): ?PerformanceConfiguration
+    {
+        return $this->performanceConfig;
+    }
+
+    /**
+     * @return array<string, PromptVariableValues>
+     */
+    public function getPromptVariables(): array
+    {
+        return $this->promptVariables ?? [];
+    }
+
+    /**
+     * @return array<string, string>
+     */
+    public function getRequestMetadata(): array
+    {
+        return $this->requestMetadata ?? [];
+    }
+
+    /**
+     * @return SystemContentBlock[]
+     */
+    public function getSystem(): array
+    {
+        return $this->system ?? [];
+    }
+
+    public function getToolConfig(): ?ToolConfiguration
+    {
+        return $this->toolConfig;
+    }
+
+    /**
+     * @internal
+     */
+    public function request(): Request
+    {
+        // Prepare headers
+        $headers = [
+            'Content-Type' => 'application/json',
+            'Accept' => 'application/json',
+        ];
+
+        // Prepare query
+        $query = [];
+
+        // Prepare URI
+        $uri = [];
+        if (null === $v = $this->modelId) {
+            throw new InvalidArgument(\sprintf('Missing parameter "modelId" for "%s". The value cannot be null.', __CLASS__));
+        }
+        $uri['modelId'] = $v;
+        $uriString = '/model/' . rawurlencode($uri['modelId']) . '/converse';
+
+        // Prepare Body
+        $bodyPayload = $this->requestBody();
+        $body = empty($bodyPayload) ? '{}' : json_encode($bodyPayload, 4194304);
+
+        // Return the Request
+        return new Request('POST', $uriString, $query, $headers, StreamFactory::create($body));
+    }
+
+    public function setAdditionalModelRequestFields(?Document $value): self
+    {
+        $this->additionalModelRequestFields = $value;
+
+        return $this;
+    }
+
+    /**
+     * @param string[] $value
+     */
+    public function setAdditionalModelResponseFieldPaths(array $value): self
+    {
+        $this->additionalModelResponseFieldPaths = $value;
+
+        return $this;
+    }
+
+    public function setGuardrailConfig(?GuardrailConfiguration $value): self
+    {
+        $this->guardrailConfig = $value;
+
+        return $this;
+    }
+
+    public function setInferenceConfig(?InferenceConfiguration $value): self
+    {
+        $this->inferenceConfig = $value;
+
+        return $this;
+    }
+
+    /**
+     * @param Message[] $value
+     */
+    public function setMessages(array $value): self
+    {
+        $this->messages = $value;
+
+        return $this;
+    }
+
+    public function setModelId(?string $value): self
+    {
+        $this->modelId = $value;
+
+        return $this;
+    }
+
+    public function setPerformanceConfig(?PerformanceConfiguration $value): self
+    {
+        $this->performanceConfig = $value;
+
+        return $this;
+    }
+
+    /**
+     * @param array<string, PromptVariableValues> $value
+     */
+    public function setPromptVariables(array $value): self
+    {
+        $this->promptVariables = $value;
+
+        return $this;
+    }
+
+    /**
+     * @param array<string, string> $value
+     */
+    public function setRequestMetadata(array $value): self
+    {
+        $this->requestMetadata = $value;
+
+        return $this;
+    }
+
+    /**
+     * @param SystemContentBlock[] $value
+     */
+    public function setSystem(array $value): self
+    {
+        $this->system = $value;
+
+        return $this;
+    }
+
+    public function setToolConfig(?ToolConfiguration $value): self
+    {
+        $this->toolConfig = $value;
+
+        return $this;
+    }
+
+    private function requestBody(): array
+    {
+        $payload = [];
+
+        if (null !== $v = $this->messages) {
+            $index = -1;
+            $payload['messages'] = [];
+            foreach ($v as $listValue) {
+                ++$index;
+                $payload['messages'][$index] = $listValue->requestBody();
+            }
+        }
+        if (null !== $v = $this->system) {
+            $index = -1;
+            $payload['system'] = [];
+            foreach ($v as $listValue) {
+                ++$index;
+                $payload['system'][$index] = $listValue->requestBody();
+            }
+        }
+        if (null !== $v = $this->inferenceConfig) {
+            $payload['inferenceConfig'] = $v->requestBody();
+        }
+        if (null !== $v = $this->toolConfig) {
+            $payload['toolConfig'] = $v->requestBody();
+        }
+        if (null !== $v = $this->guardrailConfig) {
+            $payload['guardrailConfig'] = $v->requestBody();
+        }
+        if (null !== $v = $this->additionalModelRequestFields) {
+            $payload['additionalModelRequestFields'] = $v->requestBody();
+        }
+        if (null !== $v = $this->promptVariables) {
+            if (empty($v)) {
+                $payload['promptVariables'] = new \stdClass();
+            } else {
+                $payload['promptVariables'] = [];
+                foreach ($v as $name => $mv) {
+                    $payload['promptVariables'][$name] = $mv->requestBody();
+                }
+            }
+        }
+        if (null !== $v = $this->additionalModelResponseFieldPaths) {
+            $index = -1;
+            $payload['additionalModelResponseFieldPaths'] = [];
+            foreach ($v as $listValue) {
+                ++$index;
+                $payload['additionalModelResponseFieldPaths'][$index] = $listValue;
+            }
+        }
+        if (null !== $v = $this->requestMetadata) {
+            if (empty($v)) {
+                $payload['requestMetadata'] = new \stdClass();
+            } else {
+                $payload['requestMetadata'] = [];
+                foreach ($v as $name => $mv) {
+                    $payload['requestMetadata'][$name] = $mv;
+                }
+            }
+        }
+        if (null !== $v = $this->performanceConfig) {
+            $payload['performanceConfig'] = $v->requestBody();
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/Result/ConverseResponse.php b/src/Service/BedrockRuntime/src/Result/ConverseResponse.php
new file mode 100644
index 000000000..8edbdcea4
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/Result/ConverseResponse.php
@@ -0,0 +1,730 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Result;
+
+use AsyncAws\BedrockRuntime\Enum\GuardrailConverseContentQualifier;
+use AsyncAws\BedrockRuntime\Enum\StopReason;
+use AsyncAws\BedrockRuntime\ValueObject\ContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ConverseMetrics;
+use AsyncAws\BedrockRuntime\ValueObject\ConverseOutput;
+use AsyncAws\BedrockRuntime\ValueObject\ConverseTrace;
+use AsyncAws\BedrockRuntime\ValueObject\Document;
+use AsyncAws\BedrockRuntime\ValueObject\DocumentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\DocumentSource;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailAssessment;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailContentFilter;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailContentPolicyAssessment;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailContextualGroundingFilter;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailContextualGroundingPolicyAssessment;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConverseContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConverseImageBlock;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConverseImageSource;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConverseTextBlock;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailCoverage;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailCustomWord;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailImageCoverage;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailInvocationMetrics;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailManagedWord;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailPiiEntityFilter;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailRegexFilter;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailSensitiveInformationPolicyAssessment;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailTextCharactersCoverage;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailTopic;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailTopicPolicyAssessment;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailTraceAssessment;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailUsage;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailWordPolicyAssessment;
+use AsyncAws\BedrockRuntime\ValueObject\ImageBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ImageSource;
+use AsyncAws\BedrockRuntime\ValueObject\Message;
+use AsyncAws\BedrockRuntime\ValueObject\PerformanceConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\PromptRouterTrace;
+use AsyncAws\BedrockRuntime\ValueObject\ReasoningContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ReasoningTextBlock;
+use AsyncAws\BedrockRuntime\ValueObject\S3Location;
+use AsyncAws\BedrockRuntime\ValueObject\TokenUsage;
+use AsyncAws\BedrockRuntime\ValueObject\ToolResultBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ToolResultContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ToolUseBlock;
+use AsyncAws\BedrockRuntime\ValueObject\VideoBlock;
+use AsyncAws\BedrockRuntime\ValueObject\VideoSource;
+use AsyncAws\Core\Response;
+use AsyncAws\Core\Result;
+
+class ConverseResponse extends Result
+{
+    /**
+     * The result from the call to `Converse`.
+     *
+     * @var ConverseOutput
+     */
+    private $output;
+
+    /**
+     * The reason why the model stopped generating output.
+     *
+     * @var StopReason::*
+     */
+    private $stopReason;
+
+    /**
+     * The total number of tokens used in the call to `Converse`. The total includes the tokens input to the model and the
+     * tokens generated by the model.
+     *
+     * @var TokenUsage
+     */
+    private $usage;
+
+    /**
+     * Metrics for the call to `Converse`.
+     *
+     * @var ConverseMetrics
+     */
+    private $metrics;
+
+    /**
+     * Additional fields in the response that are unique to the model.
+     *
+     * @var Document|null
+     */
+    private $additionalModelResponseFields;
+
+    /**
+     * A trace object that contains information about the Guardrail behavior.
+     *
+     * @var ConverseTrace|null
+     */
+    private $trace;
+
+    /**
+     * Model performance settings for the request.
+     *
+     * @var PerformanceConfiguration|null
+     */
+    private $performanceConfig;
+
+    public function getAdditionalModelResponseFields(): ?Document
+    {
+        $this->initialize();
+
+        return $this->additionalModelResponseFields;
+    }
+
+    public function getMetrics(): ConverseMetrics
+    {
+        $this->initialize();
+
+        return $this->metrics;
+    }
+
+    public function getOutput(): ConverseOutput
+    {
+        $this->initialize();
+
+        return $this->output;
+    }
+
+    public function getPerformanceConfig(): ?PerformanceConfiguration
+    {
+        $this->initialize();
+
+        return $this->performanceConfig;
+    }
+
+    /**
+     * @return StopReason::*
+     */
+    public function getStopReason(): string
+    {
+        $this->initialize();
+
+        return $this->stopReason;
+    }
+
+    public function getTrace(): ?ConverseTrace
+    {
+        $this->initialize();
+
+        return $this->trace;
+    }
+
+    public function getUsage(): TokenUsage
+    {
+        $this->initialize();
+
+        return $this->usage;
+    }
+
+    protected function populateResult(Response $response): void
+    {
+        $data = $response->toArray();
+
+        $this->output = $this->populateResultConverseOutput($data['output']);
+        $this->stopReason = (string) $data['stopReason'];
+        $this->usage = $this->populateResultTokenUsage($data['usage']);
+        $this->metrics = $this->populateResultConverseMetrics($data['metrics']);
+        $this->additionalModelResponseFields = empty($data['additionalModelResponseFields']) ? null : $this->populateResultDocument($data['additionalModelResponseFields']);
+        $this->trace = empty($data['trace']) ? null : $this->populateResultConverseTrace($data['trace']);
+        $this->performanceConfig = empty($data['performanceConfig']) ? null : $this->populateResultPerformanceConfiguration($data['performanceConfig']);
+    }
+
+    private function populateResultContentBlock(array $json): ContentBlock
+    {
+        return new ContentBlock([
+            'text' => isset($json['text']) ? (string) $json['text'] : null,
+            'image' => empty($json['image']) ? null : $this->populateResultImageBlock($json['image']),
+            'document' => empty($json['document']) ? null : $this->populateResultDocumentBlock($json['document']),
+            'video' => empty($json['video']) ? null : $this->populateResultVideoBlock($json['video']),
+            'toolUse' => empty($json['toolUse']) ? null : $this->populateResultToolUseBlock($json['toolUse']),
+            'toolResult' => empty($json['toolResult']) ? null : $this->populateResultToolResultBlock($json['toolResult']),
+            'guardContent' => empty($json['guardContent']) ? null : $this->populateResultGuardrailConverseContentBlock($json['guardContent']),
+            'reasoningContent' => empty($json['reasoningContent']) ? null : $this->populateResultReasoningContentBlock($json['reasoningContent']),
+        ]);
+    }
+
+    /**
+     * @return ContentBlock[]
+     */
+    private function populateResultContentBlocks(array $json): array
+    {
+        $items = [];
+        foreach ($json as $item) {
+            $items[] = $this->populateResultContentBlock($item);
+        }
+
+        return $items;
+    }
+
+    private function populateResultConverseMetrics(array $json): ConverseMetrics
+    {
+        return new ConverseMetrics([
+            'latencyMs' => (int) $json['latencyMs'],
+        ]);
+    }
+
+    private function populateResultConverseOutput(array $json): ConverseOutput
+    {
+        return new ConverseOutput([
+            'message' => empty($json['message']) ? null : $this->populateResultMessage($json['message']),
+        ]);
+    }
+
+    private function populateResultConverseTrace(array $json): ConverseTrace
+    {
+        return new ConverseTrace([
+            'guardrail' => empty($json['guardrail']) ? null : $this->populateResultGuardrailTraceAssessment($json['guardrail']),
+            'promptRouter' => empty($json['promptRouter']) ? null : $this->populateResultPromptRouterTrace($json['promptRouter']),
+        ]);
+    }
+
+    private function populateResultDocument(array $json): Document
+    {
+        return new Document([
+        ]);
+    }
+
+    private function populateResultDocumentBlock(array $json): DocumentBlock
+    {
+        return new DocumentBlock([
+            'format' => (string) $json['format'],
+            'name' => (string) $json['name'],
+            'source' => $this->populateResultDocumentSource($json['source']),
+        ]);
+    }
+
+    private function populateResultDocumentSource(array $json): DocumentSource
+    {
+        return new DocumentSource([
+            'bytes' => isset($json['bytes']) ? base64_decode((string) $json['bytes']) : null,
+        ]);
+    }
+
+    private function populateResultGuardrailAssessment(array $json): GuardrailAssessment
+    {
+        return new GuardrailAssessment([
+            'topicPolicy' => empty($json['topicPolicy']) ? null : $this->populateResultGuardrailTopicPolicyAssessment($json['topicPolicy']),
+            'contentPolicy' => empty($json['contentPolicy']) ? null : $this->populateResultGuardrailContentPolicyAssessment($json['contentPolicy']),
+            'wordPolicy' => empty($json['wordPolicy']) ? null : $this->populateResultGuardrailWordPolicyAssessment($json['wordPolicy']),
+            'sensitiveInformationPolicy' => empty($json['sensitiveInformationPolicy']) ? null : $this->populateResultGuardrailSensitiveInformationPolicyAssessment($json['sensitiveInformationPolicy']),
+            'contextualGroundingPolicy' => empty($json['contextualGroundingPolicy']) ? null : $this->populateResultGuardrailContextualGroundingPolicyAssessment($json['contextualGroundingPolicy']),
+            'invocationMetrics' => empty($json['invocationMetrics']) ? null : $this->populateResultGuardrailInvocationMetrics($json['invocationMetrics']),
+        ]);
+    }
+
+    /**
+     * @return GuardrailAssessment[]
+     */
+    private function populateResultGuardrailAssessmentList(array $json): array
+    {
+        $items = [];
+        foreach ($json as $item) {
+            $items[] = $this->populateResultGuardrailAssessment($item);
+        }
+
+        return $items;
+    }
+
+    /**
+     * @return array<string, GuardrailAssessment[]>
+     */
+    private function populateResultGuardrailAssessmentListMap(array $json): array
+    {
+        $items = [];
+        foreach ($json as $name => $value) {
+            $items[(string) $name] = $this->populateResultGuardrailAssessmentList($value);
+        }
+
+        return $items;
+    }
+
+    /**
+     * @return array<string, GuardrailAssessment>
+     */
+    private function populateResultGuardrailAssessmentMap(array $json): array
+    {
+        $items = [];
+        foreach ($json as $name => $value) {
+            $items[(string) $name] = $this->populateResultGuardrailAssessment($value);
+        }
+
+        return $items;
+    }
+
+    private function populateResultGuardrailContentFilter(array $json): GuardrailContentFilter
+    {
+        return new GuardrailContentFilter([
+            'type' => (string) $json['type'],
+            'confidence' => (string) $json['confidence'],
+            'filterStrength' => isset($json['filterStrength']) ? (string) $json['filterStrength'] : null,
+            'action' => (string) $json['action'],
+        ]);
+    }
+
+    /**
+     * @return GuardrailContentFilter[]
+     */
+    private function populateResultGuardrailContentFilterList(array $json): array
+    {
+        $items = [];
+        foreach ($json as $item) {
+            $items[] = $this->populateResultGuardrailContentFilter($item);
+        }
+
+        return $items;
+    }
+
+    private function populateResultGuardrailContentPolicyAssessment(array $json): GuardrailContentPolicyAssessment
+    {
+        return new GuardrailContentPolicyAssessment([
+            'filters' => $this->populateResultGuardrailContentFilterList($json['filters']),
+        ]);
+    }
+
+    private function populateResultGuardrailContextualGroundingFilter(array $json): GuardrailContextualGroundingFilter
+    {
+        return new GuardrailContextualGroundingFilter([
+            'type' => (string) $json['type'],
+            'threshold' => (float) $json['threshold'],
+            'score' => (float) $json['score'],
+            'action' => (string) $json['action'],
+        ]);
+    }
+
+    /**
+     * @return GuardrailContextualGroundingFilter[]
+     */
+    private function populateResultGuardrailContextualGroundingFilters(array $json): array
+    {
+        $items = [];
+        foreach ($json as $item) {
+            $items[] = $this->populateResultGuardrailContextualGroundingFilter($item);
+        }
+
+        return $items;
+    }
+
+    private function populateResultGuardrailContextualGroundingPolicyAssessment(array $json): GuardrailContextualGroundingPolicyAssessment
+    {
+        return new GuardrailContextualGroundingPolicyAssessment([
+            'filters' => !isset($json['filters']) ? null : $this->populateResultGuardrailContextualGroundingFilters($json['filters']),
+        ]);
+    }
+
+    private function populateResultGuardrailConverseContentBlock(array $json): GuardrailConverseContentBlock
+    {
+        return new GuardrailConverseContentBlock([
+            'text' => empty($json['text']) ? null : $this->populateResultGuardrailConverseTextBlock($json['text']),
+            'image' => empty($json['image']) ? null : $this->populateResultGuardrailConverseImageBlock($json['image']),
+        ]);
+    }
+
+    /**
+     * @return list<GuardrailConverseContentQualifier::*>
+     */
+    private function populateResultGuardrailConverseContentQualifierList(array $json): array
+    {
+        $items = [];
+        foreach ($json as $item) {
+            $a = isset($item) ? (string) $item : null;
+            if (null !== $a) {
+                $items[] = $a;
+            }
+        }
+
+        return $items;
+    }
+
+    private function populateResultGuardrailConverseImageBlock(array $json): GuardrailConverseImageBlock
+    {
+        return new GuardrailConverseImageBlock([
+            'format' => (string) $json['format'],
+            'source' => $this->populateResultGuardrailConverseImageSource($json['source']),
+        ]);
+    }
+
+    private function populateResultGuardrailConverseImageSource(array $json): GuardrailConverseImageSource
+    {
+        return new GuardrailConverseImageSource([
+            'bytes' => isset($json['bytes']) ? base64_decode((string) $json['bytes']) : null,
+        ]);
+    }
+
+    private function populateResultGuardrailConverseTextBlock(array $json): GuardrailConverseTextBlock
+    {
+        return new GuardrailConverseTextBlock([
+            'text' => (string) $json['text'],
+            'qualifiers' => !isset($json['qualifiers']) ? null : $this->populateResultGuardrailConverseContentQualifierList($json['qualifiers']),
+        ]);
+    }
+
+    private function populateResultGuardrailCoverage(array $json): GuardrailCoverage
+    {
+        return new GuardrailCoverage([
+            'textCharacters' => empty($json['textCharacters']) ? null : $this->populateResultGuardrailTextCharactersCoverage($json['textCharacters']),
+            'images' => empty($json['images']) ? null : $this->populateResultGuardrailImageCoverage($json['images']),
+        ]);
+    }
+
+    private function populateResultGuardrailCustomWord(array $json): GuardrailCustomWord
+    {
+        return new GuardrailCustomWord([
+            'match' => (string) $json['match'],
+            'action' => (string) $json['action'],
+        ]);
+    }
+
+    /**
+     * @return GuardrailCustomWord[]
+     */
+    private function populateResultGuardrailCustomWordList(array $json): array
+    {
+        $items = [];
+        foreach ($json as $item) {
+            $items[] = $this->populateResultGuardrailCustomWord($item);
+        }
+
+        return $items;
+    }
+
+    private function populateResultGuardrailImageCoverage(array $json): GuardrailImageCoverage
+    {
+        return new GuardrailImageCoverage([
+            'guarded' => isset($json['guarded']) ? (int) $json['guarded'] : null,
+            'total' => isset($json['total']) ? (int) $json['total'] : null,
+        ]);
+    }
+
+    private function populateResultGuardrailInvocationMetrics(array $json): GuardrailInvocationMetrics
+    {
+        return new GuardrailInvocationMetrics([
+            'guardrailProcessingLatency' => isset($json['guardrailProcessingLatency']) ? (int) $json['guardrailProcessingLatency'] : null,
+            'usage' => empty($json['usage']) ? null : $this->populateResultGuardrailUsage($json['usage']),
+            'guardrailCoverage' => empty($json['guardrailCoverage']) ? null : $this->populateResultGuardrailCoverage($json['guardrailCoverage']),
+        ]);
+    }
+
+    private function populateResultGuardrailManagedWord(array $json): GuardrailManagedWord
+    {
+        return new GuardrailManagedWord([
+            'match' => (string) $json['match'],
+            'type' => (string) $json['type'],
+            'action' => (string) $json['action'],
+        ]);
+    }
+
+    /**
+     * @return GuardrailManagedWord[]
+     */
+    private function populateResultGuardrailManagedWordList(array $json): array
+    {
+        $items = [];
+        foreach ($json as $item) {
+            $items[] = $this->populateResultGuardrailManagedWord($item);
+        }
+
+        return $items;
+    }
+
+    private function populateResultGuardrailPiiEntityFilter(array $json): GuardrailPiiEntityFilter
+    {
+        return new GuardrailPiiEntityFilter([
+            'match' => (string) $json['match'],
+            'type' => (string) $json['type'],
+            'action' => (string) $json['action'],
+        ]);
+    }
+
+    /**
+     * @return GuardrailPiiEntityFilter[]
+     */
+    private function populateResultGuardrailPiiEntityFilterList(array $json): array
+    {
+        $items = [];
+        foreach ($json as $item) {
+            $items[] = $this->populateResultGuardrailPiiEntityFilter($item);
+        }
+
+        return $items;
+    }
+
+    private function populateResultGuardrailRegexFilter(array $json): GuardrailRegexFilter
+    {
+        return new GuardrailRegexFilter([
+            'name' => isset($json['name']) ? (string) $json['name'] : null,
+            'match' => isset($json['match']) ? (string) $json['match'] : null,
+            'regex' => isset($json['regex']) ? (string) $json['regex'] : null,
+            'action' => (string) $json['action'],
+        ]);
+    }
+
+    /**
+     * @return GuardrailRegexFilter[]
+     */
+    private function populateResultGuardrailRegexFilterList(array $json): array
+    {
+        $items = [];
+        foreach ($json as $item) {
+            $items[] = $this->populateResultGuardrailRegexFilter($item);
+        }
+
+        return $items;
+    }
+
+    private function populateResultGuardrailSensitiveInformationPolicyAssessment(array $json): GuardrailSensitiveInformationPolicyAssessment
+    {
+        return new GuardrailSensitiveInformationPolicyAssessment([
+            'piiEntities' => $this->populateResultGuardrailPiiEntityFilterList($json['piiEntities']),
+            'regexes' => $this->populateResultGuardrailRegexFilterList($json['regexes']),
+        ]);
+    }
+
+    private function populateResultGuardrailTextCharactersCoverage(array $json): GuardrailTextCharactersCoverage
+    {
+        return new GuardrailTextCharactersCoverage([
+            'guarded' => isset($json['guarded']) ? (int) $json['guarded'] : null,
+            'total' => isset($json['total']) ? (int) $json['total'] : null,
+        ]);
+    }
+
+    private function populateResultGuardrailTopic(array $json): GuardrailTopic
+    {
+        return new GuardrailTopic([
+            'name' => (string) $json['name'],
+            'type' => (string) $json['type'],
+            'action' => (string) $json['action'],
+        ]);
+    }
+
+    /**
+     * @return GuardrailTopic[]
+     */
+    private function populateResultGuardrailTopicList(array $json): array
+    {
+        $items = [];
+        foreach ($json as $item) {
+            $items[] = $this->populateResultGuardrailTopic($item);
+        }
+
+        return $items;
+    }
+
+    private function populateResultGuardrailTopicPolicyAssessment(array $json): GuardrailTopicPolicyAssessment
+    {
+        return new GuardrailTopicPolicyAssessment([
+            'topics' => $this->populateResultGuardrailTopicList($json['topics']),
+        ]);
+    }
+
+    private function populateResultGuardrailTraceAssessment(array $json): GuardrailTraceAssessment
+    {
+        return new GuardrailTraceAssessment([
+            'modelOutput' => !isset($json['modelOutput']) ? null : $this->populateResultModelOutputs($json['modelOutput']),
+            'inputAssessment' => !isset($json['inputAssessment']) ? null : $this->populateResultGuardrailAssessmentMap($json['inputAssessment']),
+            'outputAssessments' => !isset($json['outputAssessments']) ? null : $this->populateResultGuardrailAssessmentListMap($json['outputAssessments']),
+        ]);
+    }
+
+    private function populateResultGuardrailUsage(array $json): GuardrailUsage
+    {
+        return new GuardrailUsage([
+            'topicPolicyUnits' => (int) $json['topicPolicyUnits'],
+            'contentPolicyUnits' => (int) $json['contentPolicyUnits'],
+            'wordPolicyUnits' => (int) $json['wordPolicyUnits'],
+            'sensitiveInformationPolicyUnits' => (int) $json['sensitiveInformationPolicyUnits'],
+            'sensitiveInformationPolicyFreeUnits' => (int) $json['sensitiveInformationPolicyFreeUnits'],
+            'contextualGroundingPolicyUnits' => (int) $json['contextualGroundingPolicyUnits'],
+        ]);
+    }
+
+    private function populateResultGuardrailWordPolicyAssessment(array $json): GuardrailWordPolicyAssessment
+    {
+        return new GuardrailWordPolicyAssessment([
+            'customWords' => $this->populateResultGuardrailCustomWordList($json['customWords']),
+            'managedWordLists' => $this->populateResultGuardrailManagedWordList($json['managedWordLists']),
+        ]);
+    }
+
+    private function populateResultImageBlock(array $json): ImageBlock
+    {
+        return new ImageBlock([
+            'format' => (string) $json['format'],
+            'source' => $this->populateResultImageSource($json['source']),
+        ]);
+    }
+
+    private function populateResultImageSource(array $json): ImageSource
+    {
+        return new ImageSource([
+            'bytes' => isset($json['bytes']) ? base64_decode((string) $json['bytes']) : null,
+        ]);
+    }
+
+    private function populateResultMessage(array $json): Message
+    {
+        return new Message([
+            'role' => (string) $json['role'],
+            'content' => $this->populateResultContentBlocks($json['content']),
+        ]);
+    }
+
+    /**
+     * @return string[]
+     */
+    private function populateResultModelOutputs(array $json): array
+    {
+        $items = [];
+        foreach ($json as $item) {
+            $a = isset($item) ? (string) $item : null;
+            if (null !== $a) {
+                $items[] = $a;
+            }
+        }
+
+        return $items;
+    }
+
+    private function populateResultPerformanceConfiguration(array $json): PerformanceConfiguration
+    {
+        return new PerformanceConfiguration([
+            'latency' => isset($json['latency']) ? (string) $json['latency'] : null,
+        ]);
+    }
+
+    private function populateResultPromptRouterTrace(array $json): PromptRouterTrace
+    {
+        return new PromptRouterTrace([
+            'invokedModelId' => isset($json['invokedModelId']) ? (string) $json['invokedModelId'] : null,
+        ]);
+    }
+
+    private function populateResultReasoningContentBlock(array $json): ReasoningContentBlock
+    {
+        return new ReasoningContentBlock([
+            'reasoningText' => empty($json['reasoningText']) ? null : $this->populateResultReasoningTextBlock($json['reasoningText']),
+            'redactedContent' => isset($json['redactedContent']) ? base64_decode((string) $json['redactedContent']) : null,
+        ]);
+    }
+
+    private function populateResultReasoningTextBlock(array $json): ReasoningTextBlock
+    {
+        return new ReasoningTextBlock([
+            'text' => (string) $json['text'],
+            'signature' => isset($json['signature']) ? (string) $json['signature'] : null,
+        ]);
+    }
+
+    private function populateResultS3Location(array $json): S3Location
+    {
+        return new S3Location([
+            'uri' => (string) $json['uri'],
+            'bucketOwner' => isset($json['bucketOwner']) ? (string) $json['bucketOwner'] : null,
+        ]);
+    }
+
+    private function populateResultTokenUsage(array $json): TokenUsage
+    {
+        return new TokenUsage([
+            'inputTokens' => (int) $json['inputTokens'],
+            'outputTokens' => (int) $json['outputTokens'],
+            'totalTokens' => (int) $json['totalTokens'],
+        ]);
+    }
+
+    private function populateResultToolResultBlock(array $json): ToolResultBlock
+    {
+        return new ToolResultBlock([
+            'toolUseId' => (string) $json['toolUseId'],
+            'content' => $this->populateResultToolResultContentBlocks($json['content']),
+            'status' => isset($json['status']) ? (string) $json['status'] : null,
+        ]);
+    }
+
+    private function populateResultToolResultContentBlock(array $json): ToolResultContentBlock
+    {
+        return new ToolResultContentBlock([
+            'json' => empty($json['json']) ? null : $this->populateResultDocument($json['json']),
+            'text' => isset($json['text']) ? (string) $json['text'] : null,
+            'image' => empty($json['image']) ? null : $this->populateResultImageBlock($json['image']),
+            'document' => empty($json['document']) ? null : $this->populateResultDocumentBlock($json['document']),
+            'video' => empty($json['video']) ? null : $this->populateResultVideoBlock($json['video']),
+        ]);
+    }
+
+    /**
+     * @return ToolResultContentBlock[]
+     */
+    private function populateResultToolResultContentBlocks(array $json): array
+    {
+        $items = [];
+        foreach ($json as $item) {
+            $items[] = $this->populateResultToolResultContentBlock($item);
+        }
+
+        return $items;
+    }
+
+    private function populateResultToolUseBlock(array $json): ToolUseBlock
+    {
+        return new ToolUseBlock([
+            'toolUseId' => (string) $json['toolUseId'],
+            'name' => (string) $json['name'],
+            'input' => $this->populateResultDocument($json['input']),
+        ]);
+    }
+
+    private function populateResultVideoBlock(array $json): VideoBlock
+    {
+        return new VideoBlock([
+            'format' => (string) $json['format'],
+            'source' => $this->populateResultVideoSource($json['source']),
+        ]);
+    }
+
+    private function populateResultVideoSource(array $json): VideoSource
+    {
+        return new VideoSource([
+            'bytes' => isset($json['bytes']) ? base64_decode((string) $json['bytes']) : null,
+            's3Location' => empty($json['s3Location']) ? null : $this->populateResultS3Location($json['s3Location']),
+        ]);
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/AnyToolChoice.php b/src/Service/BedrockRuntime/src/ValueObject/AnyToolChoice.php
new file mode 100644
index 000000000..576208dfd
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/AnyToolChoice.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * The model must request at least one tool (no text is generated). For example, `{"any" : {}}`.
+ */
+final class AnyToolChoice
+{
+    /**
+     * @param array|AnyToolChoice $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self();
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/AutoToolChoice.php b/src/Service/BedrockRuntime/src/ValueObject/AutoToolChoice.php
new file mode 100644
index 000000000..2adbf72fe
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/AutoToolChoice.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * The Model automatically decides if a tool should be called or whether to generate text instead. For example, `{"auto"
+ * : {}}`.
+ */
+final class AutoToolChoice
+{
+    /**
+     * @param array|AutoToolChoice $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self();
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ContentBlock.php b/src/Service/BedrockRuntime/src/ValueObject/ContentBlock.php
new file mode 100644
index 000000000..60d45d8c2
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ContentBlock.php
@@ -0,0 +1,192 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * A block of content for a message that you pass to, or receive from, a model with the Converse [^1] or ConverseStream
+ * [^2] API operations.
+ *
+ * [^1]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html
+ * [^2]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html
+ */
+final class ContentBlock
+{
+    /**
+     * Text to include in the message.
+     *
+     * @var string|null
+     */
+    private $text;
+
+    /**
+     * Image to include in the message.
+     *
+     * > This field is only supported by Anthropic Claude 3 models.
+     *
+     * @var ImageBlock|null
+     */
+    private $image;
+
+    /**
+     * A document to include in the message.
+     *
+     * @var DocumentBlock|null
+     */
+    private $document;
+
+    /**
+     * Video to include in the message.
+     *
+     * @var VideoBlock|null
+     */
+    private $video;
+
+    /**
+     * Information about a tool use request from a model.
+     *
+     * @var ToolUseBlock|null
+     */
+    private $toolUse;
+
+    /**
+     * The result for a tool request that a model makes.
+     *
+     * @var ToolResultBlock|null
+     */
+    private $toolResult;
+
+    /**
+     * Contains the content to assess with the guardrail. If you don't specify `guardContent` in a call to the Converse API,
+     * the guardrail (if passed in the Converse API) assesses the entire message.
+     *
+     * For more information, see *Use a guardrail with the Converse API* in the *Amazon Bedrock User Guide*. ```
+     * </p>
+     * ```
+     *
+     * @var GuardrailConverseContentBlock|null
+     */
+    private $guardContent;
+
+    /**
+     * Contains content regarding the reasoning that is carried out by the model. Reasoning refers to a Chain of Thought
+     * (CoT) that the model generates to enhance the accuracy of its final response.
+     *
+     * @var ReasoningContentBlock|null
+     */
+    private $reasoningContent;
+
+    /**
+     * @param array{
+     *   text?: null|string,
+     *   image?: null|ImageBlock|array,
+     *   document?: null|DocumentBlock|array,
+     *   video?: null|VideoBlock|array,
+     *   toolUse?: null|ToolUseBlock|array,
+     *   toolResult?: null|ToolResultBlock|array,
+     *   guardContent?: null|GuardrailConverseContentBlock|array,
+     *   reasoningContent?: null|ReasoningContentBlock|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->text = $input['text'] ?? null;
+        $this->image = isset($input['image']) ? ImageBlock::create($input['image']) : null;
+        $this->document = isset($input['document']) ? DocumentBlock::create($input['document']) : null;
+        $this->video = isset($input['video']) ? VideoBlock::create($input['video']) : null;
+        $this->toolUse = isset($input['toolUse']) ? ToolUseBlock::create($input['toolUse']) : null;
+        $this->toolResult = isset($input['toolResult']) ? ToolResultBlock::create($input['toolResult']) : null;
+        $this->guardContent = isset($input['guardContent']) ? GuardrailConverseContentBlock::create($input['guardContent']) : null;
+        $this->reasoningContent = isset($input['reasoningContent']) ? ReasoningContentBlock::create($input['reasoningContent']) : null;
+    }
+
+    /**
+     * @param array{
+     *   text?: null|string,
+     *   image?: null|ImageBlock|array,
+     *   document?: null|DocumentBlock|array,
+     *   video?: null|VideoBlock|array,
+     *   toolUse?: null|ToolUseBlock|array,
+     *   toolResult?: null|ToolResultBlock|array,
+     *   guardContent?: null|GuardrailConverseContentBlock|array,
+     *   reasoningContent?: null|ReasoningContentBlock|array,
+     * }|ContentBlock $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getDocument(): ?DocumentBlock
+    {
+        return $this->document;
+    }
+
+    public function getGuardContent(): ?GuardrailConverseContentBlock
+    {
+        return $this->guardContent;
+    }
+
+    public function getImage(): ?ImageBlock
+    {
+        return $this->image;
+    }
+
+    public function getReasoningContent(): ?ReasoningContentBlock
+    {
+        return $this->reasoningContent;
+    }
+
+    public function getText(): ?string
+    {
+        return $this->text;
+    }
+
+    public function getToolResult(): ?ToolResultBlock
+    {
+        return $this->toolResult;
+    }
+
+    public function getToolUse(): ?ToolUseBlock
+    {
+        return $this->toolUse;
+    }
+
+    public function getVideo(): ?VideoBlock
+    {
+        return $this->video;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->text) {
+            $payload['text'] = $v;
+        }
+        if (null !== $v = $this->image) {
+            $payload['image'] = $v->requestBody();
+        }
+        if (null !== $v = $this->document) {
+            $payload['document'] = $v->requestBody();
+        }
+        if (null !== $v = $this->video) {
+            $payload['video'] = $v->requestBody();
+        }
+        if (null !== $v = $this->toolUse) {
+            $payload['toolUse'] = $v->requestBody();
+        }
+        if (null !== $v = $this->toolResult) {
+            $payload['toolResult'] = $v->requestBody();
+        }
+        if (null !== $v = $this->guardContent) {
+            $payload['guardContent'] = $v->requestBody();
+        }
+        if (null !== $v = $this->reasoningContent) {
+            $payload['reasoningContent'] = $v->requestBody();
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ConverseMetrics.php b/src/Service/BedrockRuntime/src/ValueObject/ConverseMetrics.php
new file mode 100644
index 000000000..e460c4ad6
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ConverseMetrics.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * Metrics for a call to Converse [^1].
+ *
+ * [^1]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html
+ */
+final class ConverseMetrics
+{
+    /**
+     * The latency of the call to `Converse`, in milliseconds.
+     *
+     * @var int
+     */
+    private $latencyMs;
+
+    /**
+     * @param array{
+     *   latencyMs: int,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->latencyMs = $input['latencyMs'] ?? $this->throwException(new InvalidArgument('Missing required field "latencyMs".'));
+    }
+
+    /**
+     * @param array{
+     *   latencyMs: int,
+     * }|ConverseMetrics $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getLatencyMs(): int
+    {
+        return $this->latencyMs;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ConverseOutput.php b/src/Service/BedrockRuntime/src/ValueObject/ConverseOutput.php
new file mode 100644
index 000000000..a196c7384
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ConverseOutput.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * The output from a call to Converse [^1].
+ *
+ * [^1]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html
+ */
+final class ConverseOutput
+{
+    /**
+     * The message that the model generates.
+     *
+     * @var Message|null
+     */
+    private $message;
+
+    /**
+     * @param array{
+     *   message?: null|Message|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->message = isset($input['message']) ? Message::create($input['message']) : null;
+    }
+
+    /**
+     * @param array{
+     *   message?: null|Message|array,
+     * }|ConverseOutput $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getMessage(): ?Message
+    {
+        return $this->message;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ConverseTrace.php b/src/Service/BedrockRuntime/src/ValueObject/ConverseTrace.php
new file mode 100644
index 000000000..e80c49d1a
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ConverseTrace.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * The trace object in a response from Converse [^1]. Currently, you can only trace guardrails.
+ *
+ * [^1]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html
+ */
+final class ConverseTrace
+{
+    /**
+     * The guardrail trace object.
+     *
+     * @var GuardrailTraceAssessment|null
+     */
+    private $guardrail;
+
+    /**
+     * The request's prompt router.
+     *
+     * @var PromptRouterTrace|null
+     */
+    private $promptRouter;
+
+    /**
+     * @param array{
+     *   guardrail?: null|GuardrailTraceAssessment|array,
+     *   promptRouter?: null|PromptRouterTrace|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->guardrail = isset($input['guardrail']) ? GuardrailTraceAssessment::create($input['guardrail']) : null;
+        $this->promptRouter = isset($input['promptRouter']) ? PromptRouterTrace::create($input['promptRouter']) : null;
+    }
+
+    /**
+     * @param array{
+     *   guardrail?: null|GuardrailTraceAssessment|array,
+     *   promptRouter?: null|PromptRouterTrace|array,
+     * }|ConverseTrace $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getGuardrail(): ?GuardrailTraceAssessment
+    {
+        return $this->guardrail;
+    }
+
+    public function getPromptRouter(): ?PromptRouterTrace
+    {
+        return $this->promptRouter;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/Document.php b/src/Service/BedrockRuntime/src/ValueObject/Document.php
new file mode 100644
index 000000000..05e034948
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/Document.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+final class Document
+{
+    /**
+     * @param array|Document $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self();
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/DocumentBlock.php b/src/Service/BedrockRuntime/src/ValueObject/DocumentBlock.php
new file mode 100644
index 000000000..9f1d069bf
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/DocumentBlock.php
@@ -0,0 +1,113 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\DocumentFormat;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * A document to include in a message.
+ */
+final class DocumentBlock
+{
+    /**
+     * The format of a document, or its extension.
+     *
+     * @var DocumentFormat::*
+     */
+    private $format;
+
+    /**
+     * A name for the document. The name can only contain the following characters:
+     *
+     * - Alphanumeric characters
+     * - Whitespace characters (no more than one in a row)
+     * - Hyphens
+     * - Parentheses
+     * - Square brackets
+     *
+     * > This field is vulnerable to prompt injections, because the model might inadvertently interpret it as instructions.
+     * > Therefore, we recommend that you specify a neutral name.
+     *
+     * @var string
+     */
+    private $name;
+
+    /**
+     * Contains the content of the document.
+     *
+     * @var DocumentSource
+     */
+    private $source;
+
+    /**
+     * @param array{
+     *   format: DocumentFormat::*,
+     *   name: string,
+     *   source: DocumentSource|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->format = $input['format'] ?? $this->throwException(new InvalidArgument('Missing required field "format".'));
+        $this->name = $input['name'] ?? $this->throwException(new InvalidArgument('Missing required field "name".'));
+        $this->source = isset($input['source']) ? DocumentSource::create($input['source']) : $this->throwException(new InvalidArgument('Missing required field "source".'));
+    }
+
+    /**
+     * @param array{
+     *   format: DocumentFormat::*,
+     *   name: string,
+     *   source: DocumentSource|array,
+     * }|DocumentBlock $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return DocumentFormat::*
+     */
+    public function getFormat(): string
+    {
+        return $this->format;
+    }
+
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    public function getSource(): DocumentSource
+    {
+        return $this->source;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->format;
+        if (!DocumentFormat::exists($v)) {
+            throw new InvalidArgument(\sprintf('Invalid parameter "format" for "%s". The value "%s" is not a valid "DocumentFormat".', __CLASS__, $v));
+        }
+        $payload['format'] = $v;
+        $v = $this->name;
+        $payload['name'] = $v;
+        $v = $this->source;
+        $payload['source'] = $v->requestBody();
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/DocumentSource.php b/src/Service/BedrockRuntime/src/ValueObject/DocumentSource.php
new file mode 100644
index 000000000..86d4b29f3
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/DocumentSource.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * Contains the content of a document.
+ */
+final class DocumentSource
+{
+    /**
+     * The raw bytes for the document. If you use an Amazon Web Services SDK, you don't need to encode the bytes in base64.
+     *
+     * @var string|null
+     */
+    private $bytes;
+
+    /**
+     * @param array{
+     *   bytes?: null|string,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->bytes = $input['bytes'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   bytes?: null|string,
+     * }|DocumentSource $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getBytes(): ?string
+    {
+        return $this->bytes;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->bytes) {
+            $payload['bytes'] = base64_encode($v);
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailAssessment.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailAssessment.php
new file mode 100644
index 000000000..33b193a0d
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailAssessment.php
@@ -0,0 +1,116 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * A behavior assessment of the guardrail policies used in a call to the Converse API.
+ */
+final class GuardrailAssessment
+{
+    /**
+     * The topic policy.
+     *
+     * @var GuardrailTopicPolicyAssessment|null
+     */
+    private $topicPolicy;
+
+    /**
+     * The content policy.
+     *
+     * @var GuardrailContentPolicyAssessment|null
+     */
+    private $contentPolicy;
+
+    /**
+     * The word policy.
+     *
+     * @var GuardrailWordPolicyAssessment|null
+     */
+    private $wordPolicy;
+
+    /**
+     * The sensitive information policy.
+     *
+     * @var GuardrailSensitiveInformationPolicyAssessment|null
+     */
+    private $sensitiveInformationPolicy;
+
+    /**
+     * The contextual grounding policy used for the guardrail assessment.
+     *
+     * @var GuardrailContextualGroundingPolicyAssessment|null
+     */
+    private $contextualGroundingPolicy;
+
+    /**
+     * The invocation metrics for the guardrail assessment.
+     *
+     * @var GuardrailInvocationMetrics|null
+     */
+    private $invocationMetrics;
+
+    /**
+     * @param array{
+     *   topicPolicy?: null|GuardrailTopicPolicyAssessment|array,
+     *   contentPolicy?: null|GuardrailContentPolicyAssessment|array,
+     *   wordPolicy?: null|GuardrailWordPolicyAssessment|array,
+     *   sensitiveInformationPolicy?: null|GuardrailSensitiveInformationPolicyAssessment|array,
+     *   contextualGroundingPolicy?: null|GuardrailContextualGroundingPolicyAssessment|array,
+     *   invocationMetrics?: null|GuardrailInvocationMetrics|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->topicPolicy = isset($input['topicPolicy']) ? GuardrailTopicPolicyAssessment::create($input['topicPolicy']) : null;
+        $this->contentPolicy = isset($input['contentPolicy']) ? GuardrailContentPolicyAssessment::create($input['contentPolicy']) : null;
+        $this->wordPolicy = isset($input['wordPolicy']) ? GuardrailWordPolicyAssessment::create($input['wordPolicy']) : null;
+        $this->sensitiveInformationPolicy = isset($input['sensitiveInformationPolicy']) ? GuardrailSensitiveInformationPolicyAssessment::create($input['sensitiveInformationPolicy']) : null;
+        $this->contextualGroundingPolicy = isset($input['contextualGroundingPolicy']) ? GuardrailContextualGroundingPolicyAssessment::create($input['contextualGroundingPolicy']) : null;
+        $this->invocationMetrics = isset($input['invocationMetrics']) ? GuardrailInvocationMetrics::create($input['invocationMetrics']) : null;
+    }
+
+    /**
+     * @param array{
+     *   topicPolicy?: null|GuardrailTopicPolicyAssessment|array,
+     *   contentPolicy?: null|GuardrailContentPolicyAssessment|array,
+     *   wordPolicy?: null|GuardrailWordPolicyAssessment|array,
+     *   sensitiveInformationPolicy?: null|GuardrailSensitiveInformationPolicyAssessment|array,
+     *   contextualGroundingPolicy?: null|GuardrailContextualGroundingPolicyAssessment|array,
+     *   invocationMetrics?: null|GuardrailInvocationMetrics|array,
+     * }|GuardrailAssessment $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getContentPolicy(): ?GuardrailContentPolicyAssessment
+    {
+        return $this->contentPolicy;
+    }
+
+    public function getContextualGroundingPolicy(): ?GuardrailContextualGroundingPolicyAssessment
+    {
+        return $this->contextualGroundingPolicy;
+    }
+
+    public function getInvocationMetrics(): ?GuardrailInvocationMetrics
+    {
+        return $this->invocationMetrics;
+    }
+
+    public function getSensitiveInformationPolicy(): ?GuardrailSensitiveInformationPolicyAssessment
+    {
+        return $this->sensitiveInformationPolicy;
+    }
+
+    public function getTopicPolicy(): ?GuardrailTopicPolicyAssessment
+    {
+        return $this->topicPolicy;
+    }
+
+    public function getWordPolicy(): ?GuardrailWordPolicyAssessment
+    {
+        return $this->wordPolicy;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailConfiguration.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailConfiguration.php
new file mode 100644
index 000000000..a9d787d90
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailConfiguration.php
@@ -0,0 +1,107 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\GuardrailTrace;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * Configuration information for a guardrail that you use with the Converse [^1] operation.
+ *
+ * [^1]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html
+ */
+final class GuardrailConfiguration
+{
+    /**
+     * The identifier for the guardrail.
+     *
+     * @var string
+     */
+    private $guardrailIdentifier;
+
+    /**
+     * The version of the guardrail.
+     *
+     * @var string
+     */
+    private $guardrailVersion;
+
+    /**
+     * The trace behavior for the guardrail.
+     *
+     * @var GuardrailTrace::*|null
+     */
+    private $trace;
+
+    /**
+     * @param array{
+     *   guardrailIdentifier: string,
+     *   guardrailVersion: string,
+     *   trace?: null|GuardrailTrace::*,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->guardrailIdentifier = $input['guardrailIdentifier'] ?? $this->throwException(new InvalidArgument('Missing required field "guardrailIdentifier".'));
+        $this->guardrailVersion = $input['guardrailVersion'] ?? $this->throwException(new InvalidArgument('Missing required field "guardrailVersion".'));
+        $this->trace = $input['trace'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   guardrailIdentifier: string,
+     *   guardrailVersion: string,
+     *   trace?: null|GuardrailTrace::*,
+     * }|GuardrailConfiguration $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getGuardrailIdentifier(): string
+    {
+        return $this->guardrailIdentifier;
+    }
+
+    public function getGuardrailVersion(): string
+    {
+        return $this->guardrailVersion;
+    }
+
+    /**
+     * @return GuardrailTrace::*|null
+     */
+    public function getTrace(): ?string
+    {
+        return $this->trace;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->guardrailIdentifier;
+        $payload['guardrailIdentifier'] = $v;
+        $v = $this->guardrailVersion;
+        $payload['guardrailVersion'] = $v;
+        if (null !== $v = $this->trace) {
+            if (!GuardrailTrace::exists($v)) {
+                throw new InvalidArgument(\sprintf('Invalid parameter "trace" for "%s". The value "%s" is not a valid "GuardrailTrace".', __CLASS__, $v));
+            }
+            $payload['trace'] = $v;
+        }
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailContentFilter.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailContentFilter.php
new file mode 100644
index 000000000..3bb776408
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailContentFilter.php
@@ -0,0 +1,112 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\GuardrailContentFilterConfidence;
+use AsyncAws\BedrockRuntime\Enum\GuardrailContentFilterStrength;
+use AsyncAws\BedrockRuntime\Enum\GuardrailContentFilterType;
+use AsyncAws\BedrockRuntime\Enum\GuardrailContentPolicyAction;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * The content filter for a guardrail.
+ */
+final class GuardrailContentFilter
+{
+    /**
+     * The guardrail type.
+     *
+     * @var GuardrailContentFilterType::*
+     */
+    private $type;
+
+    /**
+     * The guardrail confidence.
+     *
+     * @var GuardrailContentFilterConfidence::*
+     */
+    private $confidence;
+
+    /**
+     * The filter strength setting for the guardrail content filter.
+     *
+     * @var GuardrailContentFilterStrength::*|null
+     */
+    private $filterStrength;
+
+    /**
+     * The guardrail action.
+     *
+     * @var GuardrailContentPolicyAction::*
+     */
+    private $action;
+
+    /**
+     * @param array{
+     *   type: GuardrailContentFilterType::*,
+     *   confidence: GuardrailContentFilterConfidence::*,
+     *   filterStrength?: null|GuardrailContentFilterStrength::*,
+     *   action: GuardrailContentPolicyAction::*,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->type = $input['type'] ?? $this->throwException(new InvalidArgument('Missing required field "type".'));
+        $this->confidence = $input['confidence'] ?? $this->throwException(new InvalidArgument('Missing required field "confidence".'));
+        $this->filterStrength = $input['filterStrength'] ?? null;
+        $this->action = $input['action'] ?? $this->throwException(new InvalidArgument('Missing required field "action".'));
+    }
+
+    /**
+     * @param array{
+     *   type: GuardrailContentFilterType::*,
+     *   confidence: GuardrailContentFilterConfidence::*,
+     *   filterStrength?: null|GuardrailContentFilterStrength::*,
+     *   action: GuardrailContentPolicyAction::*,
+     * }|GuardrailContentFilter $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return GuardrailContentPolicyAction::*
+     */
+    public function getAction(): string
+    {
+        return $this->action;
+    }
+
+    /**
+     * @return GuardrailContentFilterConfidence::*
+     */
+    public function getConfidence(): string
+    {
+        return $this->confidence;
+    }
+
+    /**
+     * @return GuardrailContentFilterStrength::*|null
+     */
+    public function getFilterStrength(): ?string
+    {
+        return $this->filterStrength;
+    }
+
+    /**
+     * @return GuardrailContentFilterType::*
+     */
+    public function getType(): string
+    {
+        return $this->type;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailContentPolicyAssessment.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailContentPolicyAssessment.php
new file mode 100644
index 000000000..ca2d6a867
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailContentPolicyAssessment.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * An assessment of a content policy for a guardrail.
+ */
+final class GuardrailContentPolicyAssessment
+{
+    /**
+     * The content policy filters.
+     *
+     * @var GuardrailContentFilter[]
+     */
+    private $filters;
+
+    /**
+     * @param array{
+     *   filters: array<GuardrailContentFilter|array>,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->filters = isset($input['filters']) ? array_map([GuardrailContentFilter::class, 'create'], $input['filters']) : $this->throwException(new InvalidArgument('Missing required field "filters".'));
+    }
+
+    /**
+     * @param array{
+     *   filters: array<GuardrailContentFilter|array>,
+     * }|GuardrailContentPolicyAssessment $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return GuardrailContentFilter[]
+     */
+    public function getFilters(): array
+    {
+        return $this->filters;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailContextualGroundingFilter.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailContextualGroundingFilter.php
new file mode 100644
index 000000000..f052be46b
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailContextualGroundingFilter.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\GuardrailContextualGroundingFilterType;
+use AsyncAws\BedrockRuntime\Enum\GuardrailContextualGroundingPolicyAction;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * The details for the guardrails contextual grounding filter.
+ */
+final class GuardrailContextualGroundingFilter
+{
+    /**
+     * The contextual grounding filter type.
+     *
+     * @var GuardrailContextualGroundingFilterType::*
+     */
+    private $type;
+
+    /**
+     * The threshold used by contextual grounding filter to determine whether the content is grounded or not.
+     *
+     * @var float
+     */
+    private $threshold;
+
+    /**
+     * The score generated by contextual grounding filter.
+     *
+     * @var float
+     */
+    private $score;
+
+    /**
+     * The action performed by the guardrails contextual grounding filter.
+     *
+     * @var GuardrailContextualGroundingPolicyAction::*
+     */
+    private $action;
+
+    /**
+     * @param array{
+     *   type: GuardrailContextualGroundingFilterType::*,
+     *   threshold: float,
+     *   score: float,
+     *   action: GuardrailContextualGroundingPolicyAction::*,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->type = $input['type'] ?? $this->throwException(new InvalidArgument('Missing required field "type".'));
+        $this->threshold = $input['threshold'] ?? $this->throwException(new InvalidArgument('Missing required field "threshold".'));
+        $this->score = $input['score'] ?? $this->throwException(new InvalidArgument('Missing required field "score".'));
+        $this->action = $input['action'] ?? $this->throwException(new InvalidArgument('Missing required field "action".'));
+    }
+
+    /**
+     * @param array{
+     *   type: GuardrailContextualGroundingFilterType::*,
+     *   threshold: float,
+     *   score: float,
+     *   action: GuardrailContextualGroundingPolicyAction::*,
+     * }|GuardrailContextualGroundingFilter $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return GuardrailContextualGroundingPolicyAction::*
+     */
+    public function getAction(): string
+    {
+        return $this->action;
+    }
+
+    public function getScore(): float
+    {
+        return $this->score;
+    }
+
+    public function getThreshold(): float
+    {
+        return $this->threshold;
+    }
+
+    /**
+     * @return GuardrailContextualGroundingFilterType::*
+     */
+    public function getType(): string
+    {
+        return $this->type;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailContextualGroundingPolicyAssessment.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailContextualGroundingPolicyAssessment.php
new file mode 100644
index 000000000..f64a89051
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailContextualGroundingPolicyAssessment.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * The policy assessment details for the guardrails contextual grounding filter.
+ */
+final class GuardrailContextualGroundingPolicyAssessment
+{
+    /**
+     * The filter details for the guardrails contextual grounding filter.
+     *
+     * @var GuardrailContextualGroundingFilter[]|null
+     */
+    private $filters;
+
+    /**
+     * @param array{
+     *   filters?: null|array<GuardrailContextualGroundingFilter|array>,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->filters = isset($input['filters']) ? array_map([GuardrailContextualGroundingFilter::class, 'create'], $input['filters']) : null;
+    }
+
+    /**
+     * @param array{
+     *   filters?: null|array<GuardrailContextualGroundingFilter|array>,
+     * }|GuardrailContextualGroundingPolicyAssessment $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return GuardrailContextualGroundingFilter[]
+     */
+    public function getFilters(): array
+    {
+        return $this->filters ?? [];
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailConverseContentBlock.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailConverseContentBlock.php
new file mode 100644
index 000000000..7eeec638e
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailConverseContentBlock.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * A content block for selective guarding with the Converse [^1] or ConverseStream [^2] API operations.
+ *
+ * [^1]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html
+ * [^2]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html
+ */
+final class GuardrailConverseContentBlock
+{
+    /**
+     * The text to guard.
+     *
+     * @var GuardrailConverseTextBlock|null
+     */
+    private $text;
+
+    /**
+     * Image within converse content block to be evaluated by the guardrail.
+     *
+     * @var GuardrailConverseImageBlock|null
+     */
+    private $image;
+
+    /**
+     * @param array{
+     *   text?: null|GuardrailConverseTextBlock|array,
+     *   image?: null|GuardrailConverseImageBlock|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->text = isset($input['text']) ? GuardrailConverseTextBlock::create($input['text']) : null;
+        $this->image = isset($input['image']) ? GuardrailConverseImageBlock::create($input['image']) : null;
+    }
+
+    /**
+     * @param array{
+     *   text?: null|GuardrailConverseTextBlock|array,
+     *   image?: null|GuardrailConverseImageBlock|array,
+     * }|GuardrailConverseContentBlock $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getImage(): ?GuardrailConverseImageBlock
+    {
+        return $this->image;
+    }
+
+    public function getText(): ?GuardrailConverseTextBlock
+    {
+        return $this->text;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->text) {
+            $payload['text'] = $v->requestBody();
+        }
+        if (null !== $v = $this->image) {
+            $payload['image'] = $v->requestBody();
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailConverseImageBlock.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailConverseImageBlock.php
new file mode 100644
index 000000000..724a85c89
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailConverseImageBlock.php
@@ -0,0 +1,87 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\GuardrailConverseImageFormat;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * An image block that contains images that you want to assess with a guardrail.
+ */
+final class GuardrailConverseImageBlock
+{
+    /**
+     * The format details for the image type of the guardrail converse image block.
+     *
+     * @var GuardrailConverseImageFormat::*
+     */
+    private $format;
+
+    /**
+     * The image source (image bytes) of the guardrail converse image block.
+     *
+     * @var GuardrailConverseImageSource
+     */
+    private $source;
+
+    /**
+     * @param array{
+     *   format: GuardrailConverseImageFormat::*,
+     *   source: GuardrailConverseImageSource|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->format = $input['format'] ?? $this->throwException(new InvalidArgument('Missing required field "format".'));
+        $this->source = isset($input['source']) ? GuardrailConverseImageSource::create($input['source']) : $this->throwException(new InvalidArgument('Missing required field "source".'));
+    }
+
+    /**
+     * @param array{
+     *   format: GuardrailConverseImageFormat::*,
+     *   source: GuardrailConverseImageSource|array,
+     * }|GuardrailConverseImageBlock $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return GuardrailConverseImageFormat::*
+     */
+    public function getFormat(): string
+    {
+        return $this->format;
+    }
+
+    public function getSource(): GuardrailConverseImageSource
+    {
+        return $this->source;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->format;
+        if (!GuardrailConverseImageFormat::exists($v)) {
+            throw new InvalidArgument(\sprintf('Invalid parameter "format" for "%s". The value "%s" is not a valid "GuardrailConverseImageFormat".', __CLASS__, $v));
+        }
+        $payload['format'] = $v;
+        $v = $this->source;
+        $payload['source'] = $v->requestBody();
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailConverseImageSource.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailConverseImageSource.php
new file mode 100644
index 000000000..c9ae5ac6f
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailConverseImageSource.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * The image source (image bytes) of the guardrail converse image source.
+ */
+final class GuardrailConverseImageSource
+{
+    /**
+     * The raw image bytes for the image.
+     *
+     * @var string|null
+     */
+    private $bytes;
+
+    /**
+     * @param array{
+     *   bytes?: null|string,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->bytes = $input['bytes'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   bytes?: null|string,
+     * }|GuardrailConverseImageSource $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getBytes(): ?string
+    {
+        return $this->bytes;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->bytes) {
+            $payload['bytes'] = base64_encode($v);
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailConverseTextBlock.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailConverseTextBlock.php
new file mode 100644
index 000000000..6287a9d29
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailConverseTextBlock.php
@@ -0,0 +1,94 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\GuardrailConverseContentQualifier;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * A text block that contains text that you want to assess with a guardrail. For more information, see
+ * GuardrailConverseContentBlock.
+ */
+final class GuardrailConverseTextBlock
+{
+    /**
+     * The text that you want to guard.
+     *
+     * @var string
+     */
+    private $text;
+
+    /**
+     * The qualifier details for the guardrails contextual grounding filter.
+     *
+     * @var list<GuardrailConverseContentQualifier::*>|null
+     */
+    private $qualifiers;
+
+    /**
+     * @param array{
+     *   text: string,
+     *   qualifiers?: null|array<GuardrailConverseContentQualifier::*>,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->text = $input['text'] ?? $this->throwException(new InvalidArgument('Missing required field "text".'));
+        $this->qualifiers = $input['qualifiers'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   text: string,
+     *   qualifiers?: null|array<GuardrailConverseContentQualifier::*>,
+     * }|GuardrailConverseTextBlock $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return list<GuardrailConverseContentQualifier::*>
+     */
+    public function getQualifiers(): array
+    {
+        return $this->qualifiers ?? [];
+    }
+
+    public function getText(): string
+    {
+        return $this->text;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->text;
+        $payload['text'] = $v;
+        if (null !== $v = $this->qualifiers) {
+            $index = -1;
+            $payload['qualifiers'] = [];
+            foreach ($v as $listValue) {
+                ++$index;
+                if (!GuardrailConverseContentQualifier::exists($listValue)) {
+                    throw new InvalidArgument(\sprintf('Invalid parameter "qualifiers" for "%s". The value "%s" is not a valid "GuardrailConverseContentQualifier".', __CLASS__, $listValue));
+                }
+                $payload['qualifiers'][$index] = $listValue;
+            }
+        }
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailCoverage.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailCoverage.php
new file mode 100644
index 000000000..9a9661e3e
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailCoverage.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * The action of the guardrail coverage details.
+ */
+final class GuardrailCoverage
+{
+    /**
+     * The text characters of the guardrail coverage details.
+     *
+     * @var GuardrailTextCharactersCoverage|null
+     */
+    private $textCharacters;
+
+    /**
+     * The guardrail coverage for images (the number of images that guardrails guarded).
+     *
+     * @var GuardrailImageCoverage|null
+     */
+    private $images;
+
+    /**
+     * @param array{
+     *   textCharacters?: null|GuardrailTextCharactersCoverage|array,
+     *   images?: null|GuardrailImageCoverage|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->textCharacters = isset($input['textCharacters']) ? GuardrailTextCharactersCoverage::create($input['textCharacters']) : null;
+        $this->images = isset($input['images']) ? GuardrailImageCoverage::create($input['images']) : null;
+    }
+
+    /**
+     * @param array{
+     *   textCharacters?: null|GuardrailTextCharactersCoverage|array,
+     *   images?: null|GuardrailImageCoverage|array,
+     * }|GuardrailCoverage $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getImages(): ?GuardrailImageCoverage
+    {
+        return $this->images;
+    }
+
+    public function getTextCharacters(): ?GuardrailTextCharactersCoverage
+    {
+        return $this->textCharacters;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailCustomWord.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailCustomWord.php
new file mode 100644
index 000000000..dff190f2a
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailCustomWord.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\GuardrailWordPolicyAction;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * A custom word configured in a guardrail.
+ */
+final class GuardrailCustomWord
+{
+    /**
+     * The match for the custom word.
+     *
+     * @var string
+     */
+    private $match;
+
+    /**
+     * The action for the custom word.
+     *
+     * @var GuardrailWordPolicyAction::*
+     */
+    private $action;
+
+    /**
+     * @param array{
+     *   match: string,
+     *   action: GuardrailWordPolicyAction::*,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->match = $input['match'] ?? $this->throwException(new InvalidArgument('Missing required field "match".'));
+        $this->action = $input['action'] ?? $this->throwException(new InvalidArgument('Missing required field "action".'));
+    }
+
+    /**
+     * @param array{
+     *   match: string,
+     *   action: GuardrailWordPolicyAction::*,
+     * }|GuardrailCustomWord $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return GuardrailWordPolicyAction::*
+     */
+    public function getAction(): string
+    {
+        return $this->action;
+    }
+
+    public function getMatch(): string
+    {
+        return $this->match;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailImageCoverage.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailImageCoverage.php
new file mode 100644
index 000000000..481fde435
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailImageCoverage.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * The details of the guardrail image coverage.
+ */
+final class GuardrailImageCoverage
+{
+    /**
+     * The count (integer) of images guardrails guarded.
+     *
+     * @var int|null
+     */
+    private $guarded;
+
+    /**
+     * Represents the total number of images (integer) that were in the request (guarded and unguarded).
+     *
+     * @var int|null
+     */
+    private $total;
+
+    /**
+     * @param array{
+     *   guarded?: null|int,
+     *   total?: null|int,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->guarded = $input['guarded'] ?? null;
+        $this->total = $input['total'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   guarded?: null|int,
+     *   total?: null|int,
+     * }|GuardrailImageCoverage $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getGuarded(): ?int
+    {
+        return $this->guarded;
+    }
+
+    public function getTotal(): ?int
+    {
+        return $this->total;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailInvocationMetrics.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailInvocationMetrics.php
new file mode 100644
index 000000000..125d703a4
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailInvocationMetrics.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * The invocation metrics for the guardrail.
+ */
+final class GuardrailInvocationMetrics
+{
+    /**
+     * The processing latency details for the guardrail invocation metrics.
+     *
+     * @var int|null
+     */
+    private $guardrailProcessingLatency;
+
+    /**
+     * The usage details for the guardrail invocation metrics.
+     *
+     * @var GuardrailUsage|null
+     */
+    private $usage;
+
+    /**
+     * The coverage details for the guardrail invocation metrics.
+     *
+     * @var GuardrailCoverage|null
+     */
+    private $guardrailCoverage;
+
+    /**
+     * @param array{
+     *   guardrailProcessingLatency?: null|int,
+     *   usage?: null|GuardrailUsage|array,
+     *   guardrailCoverage?: null|GuardrailCoverage|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->guardrailProcessingLatency = $input['guardrailProcessingLatency'] ?? null;
+        $this->usage = isset($input['usage']) ? GuardrailUsage::create($input['usage']) : null;
+        $this->guardrailCoverage = isset($input['guardrailCoverage']) ? GuardrailCoverage::create($input['guardrailCoverage']) : null;
+    }
+
+    /**
+     * @param array{
+     *   guardrailProcessingLatency?: null|int,
+     *   usage?: null|GuardrailUsage|array,
+     *   guardrailCoverage?: null|GuardrailCoverage|array,
+     * }|GuardrailInvocationMetrics $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getGuardrailCoverage(): ?GuardrailCoverage
+    {
+        return $this->guardrailCoverage;
+    }
+
+    public function getGuardrailProcessingLatency(): ?int
+    {
+        return $this->guardrailProcessingLatency;
+    }
+
+    public function getUsage(): ?GuardrailUsage
+    {
+        return $this->usage;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailManagedWord.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailManagedWord.php
new file mode 100644
index 000000000..773d96feb
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailManagedWord.php
@@ -0,0 +1,89 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\GuardrailManagedWordType;
+use AsyncAws\BedrockRuntime\Enum\GuardrailWordPolicyAction;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * A managed word configured in a guardrail.
+ */
+final class GuardrailManagedWord
+{
+    /**
+     * The match for the managed word.
+     *
+     * @var string
+     */
+    private $match;
+
+    /**
+     * The type for the managed word.
+     *
+     * @var GuardrailManagedWordType::*
+     */
+    private $type;
+
+    /**
+     * The action for the managed word.
+     *
+     * @var GuardrailWordPolicyAction::*
+     */
+    private $action;
+
+    /**
+     * @param array{
+     *   match: string,
+     *   type: GuardrailManagedWordType::*,
+     *   action: GuardrailWordPolicyAction::*,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->match = $input['match'] ?? $this->throwException(new InvalidArgument('Missing required field "match".'));
+        $this->type = $input['type'] ?? $this->throwException(new InvalidArgument('Missing required field "type".'));
+        $this->action = $input['action'] ?? $this->throwException(new InvalidArgument('Missing required field "action".'));
+    }
+
+    /**
+     * @param array{
+     *   match: string,
+     *   type: GuardrailManagedWordType::*,
+     *   action: GuardrailWordPolicyAction::*,
+     * }|GuardrailManagedWord $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return GuardrailWordPolicyAction::*
+     */
+    public function getAction(): string
+    {
+        return $this->action;
+    }
+
+    public function getMatch(): string
+    {
+        return $this->match;
+    }
+
+    /**
+     * @return GuardrailManagedWordType::*
+     */
+    public function getType(): string
+    {
+        return $this->type;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailPiiEntityFilter.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailPiiEntityFilter.php
new file mode 100644
index 000000000..bc6e81a87
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailPiiEntityFilter.php
@@ -0,0 +1,89 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\GuardrailPiiEntityType;
+use AsyncAws\BedrockRuntime\Enum\GuardrailSensitiveInformationPolicyAction;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * A Personally Identifiable Information (PII) entity configured in a guardrail.
+ */
+final class GuardrailPiiEntityFilter
+{
+    /**
+     * The PII entity filter match.
+     *
+     * @var string
+     */
+    private $match;
+
+    /**
+     * The PII entity filter type.
+     *
+     * @var GuardrailPiiEntityType::*
+     */
+    private $type;
+
+    /**
+     * The PII entity filter action.
+     *
+     * @var GuardrailSensitiveInformationPolicyAction::*
+     */
+    private $action;
+
+    /**
+     * @param array{
+     *   match: string,
+     *   type: GuardrailPiiEntityType::*,
+     *   action: GuardrailSensitiveInformationPolicyAction::*,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->match = $input['match'] ?? $this->throwException(new InvalidArgument('Missing required field "match".'));
+        $this->type = $input['type'] ?? $this->throwException(new InvalidArgument('Missing required field "type".'));
+        $this->action = $input['action'] ?? $this->throwException(new InvalidArgument('Missing required field "action".'));
+    }
+
+    /**
+     * @param array{
+     *   match: string,
+     *   type: GuardrailPiiEntityType::*,
+     *   action: GuardrailSensitiveInformationPolicyAction::*,
+     * }|GuardrailPiiEntityFilter $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return GuardrailSensitiveInformationPolicyAction::*
+     */
+    public function getAction(): string
+    {
+        return $this->action;
+    }
+
+    public function getMatch(): string
+    {
+        return $this->match;
+    }
+
+    /**
+     * @return GuardrailPiiEntityType::*
+     */
+    public function getType(): string
+    {
+        return $this->type;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailRegexFilter.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailRegexFilter.php
new file mode 100644
index 000000000..5ba11564c
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailRegexFilter.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\GuardrailSensitiveInformationPolicyAction;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * A Regex filter configured in a guardrail.
+ */
+final class GuardrailRegexFilter
+{
+    /**
+     * The regex filter name.
+     *
+     * @var string|null
+     */
+    private $name;
+
+    /**
+     * The regesx filter match.
+     *
+     * @var string|null
+     */
+    private $match;
+
+    /**
+     * The regex query.
+     *
+     * @var string|null
+     */
+    private $regex;
+
+    /**
+     * The region filter action.
+     *
+     * @var GuardrailSensitiveInformationPolicyAction::*
+     */
+    private $action;
+
+    /**
+     * @param array{
+     *   name?: null|string,
+     *   match?: null|string,
+     *   regex?: null|string,
+     *   action: GuardrailSensitiveInformationPolicyAction::*,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->name = $input['name'] ?? null;
+        $this->match = $input['match'] ?? null;
+        $this->regex = $input['regex'] ?? null;
+        $this->action = $input['action'] ?? $this->throwException(new InvalidArgument('Missing required field "action".'));
+    }
+
+    /**
+     * @param array{
+     *   name?: null|string,
+     *   match?: null|string,
+     *   regex?: null|string,
+     *   action: GuardrailSensitiveInformationPolicyAction::*,
+     * }|GuardrailRegexFilter $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return GuardrailSensitiveInformationPolicyAction::*
+     */
+    public function getAction(): string
+    {
+        return $this->action;
+    }
+
+    public function getMatch(): ?string
+    {
+        return $this->match;
+    }
+
+    public function getName(): ?string
+    {
+        return $this->name;
+    }
+
+    public function getRegex(): ?string
+    {
+        return $this->regex;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailSensitiveInformationPolicyAssessment.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailSensitiveInformationPolicyAssessment.php
new file mode 100644
index 000000000..d663842c2
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailSensitiveInformationPolicyAssessment.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * The assessment for aPersonally Identifiable Information (PII) policy.
+ */
+final class GuardrailSensitiveInformationPolicyAssessment
+{
+    /**
+     * The PII entities in the assessment.
+     *
+     * @var GuardrailPiiEntityFilter[]
+     */
+    private $piiEntities;
+
+    /**
+     * The regex queries in the assessment.
+     *
+     * @var GuardrailRegexFilter[]
+     */
+    private $regexes;
+
+    /**
+     * @param array{
+     *   piiEntities: array<GuardrailPiiEntityFilter|array>,
+     *   regexes: array<GuardrailRegexFilter|array>,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->piiEntities = isset($input['piiEntities']) ? array_map([GuardrailPiiEntityFilter::class, 'create'], $input['piiEntities']) : $this->throwException(new InvalidArgument('Missing required field "piiEntities".'));
+        $this->regexes = isset($input['regexes']) ? array_map([GuardrailRegexFilter::class, 'create'], $input['regexes']) : $this->throwException(new InvalidArgument('Missing required field "regexes".'));
+    }
+
+    /**
+     * @param array{
+     *   piiEntities: array<GuardrailPiiEntityFilter|array>,
+     *   regexes: array<GuardrailRegexFilter|array>,
+     * }|GuardrailSensitiveInformationPolicyAssessment $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return GuardrailPiiEntityFilter[]
+     */
+    public function getPiiEntities(): array
+    {
+        return $this->piiEntities;
+    }
+
+    /**
+     * @return GuardrailRegexFilter[]
+     */
+    public function getRegexes(): array
+    {
+        return $this->regexes;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailTextCharactersCoverage.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailTextCharactersCoverage.php
new file mode 100644
index 000000000..bba6096a0
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailTextCharactersCoverage.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * The guardrail coverage for the text characters.
+ */
+final class GuardrailTextCharactersCoverage
+{
+    /**
+     * The text characters that were guarded by the guardrail coverage.
+     *
+     * @var int|null
+     */
+    private $guarded;
+
+    /**
+     * The total text characters by the guardrail coverage.
+     *
+     * @var int|null
+     */
+    private $total;
+
+    /**
+     * @param array{
+     *   guarded?: null|int,
+     *   total?: null|int,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->guarded = $input['guarded'] ?? null;
+        $this->total = $input['total'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   guarded?: null|int,
+     *   total?: null|int,
+     * }|GuardrailTextCharactersCoverage $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getGuarded(): ?int
+    {
+        return $this->guarded;
+    }
+
+    public function getTotal(): ?int
+    {
+        return $this->total;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailTopic.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailTopic.php
new file mode 100644
index 000000000..23e33b621
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailTopic.php
@@ -0,0 +1,89 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\GuardrailTopicPolicyAction;
+use AsyncAws\BedrockRuntime\Enum\GuardrailTopicType;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * Information about a topic guardrail.
+ */
+final class GuardrailTopic
+{
+    /**
+     * The name for the guardrail.
+     *
+     * @var string
+     */
+    private $name;
+
+    /**
+     * The type behavior that the guardrail should perform when the model detects the topic.
+     *
+     * @var GuardrailTopicType::*
+     */
+    private $type;
+
+    /**
+     * The action the guardrail should take when it intervenes on a topic.
+     *
+     * @var GuardrailTopicPolicyAction::*
+     */
+    private $action;
+
+    /**
+     * @param array{
+     *   name: string,
+     *   type: GuardrailTopicType::*,
+     *   action: GuardrailTopicPolicyAction::*,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->name = $input['name'] ?? $this->throwException(new InvalidArgument('Missing required field "name".'));
+        $this->type = $input['type'] ?? $this->throwException(new InvalidArgument('Missing required field "type".'));
+        $this->action = $input['action'] ?? $this->throwException(new InvalidArgument('Missing required field "action".'));
+    }
+
+    /**
+     * @param array{
+     *   name: string,
+     *   type: GuardrailTopicType::*,
+     *   action: GuardrailTopicPolicyAction::*,
+     * }|GuardrailTopic $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return GuardrailTopicPolicyAction::*
+     */
+    public function getAction(): string
+    {
+        return $this->action;
+    }
+
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    /**
+     * @return GuardrailTopicType::*
+     */
+    public function getType(): string
+    {
+        return $this->type;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailTopicPolicyAssessment.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailTopicPolicyAssessment.php
new file mode 100644
index 000000000..8d19bbc35
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailTopicPolicyAssessment.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * A behavior assessment of a topic policy.
+ */
+final class GuardrailTopicPolicyAssessment
+{
+    /**
+     * The topics in the assessment.
+     *
+     * @var GuardrailTopic[]
+     */
+    private $topics;
+
+    /**
+     * @param array{
+     *   topics: array<GuardrailTopic|array>,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->topics = isset($input['topics']) ? array_map([GuardrailTopic::class, 'create'], $input['topics']) : $this->throwException(new InvalidArgument('Missing required field "topics".'));
+    }
+
+    /**
+     * @param array{
+     *   topics: array<GuardrailTopic|array>,
+     * }|GuardrailTopicPolicyAssessment $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return GuardrailTopic[]
+     */
+    public function getTopics(): array
+    {
+        return $this->topics;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailTraceAssessment.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailTraceAssessment.php
new file mode 100644
index 000000000..e7ff41453
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailTraceAssessment.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * A Top level guardrail trace object. For more information, see ConverseTrace.
+ */
+final class GuardrailTraceAssessment
+{
+    /**
+     * The output from the model.
+     *
+     * @var string[]|null
+     */
+    private $modelOutput;
+
+    /**
+     * The input assessment.
+     *
+     * @var array<string, GuardrailAssessment>|null
+     */
+    private $inputAssessment;
+
+    /**
+     * the output assessments.
+     *
+     * @var array<string, GuardrailAssessment[]>|null
+     */
+    private $outputAssessments;
+
+    /**
+     * @param array{
+     *   modelOutput?: null|string[],
+     *   inputAssessment?: null|array<string, GuardrailAssessment|array>,
+     *   outputAssessments?: null|array<string, array>,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->modelOutput = $input['modelOutput'] ?? null;
+        $this->inputAssessment = isset($input['inputAssessment']) ? array_map([GuardrailAssessment::class, 'create'], $input['inputAssessment']) : null;
+        $this->outputAssessments = $input['outputAssessments'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   modelOutput?: null|string[],
+     *   inputAssessment?: null|array<string, GuardrailAssessment|array>,
+     *   outputAssessments?: null|array<string, array>,
+     * }|GuardrailTraceAssessment $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return array<string, GuardrailAssessment>
+     */
+    public function getInputAssessment(): array
+    {
+        return $this->inputAssessment ?? [];
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getModelOutput(): array
+    {
+        return $this->modelOutput ?? [];
+    }
+
+    /**
+     * @return array<string, GuardrailAssessment[]>
+     */
+    public function getOutputAssessments(): array
+    {
+        return $this->outputAssessments ?? [];
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailUsage.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailUsage.php
new file mode 100644
index 000000000..f079cf817
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailUsage.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * The details on the use of the guardrail.
+ */
+final class GuardrailUsage
+{
+    /**
+     * The topic policy units processed by the guardrail.
+     *
+     * @var int
+     */
+    private $topicPolicyUnits;
+
+    /**
+     * The content policy units processed by the guardrail.
+     *
+     * @var int
+     */
+    private $contentPolicyUnits;
+
+    /**
+     * The word policy units processed by the guardrail.
+     *
+     * @var int
+     */
+    private $wordPolicyUnits;
+
+    /**
+     * The sensitive information policy units processed by the guardrail.
+     *
+     * @var int
+     */
+    private $sensitiveInformationPolicyUnits;
+
+    /**
+     * The sensitive information policy free units processed by the guardrail.
+     *
+     * @var int
+     */
+    private $sensitiveInformationPolicyFreeUnits;
+
+    /**
+     * The contextual grounding policy units processed by the guardrail.
+     *
+     * @var int
+     */
+    private $contextualGroundingPolicyUnits;
+
+    /**
+     * @param array{
+     *   topicPolicyUnits: int,
+     *   contentPolicyUnits: int,
+     *   wordPolicyUnits: int,
+     *   sensitiveInformationPolicyUnits: int,
+     *   sensitiveInformationPolicyFreeUnits: int,
+     *   contextualGroundingPolicyUnits: int,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->topicPolicyUnits = $input['topicPolicyUnits'] ?? $this->throwException(new InvalidArgument('Missing required field "topicPolicyUnits".'));
+        $this->contentPolicyUnits = $input['contentPolicyUnits'] ?? $this->throwException(new InvalidArgument('Missing required field "contentPolicyUnits".'));
+        $this->wordPolicyUnits = $input['wordPolicyUnits'] ?? $this->throwException(new InvalidArgument('Missing required field "wordPolicyUnits".'));
+        $this->sensitiveInformationPolicyUnits = $input['sensitiveInformationPolicyUnits'] ?? $this->throwException(new InvalidArgument('Missing required field "sensitiveInformationPolicyUnits".'));
+        $this->sensitiveInformationPolicyFreeUnits = $input['sensitiveInformationPolicyFreeUnits'] ?? $this->throwException(new InvalidArgument('Missing required field "sensitiveInformationPolicyFreeUnits".'));
+        $this->contextualGroundingPolicyUnits = $input['contextualGroundingPolicyUnits'] ?? $this->throwException(new InvalidArgument('Missing required field "contextualGroundingPolicyUnits".'));
+    }
+
+    /**
+     * @param array{
+     *   topicPolicyUnits: int,
+     *   contentPolicyUnits: int,
+     *   wordPolicyUnits: int,
+     *   sensitiveInformationPolicyUnits: int,
+     *   sensitiveInformationPolicyFreeUnits: int,
+     *   contextualGroundingPolicyUnits: int,
+     * }|GuardrailUsage $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getContentPolicyUnits(): int
+    {
+        return $this->contentPolicyUnits;
+    }
+
+    public function getContextualGroundingPolicyUnits(): int
+    {
+        return $this->contextualGroundingPolicyUnits;
+    }
+
+    public function getSensitiveInformationPolicyFreeUnits(): int
+    {
+        return $this->sensitiveInformationPolicyFreeUnits;
+    }
+
+    public function getSensitiveInformationPolicyUnits(): int
+    {
+        return $this->sensitiveInformationPolicyUnits;
+    }
+
+    public function getTopicPolicyUnits(): int
+    {
+        return $this->topicPolicyUnits;
+    }
+
+    public function getWordPolicyUnits(): int
+    {
+        return $this->wordPolicyUnits;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/GuardrailWordPolicyAssessment.php b/src/Service/BedrockRuntime/src/ValueObject/GuardrailWordPolicyAssessment.php
new file mode 100644
index 000000000..91222ec34
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/GuardrailWordPolicyAssessment.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * The word policy assessment.
+ */
+final class GuardrailWordPolicyAssessment
+{
+    /**
+     * Custom words in the assessment.
+     *
+     * @var GuardrailCustomWord[]
+     */
+    private $customWords;
+
+    /**
+     * Managed word lists in the assessment.
+     *
+     * @var GuardrailManagedWord[]
+     */
+    private $managedWordLists;
+
+    /**
+     * @param array{
+     *   customWords: array<GuardrailCustomWord|array>,
+     *   managedWordLists: array<GuardrailManagedWord|array>,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->customWords = isset($input['customWords']) ? array_map([GuardrailCustomWord::class, 'create'], $input['customWords']) : $this->throwException(new InvalidArgument('Missing required field "customWords".'));
+        $this->managedWordLists = isset($input['managedWordLists']) ? array_map([GuardrailManagedWord::class, 'create'], $input['managedWordLists']) : $this->throwException(new InvalidArgument('Missing required field "managedWordLists".'));
+    }
+
+    /**
+     * @param array{
+     *   customWords: array<GuardrailCustomWord|array>,
+     *   managedWordLists: array<GuardrailManagedWord|array>,
+     * }|GuardrailWordPolicyAssessment $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return GuardrailCustomWord[]
+     */
+    public function getCustomWords(): array
+    {
+        return $this->customWords;
+    }
+
+    /**
+     * @return GuardrailManagedWord[]
+     */
+    public function getManagedWordLists(): array
+    {
+        return $this->managedWordLists;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ImageBlock.php b/src/Service/BedrockRuntime/src/ValueObject/ImageBlock.php
new file mode 100644
index 000000000..dc40abc35
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ImageBlock.php
@@ -0,0 +1,87 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\ImageFormat;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * Image content for a message.
+ */
+final class ImageBlock
+{
+    /**
+     * The format of the image.
+     *
+     * @var ImageFormat::*
+     */
+    private $format;
+
+    /**
+     * The source for the image.
+     *
+     * @var ImageSource
+     */
+    private $source;
+
+    /**
+     * @param array{
+     *   format: ImageFormat::*,
+     *   source: ImageSource|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->format = $input['format'] ?? $this->throwException(new InvalidArgument('Missing required field "format".'));
+        $this->source = isset($input['source']) ? ImageSource::create($input['source']) : $this->throwException(new InvalidArgument('Missing required field "source".'));
+    }
+
+    /**
+     * @param array{
+     *   format: ImageFormat::*,
+     *   source: ImageSource|array,
+     * }|ImageBlock $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return ImageFormat::*
+     */
+    public function getFormat(): string
+    {
+        return $this->format;
+    }
+
+    public function getSource(): ImageSource
+    {
+        return $this->source;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->format;
+        if (!ImageFormat::exists($v)) {
+            throw new InvalidArgument(\sprintf('Invalid parameter "format" for "%s". The value "%s" is not a valid "ImageFormat".', __CLASS__, $v));
+        }
+        $payload['format'] = $v;
+        $v = $this->source;
+        $payload['source'] = $v->requestBody();
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ImageSource.php b/src/Service/BedrockRuntime/src/ValueObject/ImageSource.php
new file mode 100644
index 000000000..f35fb3027
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ImageSource.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * The source for an image.
+ */
+final class ImageSource
+{
+    /**
+     * The raw image bytes for the image. If you use an AWS SDK, you don't need to encode the image bytes in base64.
+     *
+     * @var string|null
+     */
+    private $bytes;
+
+    /**
+     * @param array{
+     *   bytes?: null|string,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->bytes = $input['bytes'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   bytes?: null|string,
+     * }|ImageSource $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getBytes(): ?string
+    {
+        return $this->bytes;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->bytes) {
+            $payload['bytes'] = base64_encode($v);
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/InferenceConfiguration.php b/src/Service/BedrockRuntime/src/ValueObject/InferenceConfiguration.php
new file mode 100644
index 000000000..d47bee61e
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/InferenceConfiguration.php
@@ -0,0 +1,143 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * Base inference parameters to pass to a model in a call to Converse [^1] or ConverseStream [^2]. For more information,
+ * see Inference parameters for foundation models [^3].
+ *
+ * If you need to pass additional parameters that the model supports, use the `additionalModelRequestFields` request
+ * field in the call to `Converse` or `ConverseStream`. For more information, see Model parameters [^4].
+ *
+ * [^1]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html
+ * [^2]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html
+ * [^3]: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html
+ * [^4]: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html
+ */
+final class InferenceConfiguration
+{
+    /**
+     * The maximum number of tokens to allow in the generated response. The default value is the maximum allowed value for
+     * the model that you are using. For more information, see Inference parameters for foundation models [^1].
+     *
+     * [^1]: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html
+     *
+     * @var int|null
+     */
+    private $maxTokens;
+
+    /**
+     * The likelihood of the model selecting higher-probability options while generating a response. A lower value makes the
+     * model more likely to choose higher-probability options, while a higher value makes the model more likely to choose
+     * lower-probability options.
+     *
+     * The default value is the default value for the model that you are using. For more information, see Inference
+     * parameters for foundation models [^1].
+     *
+     * [^1]: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html
+     *
+     * @var float|null
+     */
+    private $temperature;
+
+    /**
+     * The percentage of most-likely candidates that the model considers for the next token. For example, if you choose a
+     * value of 0.8 for `topP`, the model selects from the top 80% of the probability distribution of tokens that could be
+     * next in the sequence.
+     *
+     * The default value is the default value for the model that you are using. For more information, see Inference
+     * parameters for foundation models [^1].
+     *
+     * [^1]: https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html
+     *
+     * @var float|null
+     */
+    private $topP;
+
+    /**
+     * A list of stop sequences. A stop sequence is a sequence of characters that causes the model to stop generating the
+     * response.
+     *
+     * @var string[]|null
+     */
+    private $stopSequences;
+
+    /**
+     * @param array{
+     *   maxTokens?: null|int,
+     *   temperature?: null|float,
+     *   topP?: null|float,
+     *   stopSequences?: null|string[],
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->maxTokens = $input['maxTokens'] ?? null;
+        $this->temperature = $input['temperature'] ?? null;
+        $this->topP = $input['topP'] ?? null;
+        $this->stopSequences = $input['stopSequences'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   maxTokens?: null|int,
+     *   temperature?: null|float,
+     *   topP?: null|float,
+     *   stopSequences?: null|string[],
+     * }|InferenceConfiguration $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getMaxTokens(): ?int
+    {
+        return $this->maxTokens;
+    }
+
+    /**
+     * @return string[]
+     */
+    public function getStopSequences(): array
+    {
+        return $this->stopSequences ?? [];
+    }
+
+    public function getTemperature(): ?float
+    {
+        return $this->temperature;
+    }
+
+    public function getTopP(): ?float
+    {
+        return $this->topP;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->maxTokens) {
+            $payload['maxTokens'] = $v;
+        }
+        if (null !== $v = $this->temperature) {
+            $payload['temperature'] = $v;
+        }
+        if (null !== $v = $this->topP) {
+            $payload['topP'] = $v;
+        }
+        if (null !== $v = $this->stopSequences) {
+            $index = -1;
+            $payload['stopSequences'] = [];
+            foreach ($v as $listValue) {
+                ++$index;
+                $payload['stopSequences'][$index] = $listValue;
+            }
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/Message.php b/src/Service/BedrockRuntime/src/ValueObject/Message.php
new file mode 100644
index 000000000..966ab5cc3
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/Message.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\ConversationRole;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * A message input, or returned from, a call to Converse [^1] or ConverseStream [^2].
+ *
+ * [^1]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html
+ * [^2]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html
+ */
+final class Message
+{
+    /**
+     * The role that the message plays in the message.
+     *
+     * @var ConversationRole::*
+     */
+    private $role;
+
+    /**
+     * The message content. Note the following restrictions:
+     *
+     * - You can include up to 20 images. Each image's size, height, and width must be no more than 3.75 MB, 8000 px, and
+     *   8000 px, respectively.
+     * - You can include up to five documents. Each document's size must be no more than 4.5 MB.
+     * - If you include a `ContentBlock` with a `document` field in the array, you must also include a `ContentBlock` with a
+     *   `text` field.
+     * - You can only include images and documents if the `role` is `user`.
+     *
+     * @var ContentBlock[]
+     */
+    private $content;
+
+    /**
+     * @param array{
+     *   role: ConversationRole::*,
+     *   content: array<ContentBlock|array>,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->role = $input['role'] ?? $this->throwException(new InvalidArgument('Missing required field "role".'));
+        $this->content = isset($input['content']) ? array_map([ContentBlock::class, 'create'], $input['content']) : $this->throwException(new InvalidArgument('Missing required field "content".'));
+    }
+
+    /**
+     * @param array{
+     *   role: ConversationRole::*,
+     *   content: array<ContentBlock|array>,
+     * }|Message $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return ContentBlock[]
+     */
+    public function getContent(): array
+    {
+        return $this->content;
+    }
+
+    /**
+     * @return ConversationRole::*
+     */
+    public function getRole(): string
+    {
+        return $this->role;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->role;
+        if (!ConversationRole::exists($v)) {
+            throw new InvalidArgument(\sprintf('Invalid parameter "role" for "%s". The value "%s" is not a valid "ConversationRole".', __CLASS__, $v));
+        }
+        $payload['role'] = $v;
+        $v = $this->content;
+
+        $index = -1;
+        $payload['content'] = [];
+        foreach ($v as $listValue) {
+            ++$index;
+            $payload['content'][$index] = $listValue->requestBody();
+        }
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/PerformanceConfiguration.php b/src/Service/BedrockRuntime/src/ValueObject/PerformanceConfiguration.php
new file mode 100644
index 000000000..c70a7756e
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/PerformanceConfiguration.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\PerformanceConfigLatency;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * Performance settings for a model.
+ */
+final class PerformanceConfiguration
+{
+    /**
+     * To use a latency-optimized version of the model, set to `optimized`.
+     *
+     * @var PerformanceConfigLatency::*|null
+     */
+    private $latency;
+
+    /**
+     * @param array{
+     *   latency?: null|PerformanceConfigLatency::*,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->latency = $input['latency'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   latency?: null|PerformanceConfigLatency::*,
+     * }|PerformanceConfiguration $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return PerformanceConfigLatency::*|null
+     */
+    public function getLatency(): ?string
+    {
+        return $this->latency;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->latency) {
+            if (!PerformanceConfigLatency::exists($v)) {
+                throw new InvalidArgument(\sprintf('Invalid parameter "latency" for "%s". The value "%s" is not a valid "PerformanceConfigLatency".', __CLASS__, $v));
+            }
+            $payload['latency'] = $v;
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/PromptRouterTrace.php b/src/Service/BedrockRuntime/src/ValueObject/PromptRouterTrace.php
new file mode 100644
index 000000000..a093f701b
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/PromptRouterTrace.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * A prompt router trace.
+ */
+final class PromptRouterTrace
+{
+    /**
+     * The ID of the invoked model.
+     *
+     * @var string|null
+     */
+    private $invokedModelId;
+
+    /**
+     * @param array{
+     *   invokedModelId?: null|string,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->invokedModelId = $input['invokedModelId'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   invokedModelId?: null|string,
+     * }|PromptRouterTrace $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getInvokedModelId(): ?string
+    {
+        return $this->invokedModelId;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/PromptVariableValues.php b/src/Service/BedrockRuntime/src/ValueObject/PromptVariableValues.php
new file mode 100644
index 000000000..a229d18db
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/PromptVariableValues.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * Contains a map of variables in a prompt from Prompt management to an object containing the values to fill in for them
+ * when running model invocation. For more information, see How Prompt management works [^1].
+ *
+ * [^1]: https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-management-how.html
+ */
+final class PromptVariableValues
+{
+    /**
+     * The text value that the variable maps to.
+     *
+     * @var string|null
+     */
+    private $text;
+
+    /**
+     * @param array{
+     *   text?: null|string,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->text = $input['text'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   text?: null|string,
+     * }|PromptVariableValues $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getText(): ?string
+    {
+        return $this->text;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->text) {
+            $payload['text'] = $v;
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ReasoningContentBlock.php b/src/Service/BedrockRuntime/src/ValueObject/ReasoningContentBlock.php
new file mode 100644
index 000000000..4a3cbab0f
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ReasoningContentBlock.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * Contains content regarding the reasoning that is carried out by the model with respect to the content in the content
+ * block. Reasoning refers to a Chain of Thought (CoT) that the model generates to enhance the accuracy of its final
+ * response.
+ */
+final class ReasoningContentBlock
+{
+    /**
+     * The reasoning that the model used to return the output.
+     *
+     * @var ReasoningTextBlock|null
+     */
+    private $reasoningText;
+
+    /**
+     * The content in the reasoning that was encrypted by the model provider for safety reasons. The encryption doesn't
+     * affect the quality of responses.
+     *
+     * @var string|null
+     */
+    private $redactedContent;
+
+    /**
+     * @param array{
+     *   reasoningText?: null|ReasoningTextBlock|array,
+     *   redactedContent?: null|string,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->reasoningText = isset($input['reasoningText']) ? ReasoningTextBlock::create($input['reasoningText']) : null;
+        $this->redactedContent = $input['redactedContent'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   reasoningText?: null|ReasoningTextBlock|array,
+     *   redactedContent?: null|string,
+     * }|ReasoningContentBlock $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getReasoningText(): ?ReasoningTextBlock
+    {
+        return $this->reasoningText;
+    }
+
+    public function getRedactedContent(): ?string
+    {
+        return $this->redactedContent;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->reasoningText) {
+            $payload['reasoningText'] = $v->requestBody();
+        }
+        if (null !== $v = $this->redactedContent) {
+            $payload['redactedContent'] = base64_encode($v);
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ReasoningTextBlock.php b/src/Service/BedrockRuntime/src/ValueObject/ReasoningTextBlock.php
new file mode 100644
index 000000000..7d0befd2c
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ReasoningTextBlock.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * Contains the reasoning that the model used to return the output.
+ */
+final class ReasoningTextBlock
+{
+    /**
+     * The reasoning that the model used to return the output.
+     *
+     * @var string
+     */
+    private $text;
+
+    /**
+     * A token that verifies that the reasoning text was generated by the model. If you pass a reasoning block back to the
+     * API in a multi-turn conversation, include the text and its signature unmodified.
+     *
+     * @var string|null
+     */
+    private $signature;
+
+    /**
+     * @param array{
+     *   text: string,
+     *   signature?: null|string,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->text = $input['text'] ?? $this->throwException(new InvalidArgument('Missing required field "text".'));
+        $this->signature = $input['signature'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   text: string,
+     *   signature?: null|string,
+     * }|ReasoningTextBlock $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getSignature(): ?string
+    {
+        return $this->signature;
+    }
+
+    public function getText(): string
+    {
+        return $this->text;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->text;
+        $payload['text'] = $v;
+        if (null !== $v = $this->signature) {
+            $payload['signature'] = $v;
+        }
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/S3Location.php b/src/Service/BedrockRuntime/src/ValueObject/S3Location.php
new file mode 100644
index 000000000..932631bc0
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/S3Location.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * A storage location in an S3 bucket.
+ */
+final class S3Location
+{
+    /**
+     * An object URI starting with `s3://`.
+     *
+     * @var string
+     */
+    private $uri;
+
+    /**
+     * If the bucket belongs to another AWS account, specify that account's ID.
+     *
+     * @var string|null
+     */
+    private $bucketOwner;
+
+    /**
+     * @param array{
+     *   uri: string,
+     *   bucketOwner?: null|string,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->uri = $input['uri'] ?? $this->throwException(new InvalidArgument('Missing required field "uri".'));
+        $this->bucketOwner = $input['bucketOwner'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   uri: string,
+     *   bucketOwner?: null|string,
+     * }|S3Location $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getBucketOwner(): ?string
+    {
+        return $this->bucketOwner;
+    }
+
+    public function getUri(): string
+    {
+        return $this->uri;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->uri;
+        $payload['uri'] = $v;
+        if (null !== $v = $this->bucketOwner) {
+            $payload['bucketOwner'] = $v;
+        }
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/SpecificToolChoice.php b/src/Service/BedrockRuntime/src/ValueObject/SpecificToolChoice.php
new file mode 100644
index 000000000..da6ddedb1
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/SpecificToolChoice.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * The model must request a specific tool. For example, `{"tool" : {"name" : "Your tool name"}}`.
+ *
+ * > This field is only supported by Anthropic Claude 3 models.
+ */
+final class SpecificToolChoice
+{
+    /**
+     * The name of the tool that the model must request.
+     *
+     * @var string
+     */
+    private $name;
+
+    /**
+     * @param array{
+     *   name: string,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->name = $input['name'] ?? $this->throwException(new InvalidArgument('Missing required field "name".'));
+    }
+
+    /**
+     * @param array{
+     *   name: string,
+     * }|SpecificToolChoice $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->name;
+        $payload['name'] = $v;
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/SystemContentBlock.php b/src/Service/BedrockRuntime/src/ValueObject/SystemContentBlock.php
new file mode 100644
index 000000000..5b7c524c2
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/SystemContentBlock.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * A system content block.
+ */
+final class SystemContentBlock
+{
+    /**
+     * A system prompt for the model.
+     *
+     * @var string|null
+     */
+    private $text;
+
+    /**
+     * A content block to assess with the guardrail. Use with the Converse [^1] or ConverseStream [^2] API operations.
+     *
+     * For more information, see *Use a guardrail with the Converse API* in the *Amazon Bedrock User Guide*.
+     *
+     * [^1]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html
+     * [^2]: https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html
+     *
+     * @var GuardrailConverseContentBlock|null
+     */
+    private $guardContent;
+
+    /**
+     * @param array{
+     *   text?: null|string,
+     *   guardContent?: null|GuardrailConverseContentBlock|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->text = $input['text'] ?? null;
+        $this->guardContent = isset($input['guardContent']) ? GuardrailConverseContentBlock::create($input['guardContent']) : null;
+    }
+
+    /**
+     * @param array{
+     *   text?: null|string,
+     *   guardContent?: null|GuardrailConverseContentBlock|array,
+     * }|SystemContentBlock $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getGuardContent(): ?GuardrailConverseContentBlock
+    {
+        return $this->guardContent;
+    }
+
+    public function getText(): ?string
+    {
+        return $this->text;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->text) {
+            $payload['text'] = $v;
+        }
+        if (null !== $v = $this->guardContent) {
+            $payload['guardContent'] = $v->requestBody();
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/TokenUsage.php b/src/Service/BedrockRuntime/src/ValueObject/TokenUsage.php
new file mode 100644
index 000000000..8a514d070
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/TokenUsage.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * The tokens used in a message API inference call.
+ */
+final class TokenUsage
+{
+    /**
+     * The number of tokens sent in the request to the model.
+     *
+     * @var int
+     */
+    private $inputTokens;
+
+    /**
+     * The number of tokens that the model generated for the request.
+     *
+     * @var int
+     */
+    private $outputTokens;
+
+    /**
+     * The total of input tokens and tokens generated by the model.
+     *
+     * @var int
+     */
+    private $totalTokens;
+
+    /**
+     * @param array{
+     *   inputTokens: int,
+     *   outputTokens: int,
+     *   totalTokens: int,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->inputTokens = $input['inputTokens'] ?? $this->throwException(new InvalidArgument('Missing required field "inputTokens".'));
+        $this->outputTokens = $input['outputTokens'] ?? $this->throwException(new InvalidArgument('Missing required field "outputTokens".'));
+        $this->totalTokens = $input['totalTokens'] ?? $this->throwException(new InvalidArgument('Missing required field "totalTokens".'));
+    }
+
+    /**
+     * @param array{
+     *   inputTokens: int,
+     *   outputTokens: int,
+     *   totalTokens: int,
+     * }|TokenUsage $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getInputTokens(): int
+    {
+        return $this->inputTokens;
+    }
+
+    public function getOutputTokens(): int
+    {
+        return $this->outputTokens;
+    }
+
+    public function getTotalTokens(): int
+    {
+        return $this->totalTokens;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/Tool.php b/src/Service/BedrockRuntime/src/ValueObject/Tool.php
new file mode 100644
index 000000000..fbf682232
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/Tool.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * Information about a tool that you can use with the Converse API. For more information, see Tool use (function
+ * calling) [^1] in the Amazon Bedrock User Guide.
+ *
+ * [^1]: https://docs.aws.amazon.com/bedrock/latest/userguide/tool-use.html
+ */
+final class Tool
+{
+    /**
+     * The specfication for the tool.
+     *
+     * @var ToolSpecification|null
+     */
+    private $toolSpec;
+
+    /**
+     * @param array{
+     *   toolSpec?: null|ToolSpecification|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->toolSpec = isset($input['toolSpec']) ? ToolSpecification::create($input['toolSpec']) : null;
+    }
+
+    /**
+     * @param array{
+     *   toolSpec?: null|ToolSpecification|array,
+     * }|Tool $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getToolSpec(): ?ToolSpecification
+    {
+        return $this->toolSpec;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->toolSpec) {
+            $payload['toolSpec'] = $v->requestBody();
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ToolChoice.php b/src/Service/BedrockRuntime/src/ValueObject/ToolChoice.php
new file mode 100644
index 000000000..0b0c7b601
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ToolChoice.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * Determines which tools the model should request in a call to `Converse` or `ConverseStream`. `ToolChoice` is only
+ * supported by Anthropic Claude 3 models and by Mistral AI Mistral Large.
+ */
+final class ToolChoice
+{
+    /**
+     * (Default). The Model automatically decides if a tool should be called or whether to generate text instead.
+     *
+     * @var AutoToolChoice|null
+     */
+    private $auto;
+
+    /**
+     * The model must request at least one tool (no text is generated).
+     *
+     * @var AnyToolChoice|null
+     */
+    private $any;
+
+    /**
+     * The Model must request the specified tool. Only supported by Anthropic Claude 3 models.
+     *
+     * @var SpecificToolChoice|null
+     */
+    private $tool;
+
+    /**
+     * @param array{
+     *   auto?: null|AutoToolChoice|array,
+     *   any?: null|AnyToolChoice|array,
+     *   tool?: null|SpecificToolChoice|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->auto = isset($input['auto']) ? AutoToolChoice::create($input['auto']) : null;
+        $this->any = isset($input['any']) ? AnyToolChoice::create($input['any']) : null;
+        $this->tool = isset($input['tool']) ? SpecificToolChoice::create($input['tool']) : null;
+    }
+
+    /**
+     * @param array{
+     *   auto?: null|AutoToolChoice|array,
+     *   any?: null|AnyToolChoice|array,
+     *   tool?: null|SpecificToolChoice|array,
+     * }|ToolChoice $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getAny(): ?AnyToolChoice
+    {
+        return $this->any;
+    }
+
+    public function getAuto(): ?AutoToolChoice
+    {
+        return $this->auto;
+    }
+
+    public function getTool(): ?SpecificToolChoice
+    {
+        return $this->tool;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->auto) {
+            $payload['auto'] = $v->requestBody();
+        }
+        if (null !== $v = $this->any) {
+            $payload['any'] = $v->requestBody();
+        }
+        if (null !== $v = $this->tool) {
+            $payload['tool'] = $v->requestBody();
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ToolConfiguration.php b/src/Service/BedrockRuntime/src/ValueObject/ToolConfiguration.php
new file mode 100644
index 000000000..0963c9e8d
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ToolConfiguration.php
@@ -0,0 +1,94 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * Configuration information for the tools that you pass to a model. For more information, see Tool use (function
+ * calling) [^1] in the Amazon Bedrock User Guide.
+ *
+ * [^1]: https://docs.aws.amazon.com/bedrock/latest/userguide/tool-use.html
+ */
+final class ToolConfiguration
+{
+    /**
+     * An array of tools that you want to pass to a model.
+     *
+     * @var Tool[]
+     */
+    private $tools;
+
+    /**
+     * If supported by model, forces the model to request a tool.
+     *
+     * @var ToolChoice|null
+     */
+    private $toolChoice;
+
+    /**
+     * @param array{
+     *   tools: array<Tool|array>,
+     *   toolChoice?: null|ToolChoice|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->tools = isset($input['tools']) ? array_map([Tool::class, 'create'], $input['tools']) : $this->throwException(new InvalidArgument('Missing required field "tools".'));
+        $this->toolChoice = isset($input['toolChoice']) ? ToolChoice::create($input['toolChoice']) : null;
+    }
+
+    /**
+     * @param array{
+     *   tools: array<Tool|array>,
+     *   toolChoice?: null|ToolChoice|array,
+     * }|ToolConfiguration $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getToolChoice(): ?ToolChoice
+    {
+        return $this->toolChoice;
+    }
+
+    /**
+     * @return Tool[]
+     */
+    public function getTools(): array
+    {
+        return $this->tools;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->tools;
+
+        $index = -1;
+        $payload['tools'] = [];
+        foreach ($v as $listValue) {
+            ++$index;
+            $payload['tools'][$index] = $listValue->requestBody();
+        }
+
+        if (null !== $v = $this->toolChoice) {
+            $payload['toolChoice'] = $v->requestBody();
+        }
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ToolInputSchema.php b/src/Service/BedrockRuntime/src/ValueObject/ToolInputSchema.php
new file mode 100644
index 000000000..8a2c3f910
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ToolInputSchema.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * The schema for the tool. The top level schema type must be `object`.
+ */
+final class ToolInputSchema
+{
+    /**
+     * The JSON schema for the tool. For more information, see JSON Schema Reference [^1].
+     *
+     * [^1]: https://json-schema.org/understanding-json-schema/reference
+     *
+     * @var Document|null
+     */
+    private $json;
+
+    /**
+     * @param array{
+     *   json?: null|Document|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->json = isset($input['json']) ? Document::create($input['json']) : null;
+    }
+
+    /**
+     * @param array{
+     *   json?: null|Document|array,
+     * }|ToolInputSchema $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getJson(): ?Document
+    {
+        return $this->json;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->json) {
+            $payload['json'] = $v->requestBody();
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ToolResultBlock.php b/src/Service/BedrockRuntime/src/ValueObject/ToolResultBlock.php
new file mode 100644
index 000000000..66093349d
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ToolResultBlock.php
@@ -0,0 +1,117 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\ToolResultStatus;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * A tool result block that contains the results for a tool request that the model previously made.
+ */
+final class ToolResultBlock
+{
+    /**
+     * The ID of the tool request that this is the result for.
+     *
+     * @var string
+     */
+    private $toolUseId;
+
+    /**
+     * The content for tool result content block.
+     *
+     * @var ToolResultContentBlock[]
+     */
+    private $content;
+
+    /**
+     * The status for the tool result content block.
+     *
+     * > This field is only supported Anthropic Claude 3 models.
+     *
+     * @var ToolResultStatus::*|null
+     */
+    private $status;
+
+    /**
+     * @param array{
+     *   toolUseId: string,
+     *   content: array<ToolResultContentBlock|array>,
+     *   status?: null|ToolResultStatus::*,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->toolUseId = $input['toolUseId'] ?? $this->throwException(new InvalidArgument('Missing required field "toolUseId".'));
+        $this->content = isset($input['content']) ? array_map([ToolResultContentBlock::class, 'create'], $input['content']) : $this->throwException(new InvalidArgument('Missing required field "content".'));
+        $this->status = $input['status'] ?? null;
+    }
+
+    /**
+     * @param array{
+     *   toolUseId: string,
+     *   content: array<ToolResultContentBlock|array>,
+     *   status?: null|ToolResultStatus::*,
+     * }|ToolResultBlock $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return ToolResultContentBlock[]
+     */
+    public function getContent(): array
+    {
+        return $this->content;
+    }
+
+    /**
+     * @return ToolResultStatus::*|null
+     */
+    public function getStatus(): ?string
+    {
+        return $this->status;
+    }
+
+    public function getToolUseId(): string
+    {
+        return $this->toolUseId;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->toolUseId;
+        $payload['toolUseId'] = $v;
+        $v = $this->content;
+
+        $index = -1;
+        $payload['content'] = [];
+        foreach ($v as $listValue) {
+            ++$index;
+            $payload['content'][$index] = $listValue->requestBody();
+        }
+
+        if (null !== $v = $this->status) {
+            if (!ToolResultStatus::exists($v)) {
+                throw new InvalidArgument(\sprintf('Invalid parameter "status" for "%s". The value "%s" is not a valid "ToolResultStatus".', __CLASS__, $v));
+            }
+            $payload['status'] = $v;
+        }
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ToolResultContentBlock.php b/src/Service/BedrockRuntime/src/ValueObject/ToolResultContentBlock.php
new file mode 100644
index 000000000..f8dd07e22
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ToolResultContentBlock.php
@@ -0,0 +1,128 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * The tool result content block.
+ */
+final class ToolResultContentBlock
+{
+    /**
+     * A tool result that is JSON format data.
+     *
+     * @var Document|null
+     */
+    private $json;
+
+    /**
+     * A tool result that is text.
+     *
+     * @var string|null
+     */
+    private $text;
+
+    /**
+     * A tool result that is an image.
+     *
+     * > This field is only supported by Anthropic Claude 3 models.
+     *
+     * @var ImageBlock|null
+     */
+    private $image;
+
+    /**
+     * A tool result that is a document.
+     *
+     * @var DocumentBlock|null
+     */
+    private $document;
+
+    /**
+     * A tool result that is video.
+     *
+     * @var VideoBlock|null
+     */
+    private $video;
+
+    /**
+     * @param array{
+     *   json?: null|Document|array,
+     *   text?: null|string,
+     *   image?: null|ImageBlock|array,
+     *   document?: null|DocumentBlock|array,
+     *   video?: null|VideoBlock|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->json = isset($input['json']) ? Document::create($input['json']) : null;
+        $this->text = $input['text'] ?? null;
+        $this->image = isset($input['image']) ? ImageBlock::create($input['image']) : null;
+        $this->document = isset($input['document']) ? DocumentBlock::create($input['document']) : null;
+        $this->video = isset($input['video']) ? VideoBlock::create($input['video']) : null;
+    }
+
+    /**
+     * @param array{
+     *   json?: null|Document|array,
+     *   text?: null|string,
+     *   image?: null|ImageBlock|array,
+     *   document?: null|DocumentBlock|array,
+     *   video?: null|VideoBlock|array,
+     * }|ToolResultContentBlock $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getDocument(): ?DocumentBlock
+    {
+        return $this->document;
+    }
+
+    public function getImage(): ?ImageBlock
+    {
+        return $this->image;
+    }
+
+    public function getJson(): ?Document
+    {
+        return $this->json;
+    }
+
+    public function getText(): ?string
+    {
+        return $this->text;
+    }
+
+    public function getVideo(): ?VideoBlock
+    {
+        return $this->video;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->json) {
+            $payload['json'] = $v->requestBody();
+        }
+        if (null !== $v = $this->text) {
+            $payload['text'] = $v;
+        }
+        if (null !== $v = $this->image) {
+            $payload['image'] = $v->requestBody();
+        }
+        if (null !== $v = $this->document) {
+            $payload['document'] = $v->requestBody();
+        }
+        if (null !== $v = $this->video) {
+            $payload['video'] = $v->requestBody();
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ToolSpecification.php b/src/Service/BedrockRuntime/src/ValueObject/ToolSpecification.php
new file mode 100644
index 000000000..fdf7bdfbb
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ToolSpecification.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * The specification for the tool.
+ */
+final class ToolSpecification
+{
+    /**
+     * The name for the tool.
+     *
+     * @var string
+     */
+    private $name;
+
+    /**
+     * The description for the tool.
+     *
+     * @var string|null
+     */
+    private $description;
+
+    /**
+     * The input schema for the tool in JSON format.
+     *
+     * @var ToolInputSchema
+     */
+    private $inputSchema;
+
+    /**
+     * @param array{
+     *   name: string,
+     *   description?: null|string,
+     *   inputSchema: ToolInputSchema|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->name = $input['name'] ?? $this->throwException(new InvalidArgument('Missing required field "name".'));
+        $this->description = $input['description'] ?? null;
+        $this->inputSchema = isset($input['inputSchema']) ? ToolInputSchema::create($input['inputSchema']) : $this->throwException(new InvalidArgument('Missing required field "inputSchema".'));
+    }
+
+    /**
+     * @param array{
+     *   name: string,
+     *   description?: null|string,
+     *   inputSchema: ToolInputSchema|array,
+     * }|ToolSpecification $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getDescription(): ?string
+    {
+        return $this->description;
+    }
+
+    public function getInputSchema(): ToolInputSchema
+    {
+        return $this->inputSchema;
+    }
+
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->name;
+        $payload['name'] = $v;
+        if (null !== $v = $this->description) {
+            $payload['description'] = $v;
+        }
+        $v = $this->inputSchema;
+        $payload['inputSchema'] = $v->requestBody();
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/ToolUseBlock.php b/src/Service/BedrockRuntime/src/ValueObject/ToolUseBlock.php
new file mode 100644
index 000000000..8b83a05f5
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/ToolUseBlock.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * A tool use content block. Contains information about a tool that the model is requesting be run., The model uses the
+ * result from the tool to generate a response.
+ */
+final class ToolUseBlock
+{
+    /**
+     * The ID for the tool request.
+     *
+     * @var string
+     */
+    private $toolUseId;
+
+    /**
+     * The name of the tool that the model wants to use.
+     *
+     * @var string
+     */
+    private $name;
+
+    /**
+     * The input to pass to the tool.
+     *
+     * @var Document
+     */
+    private $input;
+
+    /**
+     * @param array{
+     *   toolUseId: string,
+     *   name: string,
+     *   input: Document|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->toolUseId = $input['toolUseId'] ?? $this->throwException(new InvalidArgument('Missing required field "toolUseId".'));
+        $this->name = $input['name'] ?? $this->throwException(new InvalidArgument('Missing required field "name".'));
+        $this->input = isset($input['input']) ? Document::create($input['input']) : $this->throwException(new InvalidArgument('Missing required field "input".'));
+    }
+
+    /**
+     * @param array{
+     *   toolUseId: string,
+     *   name: string,
+     *   input: Document|array,
+     * }|ToolUseBlock $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getInput(): Document
+    {
+        return $this->input;
+    }
+
+    public function getName(): string
+    {
+        return $this->name;
+    }
+
+    public function getToolUseId(): string
+    {
+        return $this->toolUseId;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->toolUseId;
+        $payload['toolUseId'] = $v;
+        $v = $this->name;
+        $payload['name'] = $v;
+        $v = $this->input;
+        $payload['input'] = $v->requestBody();
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/VideoBlock.php b/src/Service/BedrockRuntime/src/ValueObject/VideoBlock.php
new file mode 100644
index 000000000..8012d5527
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/VideoBlock.php
@@ -0,0 +1,87 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+use AsyncAws\BedrockRuntime\Enum\VideoFormat;
+use AsyncAws\Core\Exception\InvalidArgument;
+
+/**
+ * A video block.
+ */
+final class VideoBlock
+{
+    /**
+     * The block's format.
+     *
+     * @var VideoFormat::*
+     */
+    private $format;
+
+    /**
+     * The block's source.
+     *
+     * @var VideoSource
+     */
+    private $source;
+
+    /**
+     * @param array{
+     *   format: VideoFormat::*,
+     *   source: VideoSource|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->format = $input['format'] ?? $this->throwException(new InvalidArgument('Missing required field "format".'));
+        $this->source = isset($input['source']) ? VideoSource::create($input['source']) : $this->throwException(new InvalidArgument('Missing required field "source".'));
+    }
+
+    /**
+     * @param array{
+     *   format: VideoFormat::*,
+     *   source: VideoSource|array,
+     * }|VideoBlock $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    /**
+     * @return VideoFormat::*
+     */
+    public function getFormat(): string
+    {
+        return $this->format;
+    }
+
+    public function getSource(): VideoSource
+    {
+        return $this->source;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        $v = $this->format;
+        if (!VideoFormat::exists($v)) {
+            throw new InvalidArgument(\sprintf('Invalid parameter "format" for "%s". The value "%s" is not a valid "VideoFormat".', __CLASS__, $v));
+        }
+        $payload['format'] = $v;
+        $v = $this->source;
+        $payload['source'] = $v->requestBody();
+
+        return $payload;
+    }
+
+    /**
+     * @return never
+     */
+    private function throwException(\Throwable $exception)
+    {
+        throw $exception;
+    }
+}
diff --git a/src/Service/BedrockRuntime/src/ValueObject/VideoSource.php b/src/Service/BedrockRuntime/src/ValueObject/VideoSource.php
new file mode 100644
index 000000000..8fc9632cf
--- /dev/null
+++ b/src/Service/BedrockRuntime/src/ValueObject/VideoSource.php
@@ -0,0 +1,73 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\ValueObject;
+
+/**
+ * A video source. You can upload a smaller video as a base64-encoded string as long as the encoded file is less than
+ * 25MB. You can also transfer videos up to 1GB in size from an S3 bucket.
+ */
+final class VideoSource
+{
+    /**
+     * Video content encoded in base64.
+     *
+     * @var string|null
+     */
+    private $bytes;
+
+    /**
+     * The location of a video object in an S3 bucket.
+     *
+     * @var S3Location|null
+     */
+    private $s3Location;
+
+    /**
+     * @param array{
+     *   bytes?: null|string,
+     *   s3Location?: null|S3Location|array,
+     * } $input
+     */
+    public function __construct(array $input)
+    {
+        $this->bytes = $input['bytes'] ?? null;
+        $this->s3Location = isset($input['s3Location']) ? S3Location::create($input['s3Location']) : null;
+    }
+
+    /**
+     * @param array{
+     *   bytes?: null|string,
+     *   s3Location?: null|S3Location|array,
+     * }|VideoSource $input
+     */
+    public static function create($input): self
+    {
+        return $input instanceof self ? $input : new self($input);
+    }
+
+    public function getBytes(): ?string
+    {
+        return $this->bytes;
+    }
+
+    public function getS3Location(): ?S3Location
+    {
+        return $this->s3Location;
+    }
+
+    /**
+     * @internal
+     */
+    public function requestBody(): array
+    {
+        $payload = [];
+        if (null !== $v = $this->bytes) {
+            $payload['bytes'] = base64_encode($v);
+        }
+        if (null !== $v = $this->s3Location) {
+            $payload['s3Location'] = $v->requestBody();
+        }
+
+        return $payload;
+    }
+}
diff --git a/src/Service/BedrockRuntime/tests/Integration/BedrockRuntimeClientTest.php b/src/Service/BedrockRuntime/tests/Integration/BedrockRuntimeClientTest.php
index 1588372f0..9c0a0622d 100644
--- a/src/Service/BedrockRuntime/tests/Integration/BedrockRuntimeClientTest.php
+++ b/src/Service/BedrockRuntime/tests/Integration/BedrockRuntimeClientTest.php
@@ -3,12 +3,208 @@
 namespace AsyncAws\BedrockRuntime\Tests\Integration;
 
 use AsyncAws\BedrockRuntime\BedrockRuntimeClient;
+use AsyncAws\BedrockRuntime\Input\ConverseRequest;
 use AsyncAws\BedrockRuntime\Input\InvokeModelRequest;
+use AsyncAws\BedrockRuntime\ValueObject\AnyToolChoice;
+use AsyncAws\BedrockRuntime\ValueObject\AutoToolChoice;
+use AsyncAws\BedrockRuntime\ValueObject\ContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\Document;
+use AsyncAws\BedrockRuntime\ValueObject\DocumentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\DocumentSource;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConverseContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConverseImageBlock;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConverseImageSource;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConverseTextBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ImageBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ImageSource;
+use AsyncAws\BedrockRuntime\ValueObject\InferenceConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\Message;
+use AsyncAws\BedrockRuntime\ValueObject\PerformanceConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\PromptVariableValues;
+use AsyncAws\BedrockRuntime\ValueObject\ReasoningContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ReasoningTextBlock;
+use AsyncAws\BedrockRuntime\ValueObject\S3Location;
+use AsyncAws\BedrockRuntime\ValueObject\SpecificToolChoice;
+use AsyncAws\BedrockRuntime\ValueObject\SystemContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\Tool;
+use AsyncAws\BedrockRuntime\ValueObject\ToolChoice;
+use AsyncAws\BedrockRuntime\ValueObject\ToolConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\ToolInputSchema;
+use AsyncAws\BedrockRuntime\ValueObject\ToolResultBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ToolResultContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ToolSpecification;
+use AsyncAws\BedrockRuntime\ValueObject\ToolUseBlock;
+use AsyncAws\BedrockRuntime\ValueObject\VideoBlock;
+use AsyncAws\BedrockRuntime\ValueObject\VideoSource;
 use AsyncAws\Core\Credentials\NullProvider;
 use AsyncAws\Core\Test\TestCase;
 
 class BedrockRuntimeClientTest extends TestCase
 {
+    public function testConverse(): void
+    {
+        $client = $this->getClient();
+
+        $input = new ConverseRequest([
+            'modelId' => 'change me',
+            'messages' => [new Message([
+                'role' => 'change me',
+                'content' => [new ContentBlock([
+                    'text' => 'change me',
+                    'image' => new ImageBlock([
+                        'format' => 'change me',
+                        'source' => new ImageSource([
+                            'bytes' => 'change me',
+                        ]),
+                    ]),
+                    'document' => new DocumentBlock([
+                        'format' => 'change me',
+                        'name' => 'change me',
+                        'source' => new DocumentSource([
+                            'bytes' => 'change me',
+                        ]),
+                    ]),
+                    'video' => new VideoBlock([
+                        'format' => 'change me',
+                        'source' => new VideoSource([
+                            'bytes' => 'change me',
+                            's3Location' => new S3Location([
+                                'uri' => 'change me',
+                                'bucketOwner' => 'change me',
+                            ]),
+                        ]),
+                    ]),
+                    'toolUse' => new ToolUseBlock([
+                        'toolUseId' => 'change me',
+                        'name' => 'change me',
+                        'input' => new Document([
+                        ]),
+                    ]),
+                    'toolResult' => new ToolResultBlock([
+                        'toolUseId' => 'change me',
+                        'content' => [new ToolResultContentBlock([
+                            'json' => new Document([
+                            ]),
+                            'text' => 'change me',
+                            'image' => new ImageBlock([
+                                'format' => 'change me',
+                                'source' => new ImageSource([
+                                    'bytes' => 'change me',
+                                ]),
+                            ]),
+                            'document' => new DocumentBlock([
+                                'format' => 'change me',
+                                'name' => 'change me',
+                                'source' => new DocumentSource([
+                                    'bytes' => 'change me',
+                                ]),
+                            ]),
+                            'video' => new VideoBlock([
+                                'format' => 'change me',
+                                'source' => new VideoSource([
+                                    'bytes' => 'change me',
+                                    's3Location' => new S3Location([
+                                        'uri' => 'change me',
+                                        'bucketOwner' => 'change me',
+                                    ]),
+                                ]),
+                            ]),
+                        ])],
+                        'status' => 'change me',
+                    ]),
+                    'guardContent' => new GuardrailConverseContentBlock([
+                        'text' => new GuardrailConverseTextBlock([
+                            'text' => 'change me',
+                            'qualifiers' => ['change me'],
+                        ]),
+                        'image' => new GuardrailConverseImageBlock([
+                            'format' => 'change me',
+                            'source' => new GuardrailConverseImageSource([
+                                'bytes' => 'change me',
+                            ]),
+                        ]),
+                    ]),
+                    'reasoningContent' => new ReasoningContentBlock([
+                        'reasoningText' => new ReasoningTextBlock([
+                            'text' => 'change me',
+                            'signature' => 'change me',
+                        ]),
+                        'redactedContent' => 'change me',
+                    ]),
+                ])],
+            ])],
+            'system' => [new SystemContentBlock([
+                'text' => 'change me',
+                'guardContent' => new GuardrailConverseContentBlock([
+                    'text' => new GuardrailConverseTextBlock([
+                        'text' => 'change me',
+                        'qualifiers' => ['change me'],
+                    ]),
+                    'image' => new GuardrailConverseImageBlock([
+                        'format' => 'change me',
+                        'source' => new GuardrailConverseImageSource([
+                            'bytes' => 'change me',
+                        ]),
+                    ]),
+                ]),
+            ])],
+            'inferenceConfig' => new InferenceConfiguration([
+                'maxTokens' => 1337,
+                'temperature' => 1337,
+                'topP' => 1337,
+                'stopSequences' => ['change me'],
+            ]),
+            'toolConfig' => new ToolConfiguration([
+                'tools' => [new Tool([
+                    'toolSpec' => new ToolSpecification([
+                        'name' => 'change me',
+                        'description' => 'change me',
+                        'inputSchema' => new ToolInputSchema([
+                            'json' => new Document([
+                            ]),
+                        ]),
+                    ]),
+                ])],
+                'toolChoice' => new ToolChoice([
+                    'auto' => new AutoToolChoice([
+                    ]),
+                    'any' => new AnyToolChoice([
+                    ]),
+                    'tool' => new SpecificToolChoice([
+                        'name' => 'change me',
+                    ]),
+                ]),
+            ]),
+            'guardrailConfig' => new GuardrailConfiguration([
+                'guardrailIdentifier' => 'change me',
+                'guardrailVersion' => 'change me',
+                'trace' => 'change me',
+            ]),
+            'additionalModelRequestFields' => new Document([
+            ]),
+            'promptVariables' => ['change me' => new PromptVariableValues([
+                'text' => 'change me',
+            ])],
+            'additionalModelResponseFieldPaths' => ['change me'],
+            'requestMetadata' => ['change me' => 'change me'],
+            'performanceConfig' => new PerformanceConfiguration([
+                'latency' => 'change me',
+            ]),
+        ]);
+        $result = $client->converse($input);
+
+        $result->resolve();
+
+        // self::assertTODO(expected, $result->getOutput());
+        self::assertSame('changeIt', $result->getStopReason());
+        // self::assertTODO(expected, $result->getUsage());
+        // self::assertTODO(expected, $result->getMetrics());
+        // self::assertTODO(expected, $result->getAdditionalModelResponseFields());
+        // self::assertTODO(expected, $result->getTrace());
+        // self::assertTODO(expected, $result->getPerformanceConfig());
+    }
+
     public function testInvokeModel(): void
     {
         $client = $this->getClient();
diff --git a/src/Service/BedrockRuntime/tests/Unit/BedrockRuntimeClientTest.php b/src/Service/BedrockRuntime/tests/Unit/BedrockRuntimeClientTest.php
index 546765a7c..990443576 100644
--- a/src/Service/BedrockRuntime/tests/Unit/BedrockRuntimeClientTest.php
+++ b/src/Service/BedrockRuntime/tests/Unit/BedrockRuntimeClientTest.php
@@ -3,7 +3,9 @@
 namespace AsyncAws\BedrockRuntime\Tests\Unit;
 
 use AsyncAws\BedrockRuntime\BedrockRuntimeClient;
+use AsyncAws\BedrockRuntime\Input\ConverseRequest;
 use AsyncAws\BedrockRuntime\Input\InvokeModelRequest;
+use AsyncAws\BedrockRuntime\Result\ConverseResponse;
 use AsyncAws\BedrockRuntime\Result\InvokeModelResponse;
 use AsyncAws\Core\Credentials\NullProvider;
 use AsyncAws\Core\Test\TestCase;
@@ -11,6 +13,19 @@
 
 class BedrockRuntimeClientTest extends TestCase
 {
+    public function testConverse(): void
+    {
+        $client = new BedrockRuntimeClient([], new NullProvider(), new MockHttpClient());
+
+        $input = new ConverseRequest([
+            'modelId' => 'change me',
+        ]);
+        $result = $client->converse($input);
+
+        self::assertInstanceOf(ConverseResponse::class, $result);
+        self::assertFalse($result->info()['resolved']);
+    }
+
     public function testInvokeModel(): void
     {
         $client = new BedrockRuntimeClient([], new NullProvider(), new MockHttpClient());
diff --git a/src/Service/BedrockRuntime/tests/Unit/Input/ConverseRequestTest.php b/src/Service/BedrockRuntime/tests/Unit/Input/ConverseRequestTest.php
new file mode 100644
index 000000000..d92453750
--- /dev/null
+++ b/src/Service/BedrockRuntime/tests/Unit/Input/ConverseRequestTest.php
@@ -0,0 +1,356 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Tests\Unit\Input;
+
+use AsyncAws\BedrockRuntime\Input\ConverseRequest;
+use AsyncAws\BedrockRuntime\ValueObject\AnyToolChoice;
+use AsyncAws\BedrockRuntime\ValueObject\AutoToolChoice;
+use AsyncAws\BedrockRuntime\ValueObject\ContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\Document;
+use AsyncAws\BedrockRuntime\ValueObject\DocumentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\DocumentSource;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConverseContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConverseImageBlock;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConverseImageSource;
+use AsyncAws\BedrockRuntime\ValueObject\GuardrailConverseTextBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ImageBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ImageSource;
+use AsyncAws\BedrockRuntime\ValueObject\InferenceConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\Message;
+use AsyncAws\BedrockRuntime\ValueObject\PerformanceConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\PromptVariableValues;
+use AsyncAws\BedrockRuntime\ValueObject\ReasoningContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ReasoningTextBlock;
+use AsyncAws\BedrockRuntime\ValueObject\S3Location;
+use AsyncAws\BedrockRuntime\ValueObject\SpecificToolChoice;
+use AsyncAws\BedrockRuntime\ValueObject\SystemContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\Tool;
+use AsyncAws\BedrockRuntime\ValueObject\ToolChoice;
+use AsyncAws\BedrockRuntime\ValueObject\ToolConfiguration;
+use AsyncAws\BedrockRuntime\ValueObject\ToolInputSchema;
+use AsyncAws\BedrockRuntime\ValueObject\ToolResultBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ToolResultContentBlock;
+use AsyncAws\BedrockRuntime\ValueObject\ToolSpecification;
+use AsyncAws\BedrockRuntime\ValueObject\ToolUseBlock;
+use AsyncAws\BedrockRuntime\ValueObject\VideoBlock;
+use AsyncAws\BedrockRuntime\ValueObject\VideoSource;
+use AsyncAws\Core\Test\TestCase;
+
+class ConverseRequestTest extends TestCase
+{
+    public function testRequest(): void
+    {
+        $input = new ConverseRequest([
+            'modelId' => 'us.anthropic.claude-3-7-sonnet-20250219-v1:0',
+            'messages' => [new Message([
+                'role' => 'user',
+                'content' => [new ContentBlock([
+                    'text' => 'change me',
+                    'image' => new ImageBlock([
+                        'format' => 'png',
+                        'source' => new ImageSource([
+                            'bytes' => 'change me',
+                        ]),
+                    ]),
+                    'document' => new DocumentBlock([
+                        'format' => 'pdf',
+                        'name' => 'change me',
+                        'source' => new DocumentSource([
+                            'bytes' => 'change me',
+                        ]),
+                    ]),
+                    'video' => new VideoBlock([
+                        'format' => 'mkv',
+                        'source' => new VideoSource([
+                            'bytes' => 'change me',
+                            's3Location' => new S3Location([
+                                'uri' => 'change me',
+                                'bucketOwner' => 'change me',
+                            ]),
+                        ]),
+                    ]),
+                    'toolUse' => new ToolUseBlock([
+                        'toolUseId' => 'change me',
+                        'name' => 'change me',
+                        'input' => new Document(),
+                    ]),
+                    'toolResult' => new ToolResultBlock([
+                        'toolUseId' => 'change me',
+                        'content' => [new ToolResultContentBlock([
+                            'json' => new Document(),
+                            'text' => 'change me',
+                            'image' => new ImageBlock([
+                                'format' => 'png',
+                                'source' => new ImageSource([
+                                    'bytes' => 'change me',
+                                ]),
+                            ]),
+                            'document' => new DocumentBlock([
+                                'format' => 'pdf',
+                                'name' => 'change me',
+                                'source' => new DocumentSource([
+                                    'bytes' => 'change me',
+                                ]),
+                            ]),
+                            'video' => new VideoBlock([
+                                'format' => 'mkv',
+                                'source' => new VideoSource([
+                                    'bytes' => 'change me',
+                                    's3Location' => new S3Location([
+                                        'uri' => 'change me',
+                                        'bucketOwner' => 'change me',
+                                    ]),
+                                ]),
+                            ]),
+                        ])],
+                        'status' => 'success',
+                    ]),
+                    'guardContent' => new GuardrailConverseContentBlock([
+                        'text' => new GuardrailConverseTextBlock([
+                            'text' => 'change me',
+                            'qualifiers' => ['grounding_source'],
+                        ]),
+                        'image' => new GuardrailConverseImageBlock([
+                            'format' => 'png',
+                            'source' => new GuardrailConverseImageSource([
+                                'bytes' => 'change me',
+                            ]),
+                        ]),
+                    ]),
+                    'reasoningContent' => new ReasoningContentBlock([
+                        'reasoningText' => new ReasoningTextBlock([
+                            'text' => 'change me',
+                            'signature' => 'change me',
+                        ]),
+                        'redactedContent' => 'change me',
+                    ]),
+                ])],
+            ])],
+            'system' => [new SystemContentBlock([
+                'text' => 'change me',
+                'guardContent' => new GuardrailConverseContentBlock([
+                    'text' => new GuardrailConverseTextBlock([
+                        'text' => 'change me',
+                        'qualifiers' => ['grounding_source'],
+                    ]),
+                    'image' => new GuardrailConverseImageBlock([
+                        'format' => 'png',
+                        'source' => new GuardrailConverseImageSource([
+                            'bytes' => 'change me',
+                        ]),
+                    ]),
+                ]),
+            ])],
+            'inferenceConfig' => new InferenceConfiguration([
+                'maxTokens' => 1337,
+                'temperature' => 1337,
+                'topP' => 1337,
+                'stopSequences' => ['change me'],
+            ]),
+            'toolConfig' => new ToolConfiguration([
+                'tools' => [new Tool([
+                    'toolSpec' => new ToolSpecification([
+                        'name' => 'change me',
+                        'description' => 'change me',
+                        'inputSchema' => new ToolInputSchema([
+                            'json' => new Document(),
+                        ]),
+                    ]),
+                ])],
+                'toolChoice' => new ToolChoice([
+                    'auto' => new AutoToolChoice(),
+                    'any' => new AnyToolChoice(),
+                    'tool' => new SpecificToolChoice([
+                        'name' => 'change me',
+                    ]),
+                ]),
+            ]),
+            'guardrailConfig' => new GuardrailConfiguration([
+                'guardrailIdentifier' => 'change me',
+                'guardrailVersion' => 'change me',
+                'trace' => 'enabled',
+            ]),
+            'additionalModelRequestFields' => new Document(),
+            'promptVariables' => ['change me' => new PromptVariableValues([
+                'text' => 'change me',
+            ])],
+            'additionalModelResponseFieldPaths' => ['change me'],
+            'requestMetadata' => ['change me' => 'change me'],
+            'performanceConfig' => new PerformanceConfiguration([
+                'latency' => 'standard',
+            ]),
+        ]);
+
+        // see https://docs.aws.amazon.com/bedrock/latest/APIReference/API_Converse.html
+        $expected = '
+            POST /model/us.anthropic.claude-3-7-sonnet-20250219-v1%3A0/converse HTTP/1.0
+            Content-Type: application/json
+            Accept: application/json
+
+            {
+   "messages":[
+      {
+         "role":"user",
+         "content":[
+            {
+               "text":"change me",
+               "image":{
+                  "format":"png",
+                  "source":{
+                     "bytes":"Y2hhbmdlIG1l"
+                  }
+               },
+               "document":{
+                  "format":"pdf",
+                  "name":"change me",
+                  "source":{
+                     "bytes":"Y2hhbmdlIG1l"
+                  }
+               },
+               "video":{
+                  "format":"mkv",
+                  "source":{
+                     "bytes":"Y2hhbmdlIG1l",
+                     "s3Location":{
+                        "uri":"change me",
+                        "bucketOwner":"change me"
+                     }
+                  }
+               },
+               "toolUse":{
+                  "toolUseId":"change me",
+                  "name":"change me",
+                  "input":[]
+               },
+               "toolResult":{
+                  "toolUseId":"change me",
+                  "content":[
+                     {
+                        "json":[],
+                        "text":"change me",
+                        "image":{
+                           "format":"png",
+                           "source":{
+                              "bytes":"Y2hhbmdlIG1l"
+                           }
+                        },
+                        "document":{
+                           "format":"pdf",
+                           "name":"change me",
+                           "source":{
+                              "bytes":"Y2hhbmdlIG1l"
+                           }
+                        },
+                        "video":{
+                           "format":"mkv",
+                           "source":{
+                              "bytes":"Y2hhbmdlIG1l",
+                              "s3Location":{
+                                 "uri":"change me",
+                                 "bucketOwner":"change me"
+                              }
+                           }
+                        }
+                     }
+                  ],
+                  "status":"success"
+               },
+               "guardContent":{
+                  "text":{
+                     "text":"change me",
+                     "qualifiers":[
+                        "grounding_source"
+                     ]
+                  },
+                  "image":{
+                     "format":"png",
+                     "source":{
+                        "bytes":"Y2hhbmdlIG1l"
+                     }
+                  }
+               },
+               "reasoningContent":{
+                  "reasoningText":{
+                     "text":"change me",
+                     "signature":"change me"
+                  },
+                  "redactedContent":"Y2hhbmdlIG1l"
+               }
+            }
+         ]
+      }
+   ],
+   "system":[
+      {
+         "text":"change me",
+         "guardContent":{
+            "text":{
+               "text":"change me",
+               "qualifiers":[
+                  "grounding_source"
+               ]
+            },
+            "image":{
+               "format":"png",
+               "source":{
+                  "bytes":"Y2hhbmdlIG1l"
+               }
+            }
+         }
+      }
+   ],
+   "inferenceConfig":{
+      "maxTokens":1337,
+      "temperature":1337,
+      "topP":1337,
+      "stopSequences":[
+         "change me"
+      ]
+   },
+   "toolConfig":{
+      "tools":[
+         {
+            "toolSpec":{
+               "name":"change me",
+               "description":"change me",
+               "inputSchema":{
+                  "json":[]
+               }
+            }
+         }
+      ],
+      "toolChoice":{
+         "auto":[],
+         "any":[],
+         "tool":{
+            "name":"change me"
+         }
+      }
+   },
+   "guardrailConfig":{
+      "guardrailIdentifier":"change me",
+      "guardrailVersion":"change me",
+      "trace":"enabled"
+   },
+   "additionalModelRequestFields":[],
+   "promptVariables":{
+      "change me":{
+         "text":"change me"
+      }
+   },
+   "additionalModelResponseFieldPaths":[
+      "change me"
+   ],
+   "requestMetadata":{
+      "change me":"change me"
+   },
+   "performanceConfig":{
+      "latency":"standard"
+   }
+}
+                ';
+
+        self::assertRequestEqualsHttpRequest($expected, $input->request());
+    }
+}
diff --git a/src/Service/BedrockRuntime/tests/Unit/Result/ConverseResponseTest.php b/src/Service/BedrockRuntime/tests/Unit/Result/ConverseResponseTest.php
new file mode 100644
index 000000000..ba66a7b66
--- /dev/null
+++ b/src/Service/BedrockRuntime/tests/Unit/Result/ConverseResponseTest.php
@@ -0,0 +1,310 @@
+<?php
+
+namespace AsyncAws\BedrockRuntime\Tests\Unit\Result;
+
+use AsyncAws\BedrockRuntime\Result\ConverseResponse;
+use AsyncAws\Core\Response;
+use AsyncAws\Core\Test\Http\SimpleMockedResponse;
+use AsyncAws\Core\Test\TestCase;
+use Psr\Log\NullLogger;
+use Symfony\Component\HttpClient\MockHttpClient;
+
+class ConverseResponseTest extends TestCase
+{
+    public function testConverseResponse(): void
+    {
+        // see https://docs.aws.amazon.com/bedrock/latest/APIReference/API_Converse.html
+        $response = new SimpleMockedResponse('{
+   "metrics":{
+      "latencyMs":100
+   },
+   "output":{
+      "message":{
+         "content":[
+            {
+               "role":"user",
+               "content":{
+                  "text":"Hello world!"
+               }
+            }
+         ]
+      }
+   },
+   "performanceConfig":{
+      "latency":"standard"
+   },
+   "stopReason":"end_turn",
+   "trace":{
+      "guardrail":{
+         "inputAssessment":{
+            "string":{
+               "contentPolicy":{
+                  "filters":[
+                     {
+                        "action":"string",
+                        "confidence":"string",
+                        "filterStrength":"string",
+                        "type":"string"
+                     }
+                  ]
+               },
+               "contextualGroundingPolicy":{
+                  "filters":[
+                     {
+                        "action":"string",
+                        "score":1,
+                        "threshold":1,
+                        "type":"string"
+                     }
+                  ]
+               },
+               "invocationMetrics":{
+                  "guardrailCoverage":{
+                     "images":{
+                        "guarded":1000,
+                        "total":1000
+                     },
+                     "textCharacters":{
+                        "guarded":1000,
+                        "total":1000
+                     }
+                  },
+                  "guardrailProcessingLatency":1000,
+                  "usage":{
+                     "contentPolicyUnits":1000,
+                     "contextualGroundingPolicyUnits":1000,
+                     "sensitiveInformationPolicyFreeUnits":1000,
+                     "sensitiveInformationPolicyUnits":1000,
+                     "topicPolicyUnits":1000,
+                     "wordPolicyUnits":1000
+                  }
+               },
+               "sensitiveInformationPolicy":{
+                  "piiEntities":[
+                     {
+                        "action":"string",
+                        "match":"string",
+                        "type":"string"
+                     }
+                  ],
+                  "regexes":[
+                     {
+                        "action":"string",
+                        "match":"string",
+                        "name":"string",
+                        "regex":"string"
+                     }
+                  ]
+               },
+               "topicPolicy":{
+                  "topics":[
+                     {
+                        "action":"string",
+                        "name":"string",
+                        "type":"string"
+                     }
+                  ]
+               },
+               "wordPolicy":{
+                  "customWords":[
+                     {
+                        "action":"string",
+                        "match":"string"
+                     }
+                  ],
+                  "managedWordLists":[
+                     {
+                        "action":"string",
+                        "match":"string",
+                        "type":"string"
+                     }
+                  ]
+               }
+            }
+         },
+         "modelOutput":[
+            "string"
+         ],
+         "outputAssessments":{
+            "string":[
+               {
+                  "contentPolicy":{
+                     "filters":[
+                        {
+                           "action":"string",
+                           "confidence":"string",
+                           "filterStrength":"string",
+                           "type":"string"
+                        }
+                     ]
+                  },
+                  "contextualGroundingPolicy":{
+                     "filters":[
+                        {
+                           "action":"string",
+                           "score":1000,
+                           "threshold":1000,
+                           "type":"string"
+                        }
+                     ]
+                  },
+                  "invocationMetrics":{
+                     "guardrailCoverage":{
+                        "images":{
+                           "guarded":1000,
+                           "total":1000
+                        },
+                        "textCharacters":{
+                           "guarded":1000,
+                           "total":1000
+                        }
+                     },
+                     "guardrailProcessingLatency":1000,
+                     "usage":{
+                        "contentPolicyUnits":1000,
+                        "contextualGroundingPolicyUnits":1000,
+                        "sensitiveInformationPolicyFreeUnits":1000,
+                        "sensitiveInformationPolicyUnits":1000,
+                        "topicPolicyUnits":1000,
+                        "wordPolicyUnits":1000
+                     }
+                  },
+                  "sensitiveInformationPolicy":{
+                     "piiEntities":[
+                        {
+                           "action":"string",
+                           "match":"string",
+                           "type":"string"
+                        }
+                     ],
+                     "regexes":[
+                        {
+                           "action":"string",
+                           "match":"string",
+                           "name":"string",
+                           "regex":"string"
+                        }
+                     ]
+                  },
+                  "topicPolicy":{
+                     "topics":[
+                        {
+                           "action":"string",
+                           "name":"string",
+                           "type":"string"
+                        }
+                     ]
+                  },
+                  "wordPolicy":{
+                     "customWords":[
+                        {
+                           "action":"string",
+                           "match":"string"
+                        }
+                     ],
+                     "managedWordLists":[
+                        {
+                           "action":"string",
+                           "match":"string",
+                           "type":"string"
+                        }
+                     ]
+                  }
+               }
+            ]
+         }
+      },
+      "promptRouter":{
+         "invokedModelId":"string"
+      }
+   },
+   "usage":{
+      "inputTokens":1000,
+      "outputTokens":2000,
+      "totalTokens":3000
+   }
+}');
+
+        $client = new MockHttpClient($response);
+        $result = new ConverseResponse(new Response($client->request('POST', 'http://localhost'), $client, new NullLogger()));
+
+        self::assertSame(100, $result->getMetrics()->getLatencyMs());
+        self::assertSame('user', $result->getOutput()->getMessage()->getRole());
+        self::assertSame('Hello world!', $result->getOutput()->getMessage()->getContent()[0]->getText());
+        self::assertSame('end_turn', $result->getStopReason());
+        self::assertSame('standard', $result->getPerformanceConfig()->getLatency());
+        self::assertSame(1000, $result->getUsage()->getInputTokens());
+        self::assertSame(2000, $result->getUsage()->getOutputTokens());
+        self::assertSame(3000, $result->getUsage()->getTotalTokens());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getContentPolicy()->getFilters()[0]->getAction());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getContentPolicy()->getFilters()[0]->getConfidence());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getContentPolicy()->getFilters()[0]->getFilterStrength());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getContentPolicy()->getFilters()[0]->getType());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getContextualGroundingPolicy()->getFilters()[0]->getAction());
+        self::assertSame(1, $result->getTrace()->getGuardrail()->getInputAssessment()['number']->getContextualGroundingPolicy()->getFilters()[0]->getScore());
+        self::assertSame(1, $result->getTrace()->getGuardrail()->getInputAssessment()['number']->getContextualGroundingPolicy()->getFilters()[0]->getThreshold());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getContextualGroundingPolicy()->getFilters()[0]->getType());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getInvocationMetrics()->getGuardrailCoverage()->getImages()->getGuarded());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getInvocationMetrics()->getGuardrailCoverage()->getImages()->getTotal());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getInvocationMetrics()->getGuardrailCoverage()->getTextCharacters()->getGuarded());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getInvocationMetrics()->getGuardrailCoverage()->getTextCharacters()->getTotal());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getInvocationMetrics()->getGuardrailProcessingLatency());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getInvocationMetrics()->getUsage()->getContentPolicyUnits());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getInvocationMetrics()->getUsage()->getContextualGroundingPolicyUnits());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getInvocationMetrics()->getUsage()->getSensitiveInformationPolicyFreeUnits());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getInvocationMetrics()->getUsage()->getSensitiveInformationPolicyUnits());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getInvocationMetrics()->getUsage()->getTopicPolicyUnits());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getInvocationMetrics()->getUsage()->getWordPolicyUnits());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getSensitiveInformationPolicy()->getPiiEntities()[0]->getAction());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getSensitiveInformationPolicy()->getPiiEntities()[0]->getMatch());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getSensitiveInformationPolicy()->getPiiEntities()[0]->getType());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getSensitiveInformationPolicy()->getRegexes()[0]->getAction());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getSensitiveInformationPolicy()->getRegexes()[0]->getMatch());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getSensitiveInformationPolicy()->getRegexes()[0]->getName());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getSensitiveInformationPolicy()->getRegexes()[0]->getRegex());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getTopicPolicy()->getTopics()[0]->getAction());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getTopicPolicy()->getTopics()[0]->getName());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getTopicPolicy()->getTopics()[0]->getType());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getWordPolicy()->getCustomWords()[0]->getAction());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getWordPolicy()->getCustomWords()[0]->getMatch());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getWordPolicy()->getManagedWordLists()[0]->getAction());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getWordPolicy()->getManagedWordLists()[0]->getMatch());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getInputAssessment()['string']->getWordPolicy()->getManagedWordLists()[0]->getType());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getModelOutput()[0]);
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getContentPolicy()->getFilters()[0]->getAction());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getContentPolicy()->getFilters()[0]->getConfidence());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getContentPolicy()->getFilters()[0]->getFilterStrength());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getContentPolicy()->getFilters()[0]->getType());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getContextualGroundingPolicy()->getFilters()[0]->getAction());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getContextualGroundingPolicy()->getFilters()[0]->getScore());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getContextualGroundingPolicy()->getFilters()[0]->getThreshold());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getContextualGroundingPolicy()->getFilters()[0]->getType());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getInvocationMetrics()->getGuardrailCoverage()->getImages()->getGuarded());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getInvocationMetrics()->getGuardrailCoverage()->getImages()->getTotal());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getInvocationMetrics()->getGuardrailCoverage()->getTextCharacters()->getGuarded());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getInvocationMetrics()->getGuardrailCoverage()->getTextCharacters()->getTotal());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getInvocationMetrics()->getGuardrailProcessingLatency());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getInvocationMetrics()->getUsage()->getContentPolicyUnits());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getInvocationMetrics()->getUsage()->getContextualGroundingPolicyUnits());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getInvocationMetrics()->getUsage()->getSensitiveInformationPolicyFreeUnits());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getInvocationMetrics()->getUsage()->getSensitiveInformationPolicyUnits());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getInvocationMetrics()->getUsage()->getTopicPolicyUnits());
+        self::assertSame(1000, $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getInvocationMetrics()->getUsage()->getWordPolicyUnits());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getSensitiveInformationPolicy()->getPiiEntities()[0]->getAction());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getSensitiveInformationPolicy()->getPiiEntities()[0]->getMatch());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getSensitiveInformationPolicy()->getPiiEntities()[0]->getType());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getSensitiveInformationPolicy()->getRegexes()[0]->getAction());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getSensitiveInformationPolicy()->getRegexes()[0]->getMatch());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getSensitiveInformationPolicy()->getRegexes()[0]->getName());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getSensitiveInformationPolicy()->getRegexes()[0]->getRegex());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getTopicPolicy()->getTopics()[0]->getAction());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getTopicPolicy()->getTopics()[0]->getName());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getTopicPolicy()->getTopics()[0]->getType());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getWordPolicy()->getCustomWords()[0]->getAction());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getWordPolicy()->getCustomWords()[0]->getMatch());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getWordPolicy()->getManagedWordLists()[0]->getAction());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getWordPolicy()->getManagedWordLists()[0]->getMatch());
+        self::assertSame('string', $result->getTrace()->getGuardrail()->getOutputAssessments()['string'][0]->getWordPolicy()->getManagedWordLists()[0]->getType());
+        self::assertSame('string', $result->getTrace()->getPromptRouter()->getInvokedModelId());
+    }
+}