diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,367 @@
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+    means each individual or legal entity that creates, contributes to
+    the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+    means the combination of the Contributions of others (if any) used
+    by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+    means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+    means Source Code Form to which the initial Contributor has attached
+    the notice in Exhibit A, the Executable Form of such Source Code
+    Form, and Modifications of such Source Code Form, in each case
+    including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+    means
+
+    (a) that the initial Contributor has attached the notice described
+        in Exhibit B to the Covered Software; or
+
+    (b) that the Covered Software was made available under the terms of
+        version 1.1 or earlier of the License, but not also under the
+        terms of a Secondary License.
+
+1.6. "Executable Form"
+    means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+    means a work that combines Covered Software with other material, in
+    a separate file or files, that is not Covered Software.
+
+1.8. "License"
+    means this document.
+
+1.9. "Licensable"
+    means having the right to grant, to the maximum extent possible,
+    whether at the time of the initial grant or subsequently, any and
+    all of the rights conveyed by this License.
+
+1.10. "Modifications"
+    means any of the following:
+
+    (a) any file in Source Code Form that results from an addition to,
+        deletion from, or modification of the contents of Covered
+        Software; or
+
+    (b) any new file in Source Code Form that contains any Covered
+        Software.
+
+1.11. "Patent Claims" of a Contributor
+    means any patent claim(s), including without limitation, method,
+    process, and apparatus claims, in any patent Licensable by such
+    Contributor that would be infringed, but for the grant of the
+    License, by the making, using, selling, offering for sale, having
+    made, import, or transfer of either its Contributions or its
+    Contributor Version.
+
+1.12. "Secondary License"
+    means either the GNU General Public License, Version 2.0, the GNU
+    Lesser General Public License, Version 2.1, the GNU Affero General
+    Public License, Version 3.0, or any later versions of those
+    licenses.
+
+1.13. "Source Code Form"
+    means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+    means an individual or a legal entity exercising rights under this
+    License. For legal entities, "You" includes any entity that
+    controls, is controlled by, or is under common control with You. For
+    purposes of this definition, "control" means (a) the power, direct
+    or indirect, to cause the direction or management of such entity,
+    whether by contract or otherwise, or (b) ownership of more than
+    fifty percent (50%) of the outstanding shares or beneficial
+    ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+    Licensable by such Contributor to use, reproduce, make available,
+    modify, display, perform, distribute, and otherwise exploit its
+    Contributions, either on an unmodified basis, with Modifications, or
+    as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+    for sale, have made, import, and otherwise transfer either its
+    Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+    or
+
+(b) for infringements caused by: (i) Your and any other third party's
+    modifications of Covered Software, or (ii) the combination of its
+    Contributions with other software (except as part of its Contributor
+    Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+    its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+    Form, as described in Section 3.1, and You must inform recipients of
+    the Executable Form how they can obtain a copy of such Source Code
+    Form by reasonable means in a timely manner, at a charge no more
+    than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+    License, or sublicense it under different terms, provided that the
+    license for the Executable Form does not attempt to limit or alter
+    the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+*                                                                      *
+*  6. Disclaimer of Warranty                                           *
+*  -------------------------                                           *
+*                                                                      *
+*  Covered Software is provided under this License on an "as is"       *
+*  basis, without warranty of any kind, either expressed, implied, or  *
+*  statutory, including, without limitation, warranties that the       *
+*  Covered Software is free of defects, merchantable, fit for a        *
+*  particular purpose or non-infringing. The entire risk as to the     *
+*  quality and performance of the Covered Software is with You.        *
+*  Should any Covered Software prove defective in any respect, You     *
+*  (not any Contributor) assume the cost of any necessary servicing,   *
+*  repair, or correction. This disclaimer of warranty constitutes an   *
+*  essential part of this License. No use of any Covered Software is   *
+*  authorized under this License except under this disclaimer.         *
+*                                                                      *
+************************************************************************
+
+************************************************************************
+*                                                                      *
+*  7. Limitation of Liability                                          *
+*  --------------------------                                          *
+*                                                                      *
+*  Under no circumstances and under no legal theory, whether tort      *
+*  (including negligence), contract, or otherwise, shall any           *
+*  Contributor, or anyone who distributes Covered Software as          *
+*  permitted above, be liable to You for any direct, indirect,         *
+*  special, incidental, or consequential damages of any character      *
+*  including, without limitation, damages for lost profits, loss of    *
+*  goodwill, work stoppage, computer failure or malfunction, or any    *
+*  and all other commercial damages or losses, even if such party      *
+*  shall have been informed of the possibility of such damages. This   *
+*  limitation of liability shall not apply to liability for death or   *
+*  personal injury resulting from such party's negligence to the       *
+*  extent applicable law prohibits such limitation. Some               *
+*  jurisdictions do not allow the exclusion or limitation of           *
+*  incidental or consequential damages, so this exclusion and          *
+*  limitation may not apply to You.                                    *
+*                                                                      *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+  This Source Code Form is subject to the terms of the Mozilla Public
+  License, v. 2.0. If a copy of the MPL was not distributed with this
+  file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,44 @@
+# Amazon Personalize SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2018-05-22@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-personalize)
+and the [AWS API Reference](https://aws.amazon.com/documentation/).
+
+The types from this library are intended to be used with [amazonka](http://hackage.haskell.org/package/amazonka),
+which provides mechanisms for specifying AuthN/AuthZ information, sending requests,
+and receiving responses.
+
+Lenses are used for constructing and manipulating types,
+due to the depth of nesting of AWS types and transparency regarding
+de/serialisation into more palatable Haskell values.
+The provided lenses should be compatible with any of the major lens libraries
+[lens](http://hackage.haskell.org/package/lens) or [lens-family-core](http://hackage.haskell.org/package/lens-family-core).
+
+See [Amazonka.Personalize](http://hackage.haskell.org/package/amazonka-personalize/docs/Amazonka-Personalize.html)
+or [the AWS documentation](https://aws.amazon.com/documentation/) to get started.
+
+
+## Contribute
+
+For any problems, comments, or feedback please create an issue [here on GitHub](https://github.com/brendanhay/amazonka/issues).
+
+> _Note:_ this library is an auto-generated Haskell package. Please see `amazonka-gen` for more information.
+
+
+## Licence
+
+`amazonka-personalize` is released under the [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/).
+
+Parts of the code are derived from AWS service descriptions, licensed under Apache 2.0.
+Source files subject to this contain an additional licensing clause in their header.
diff --git a/amazonka-personalize.cabal b/amazonka-personalize.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-personalize.cabal
@@ -0,0 +1,219 @@
+cabal-version:      2.2
+name:               amazonka-personalize
+version:            2.0
+synopsis:           Amazon Personalize SDK.
+homepage:           https://github.com/brendanhay/amazonka
+bug-reports:        https://github.com/brendanhay/amazonka/issues
+license:            MPL-2.0
+license-file:       LICENSE
+author:             Brendan Hay
+maintainer:
+  Brendan Hay <brendan.g.hay+amazonka@gmail.com>, Jack Kelly <jack@jackkelly.name>
+
+copyright:          Copyright (c) 2013-2023 Brendan Hay
+category:           AWS
+build-type:         Simple
+extra-source-files:
+  fixture/*.proto
+  fixture/*.yaml
+  README.md
+  src/.gitkeep
+
+description:
+  Derived from API version @2018-05-22@ of the AWS service descriptions, licensed under Apache 2.0.
+  .
+  The types from this library are intended to be used with <http://hackage.haskell.org/package/amazonka amazonka>,
+  which provides mechanisms for specifying AuthN/AuthZ information, sending requests, and receiving responses.
+  .
+  It is recommended to use generic lenses or optics from packages such as <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify optional fields and deconstruct responses.
+  .
+  Generated lenses can be found in "Amazonka.Personalize.Lens" and are
+  suitable for use with a lens package such as <http://hackage.haskell.org/package/lens lens> or <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
+  .
+  See "Amazonka.Personalize" and the <https://aws.amazon.com/documentation/ AWS documentation> to get started.
+
+source-repository head
+  type:     git
+  location: git://github.com/brendanhay/amazonka.git
+  subdir:   amazonka-personalize
+
+library
+  default-language: Haskell2010
+  hs-source-dirs:   src gen
+  ghc-options:
+    -Wall -fwarn-incomplete-uni-patterns
+    -fwarn-incomplete-record-updates -funbox-strict-fields
+
+  exposed-modules:
+    Amazonka.Personalize
+    Amazonka.Personalize.CreateBatchInferenceJob
+    Amazonka.Personalize.CreateBatchSegmentJob
+    Amazonka.Personalize.CreateCampaign
+    Amazonka.Personalize.CreateDataset
+    Amazonka.Personalize.CreateDatasetExportJob
+    Amazonka.Personalize.CreateDatasetGroup
+    Amazonka.Personalize.CreateDatasetImportJob
+    Amazonka.Personalize.CreateEventTracker
+    Amazonka.Personalize.CreateFilter
+    Amazonka.Personalize.CreateMetricAttribution
+    Amazonka.Personalize.CreateRecommender
+    Amazonka.Personalize.CreateSchema
+    Amazonka.Personalize.CreateSolution
+    Amazonka.Personalize.CreateSolutionVersion
+    Amazonka.Personalize.DeleteCampaign
+    Amazonka.Personalize.DeleteDataset
+    Amazonka.Personalize.DeleteDatasetGroup
+    Amazonka.Personalize.DeleteEventTracker
+    Amazonka.Personalize.DeleteFilter
+    Amazonka.Personalize.DeleteMetricAttribution
+    Amazonka.Personalize.DeleteRecommender
+    Amazonka.Personalize.DeleteSchema
+    Amazonka.Personalize.DeleteSolution
+    Amazonka.Personalize.DescribeAlgorithm
+    Amazonka.Personalize.DescribeBatchInferenceJob
+    Amazonka.Personalize.DescribeBatchSegmentJob
+    Amazonka.Personalize.DescribeCampaign
+    Amazonka.Personalize.DescribeDataset
+    Amazonka.Personalize.DescribeDatasetExportJob
+    Amazonka.Personalize.DescribeDatasetGroup
+    Amazonka.Personalize.DescribeDatasetImportJob
+    Amazonka.Personalize.DescribeEventTracker
+    Amazonka.Personalize.DescribeFeatureTransformation
+    Amazonka.Personalize.DescribeFilter
+    Amazonka.Personalize.DescribeMetricAttribution
+    Amazonka.Personalize.DescribeRecipe
+    Amazonka.Personalize.DescribeRecommender
+    Amazonka.Personalize.DescribeSchema
+    Amazonka.Personalize.DescribeSolution
+    Amazonka.Personalize.DescribeSolutionVersion
+    Amazonka.Personalize.GetSolutionMetrics
+    Amazonka.Personalize.Lens
+    Amazonka.Personalize.ListBatchInferenceJobs
+    Amazonka.Personalize.ListBatchSegmentJobs
+    Amazonka.Personalize.ListCampaigns
+    Amazonka.Personalize.ListDatasetExportJobs
+    Amazonka.Personalize.ListDatasetGroups
+    Amazonka.Personalize.ListDatasetImportJobs
+    Amazonka.Personalize.ListDatasets
+    Amazonka.Personalize.ListEventTrackers
+    Amazonka.Personalize.ListFilters
+    Amazonka.Personalize.ListMetricAttributionMetrics
+    Amazonka.Personalize.ListMetricAttributions
+    Amazonka.Personalize.ListRecipes
+    Amazonka.Personalize.ListRecommenders
+    Amazonka.Personalize.ListSchemas
+    Amazonka.Personalize.ListSolutions
+    Amazonka.Personalize.ListSolutionVersions
+    Amazonka.Personalize.ListTagsForResource
+    Amazonka.Personalize.StartRecommender
+    Amazonka.Personalize.StopRecommender
+    Amazonka.Personalize.StopSolutionVersionCreation
+    Amazonka.Personalize.TagResource
+    Amazonka.Personalize.Types
+    Amazonka.Personalize.Types.Algorithm
+    Amazonka.Personalize.Types.AlgorithmImage
+    Amazonka.Personalize.Types.AutoMLConfig
+    Amazonka.Personalize.Types.AutoMLResult
+    Amazonka.Personalize.Types.BatchInferenceJob
+    Amazonka.Personalize.Types.BatchInferenceJobConfig
+    Amazonka.Personalize.Types.BatchInferenceJobInput
+    Amazonka.Personalize.Types.BatchInferenceJobOutput
+    Amazonka.Personalize.Types.BatchInferenceJobSummary
+    Amazonka.Personalize.Types.BatchSegmentJob
+    Amazonka.Personalize.Types.BatchSegmentJobInput
+    Amazonka.Personalize.Types.BatchSegmentJobOutput
+    Amazonka.Personalize.Types.BatchSegmentJobSummary
+    Amazonka.Personalize.Types.Campaign
+    Amazonka.Personalize.Types.CampaignConfig
+    Amazonka.Personalize.Types.CampaignSummary
+    Amazonka.Personalize.Types.CampaignUpdateSummary
+    Amazonka.Personalize.Types.CategoricalHyperParameterRange
+    Amazonka.Personalize.Types.ContinuousHyperParameterRange
+    Amazonka.Personalize.Types.Dataset
+    Amazonka.Personalize.Types.DatasetExportJob
+    Amazonka.Personalize.Types.DatasetExportJobOutput
+    Amazonka.Personalize.Types.DatasetExportJobSummary
+    Amazonka.Personalize.Types.DatasetGroup
+    Amazonka.Personalize.Types.DatasetGroupSummary
+    Amazonka.Personalize.Types.DatasetImportJob
+    Amazonka.Personalize.Types.DatasetImportJobSummary
+    Amazonka.Personalize.Types.DatasetSchema
+    Amazonka.Personalize.Types.DatasetSchemaSummary
+    Amazonka.Personalize.Types.DatasetSummary
+    Amazonka.Personalize.Types.DataSource
+    Amazonka.Personalize.Types.DefaultCategoricalHyperParameterRange
+    Amazonka.Personalize.Types.DefaultContinuousHyperParameterRange
+    Amazonka.Personalize.Types.DefaultHyperParameterRanges
+    Amazonka.Personalize.Types.DefaultIntegerHyperParameterRange
+    Amazonka.Personalize.Types.Domain
+    Amazonka.Personalize.Types.EventTracker
+    Amazonka.Personalize.Types.EventTrackerSummary
+    Amazonka.Personalize.Types.FeatureTransformation
+    Amazonka.Personalize.Types.Filter
+    Amazonka.Personalize.Types.FilterSummary
+    Amazonka.Personalize.Types.HPOConfig
+    Amazonka.Personalize.Types.HPOObjective
+    Amazonka.Personalize.Types.HPOResourceConfig
+    Amazonka.Personalize.Types.HyperParameterRanges
+    Amazonka.Personalize.Types.ImportMode
+    Amazonka.Personalize.Types.IngestionMode
+    Amazonka.Personalize.Types.IntegerHyperParameterRange
+    Amazonka.Personalize.Types.MetricAttribute
+    Amazonka.Personalize.Types.MetricAttribution
+    Amazonka.Personalize.Types.MetricAttributionOutput
+    Amazonka.Personalize.Types.MetricAttributionSummary
+    Amazonka.Personalize.Types.ObjectiveSensitivity
+    Amazonka.Personalize.Types.OptimizationObjective
+    Amazonka.Personalize.Types.Recipe
+    Amazonka.Personalize.Types.RecipeProvider
+    Amazonka.Personalize.Types.RecipeSummary
+    Amazonka.Personalize.Types.Recommender
+    Amazonka.Personalize.Types.RecommenderConfig
+    Amazonka.Personalize.Types.RecommenderSummary
+    Amazonka.Personalize.Types.RecommenderUpdateSummary
+    Amazonka.Personalize.Types.S3DataConfig
+    Amazonka.Personalize.Types.Solution
+    Amazonka.Personalize.Types.SolutionConfig
+    Amazonka.Personalize.Types.SolutionSummary
+    Amazonka.Personalize.Types.SolutionVersion
+    Amazonka.Personalize.Types.SolutionVersionSummary
+    Amazonka.Personalize.Types.Tag
+    Amazonka.Personalize.Types.TrainingMode
+    Amazonka.Personalize.Types.TunedHPOParams
+    Amazonka.Personalize.UntagResource
+    Amazonka.Personalize.UpdateCampaign
+    Amazonka.Personalize.UpdateMetricAttribution
+    Amazonka.Personalize.UpdateRecommender
+    Amazonka.Personalize.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-personalize-test
+  type:             exitcode-stdio-1.0
+  default-language: Haskell2010
+  hs-source-dirs:   test
+  main-is:          Main.hs
+  ghc-options:      -Wall -threaded
+
+  -- This section is encoded by the template and any modules added by
+  -- hand outside these namespaces will not correctly be added to the
+  -- distribution package.
+  other-modules:
+    Test.Amazonka.Gen.Personalize
+    Test.Amazonka.Personalize
+    Test.Amazonka.Personalize.Internal
+
+  build-depends:
+    , amazonka-core         >=2.0 && <2.1
+    , amazonka-personalize
+    , amazonka-test         >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
diff --git a/fixture/CreateBatchInferenceJob.yaml b/fixture/CreateBatchInferenceJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateBatchInferenceJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateBatchInferenceJobResponse.proto b/fixture/CreateBatchInferenceJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateBatchInferenceJobResponse.proto
diff --git a/fixture/CreateBatchSegmentJob.yaml b/fixture/CreateBatchSegmentJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateBatchSegmentJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateBatchSegmentJobResponse.proto b/fixture/CreateBatchSegmentJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateBatchSegmentJobResponse.proto
diff --git a/fixture/CreateCampaign.yaml b/fixture/CreateCampaign.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateCampaign.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateCampaignResponse.proto b/fixture/CreateCampaignResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateCampaignResponse.proto
diff --git a/fixture/CreateDataset.yaml b/fixture/CreateDataset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDataset.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateDatasetExportJob.yaml b/fixture/CreateDatasetExportJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDatasetExportJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateDatasetExportJobResponse.proto b/fixture/CreateDatasetExportJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDatasetExportJobResponse.proto
diff --git a/fixture/CreateDatasetGroup.yaml b/fixture/CreateDatasetGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDatasetGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateDatasetGroupResponse.proto b/fixture/CreateDatasetGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDatasetGroupResponse.proto
diff --git a/fixture/CreateDatasetImportJob.yaml b/fixture/CreateDatasetImportJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDatasetImportJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateDatasetImportJobResponse.proto b/fixture/CreateDatasetImportJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDatasetImportJobResponse.proto
diff --git a/fixture/CreateDatasetResponse.proto b/fixture/CreateDatasetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDatasetResponse.proto
diff --git a/fixture/CreateEventTracker.yaml b/fixture/CreateEventTracker.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateEventTracker.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateEventTrackerResponse.proto b/fixture/CreateEventTrackerResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateEventTrackerResponse.proto
diff --git a/fixture/CreateFilter.yaml b/fixture/CreateFilter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateFilter.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateFilterResponse.proto b/fixture/CreateFilterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateFilterResponse.proto
diff --git a/fixture/CreateMetricAttribution.yaml b/fixture/CreateMetricAttribution.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateMetricAttribution.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateMetricAttributionResponse.proto b/fixture/CreateMetricAttributionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateMetricAttributionResponse.proto
diff --git a/fixture/CreateRecommender.yaml b/fixture/CreateRecommender.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateRecommender.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateRecommenderResponse.proto b/fixture/CreateRecommenderResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateRecommenderResponse.proto
diff --git a/fixture/CreateSchema.yaml b/fixture/CreateSchema.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSchema.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateSchemaResponse.proto b/fixture/CreateSchemaResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSchemaResponse.proto
diff --git a/fixture/CreateSolution.yaml b/fixture/CreateSolution.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSolution.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateSolutionResponse.proto b/fixture/CreateSolutionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSolutionResponse.proto
diff --git a/fixture/CreateSolutionVersion.yaml b/fixture/CreateSolutionVersion.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSolutionVersion.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/CreateSolutionVersionResponse.proto b/fixture/CreateSolutionVersionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateSolutionVersionResponse.proto
diff --git a/fixture/DeleteCampaign.yaml b/fixture/DeleteCampaign.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteCampaign.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteCampaignResponse.proto b/fixture/DeleteCampaignResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteCampaignResponse.proto
diff --git a/fixture/DeleteDataset.yaml b/fixture/DeleteDataset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDataset.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteDatasetGroup.yaml b/fixture/DeleteDatasetGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDatasetGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteDatasetGroupResponse.proto b/fixture/DeleteDatasetGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDatasetGroupResponse.proto
diff --git a/fixture/DeleteDatasetResponse.proto b/fixture/DeleteDatasetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDatasetResponse.proto
diff --git a/fixture/DeleteEventTracker.yaml b/fixture/DeleteEventTracker.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteEventTracker.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteEventTrackerResponse.proto b/fixture/DeleteEventTrackerResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteEventTrackerResponse.proto
diff --git a/fixture/DeleteFilter.yaml b/fixture/DeleteFilter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteFilter.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteFilterResponse.proto b/fixture/DeleteFilterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteFilterResponse.proto
diff --git a/fixture/DeleteMetricAttribution.yaml b/fixture/DeleteMetricAttribution.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteMetricAttribution.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteMetricAttributionResponse.proto b/fixture/DeleteMetricAttributionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteMetricAttributionResponse.proto
diff --git a/fixture/DeleteRecommender.yaml b/fixture/DeleteRecommender.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRecommender.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteRecommenderResponse.proto b/fixture/DeleteRecommenderResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteRecommenderResponse.proto
diff --git a/fixture/DeleteSchema.yaml b/fixture/DeleteSchema.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSchema.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteSchemaResponse.proto b/fixture/DeleteSchemaResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSchemaResponse.proto
diff --git a/fixture/DeleteSolution.yaml b/fixture/DeleteSolution.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSolution.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DeleteSolutionResponse.proto b/fixture/DeleteSolutionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteSolutionResponse.proto
diff --git a/fixture/DescribeAlgorithm.yaml b/fixture/DescribeAlgorithm.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAlgorithm.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeAlgorithmResponse.proto b/fixture/DescribeAlgorithmResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeAlgorithmResponse.proto
diff --git a/fixture/DescribeBatchInferenceJob.yaml b/fixture/DescribeBatchInferenceJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeBatchInferenceJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeBatchInferenceJobResponse.proto b/fixture/DescribeBatchInferenceJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeBatchInferenceJobResponse.proto
diff --git a/fixture/DescribeBatchSegmentJob.yaml b/fixture/DescribeBatchSegmentJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeBatchSegmentJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeBatchSegmentJobResponse.proto b/fixture/DescribeBatchSegmentJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeBatchSegmentJobResponse.proto
diff --git a/fixture/DescribeCampaign.yaml b/fixture/DescribeCampaign.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeCampaign.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeCampaignResponse.proto b/fixture/DescribeCampaignResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeCampaignResponse.proto
diff --git a/fixture/DescribeDataset.yaml b/fixture/DescribeDataset.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDataset.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeDatasetExportJob.yaml b/fixture/DescribeDatasetExportJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDatasetExportJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeDatasetExportJobResponse.proto b/fixture/DescribeDatasetExportJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDatasetExportJobResponse.proto
diff --git a/fixture/DescribeDatasetGroup.yaml b/fixture/DescribeDatasetGroup.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDatasetGroup.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeDatasetGroupResponse.proto b/fixture/DescribeDatasetGroupResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDatasetGroupResponse.proto
diff --git a/fixture/DescribeDatasetImportJob.yaml b/fixture/DescribeDatasetImportJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDatasetImportJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeDatasetImportJobResponse.proto b/fixture/DescribeDatasetImportJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDatasetImportJobResponse.proto
diff --git a/fixture/DescribeDatasetResponse.proto b/fixture/DescribeDatasetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDatasetResponse.proto
diff --git a/fixture/DescribeEventTracker.yaml b/fixture/DescribeEventTracker.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeEventTracker.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeEventTrackerResponse.proto b/fixture/DescribeEventTrackerResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeEventTrackerResponse.proto
diff --git a/fixture/DescribeFeatureTransformation.yaml b/fixture/DescribeFeatureTransformation.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeFeatureTransformation.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeFeatureTransformationResponse.proto b/fixture/DescribeFeatureTransformationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeFeatureTransformationResponse.proto
diff --git a/fixture/DescribeFilter.yaml b/fixture/DescribeFilter.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeFilter.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeFilterResponse.proto b/fixture/DescribeFilterResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeFilterResponse.proto
diff --git a/fixture/DescribeMetricAttribution.yaml b/fixture/DescribeMetricAttribution.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeMetricAttribution.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeMetricAttributionResponse.proto b/fixture/DescribeMetricAttributionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeMetricAttributionResponse.proto
diff --git a/fixture/DescribeRecipe.yaml b/fixture/DescribeRecipe.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRecipe.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeRecipeResponse.proto b/fixture/DescribeRecipeResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRecipeResponse.proto
diff --git a/fixture/DescribeRecommender.yaml b/fixture/DescribeRecommender.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRecommender.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeRecommenderResponse.proto b/fixture/DescribeRecommenderResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeRecommenderResponse.proto
diff --git a/fixture/DescribeSchema.yaml b/fixture/DescribeSchema.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSchema.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeSchemaResponse.proto b/fixture/DescribeSchemaResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSchemaResponse.proto
diff --git a/fixture/DescribeSolution.yaml b/fixture/DescribeSolution.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSolution.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeSolutionResponse.proto b/fixture/DescribeSolutionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSolutionResponse.proto
diff --git a/fixture/DescribeSolutionVersion.yaml b/fixture/DescribeSolutionVersion.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSolutionVersion.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/DescribeSolutionVersionResponse.proto b/fixture/DescribeSolutionVersionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeSolutionVersionResponse.proto
diff --git a/fixture/GetSolutionMetrics.yaml b/fixture/GetSolutionMetrics.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/GetSolutionMetrics.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/GetSolutionMetricsResponse.proto b/fixture/GetSolutionMetricsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/GetSolutionMetricsResponse.proto
diff --git a/fixture/ListBatchInferenceJobs.yaml b/fixture/ListBatchInferenceJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListBatchInferenceJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListBatchInferenceJobsResponse.proto b/fixture/ListBatchInferenceJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListBatchInferenceJobsResponse.proto
diff --git a/fixture/ListBatchSegmentJobs.yaml b/fixture/ListBatchSegmentJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListBatchSegmentJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListBatchSegmentJobsResponse.proto b/fixture/ListBatchSegmentJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListBatchSegmentJobsResponse.proto
diff --git a/fixture/ListCampaigns.yaml b/fixture/ListCampaigns.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListCampaigns.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListCampaignsResponse.proto b/fixture/ListCampaignsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListCampaignsResponse.proto
diff --git a/fixture/ListDatasetExportJobs.yaml b/fixture/ListDatasetExportJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatasetExportJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListDatasetExportJobsResponse.proto b/fixture/ListDatasetExportJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatasetExportJobsResponse.proto
diff --git a/fixture/ListDatasetGroups.yaml b/fixture/ListDatasetGroups.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatasetGroups.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListDatasetGroupsResponse.proto b/fixture/ListDatasetGroupsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatasetGroupsResponse.proto
diff --git a/fixture/ListDatasetImportJobs.yaml b/fixture/ListDatasetImportJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatasetImportJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListDatasetImportJobsResponse.proto b/fixture/ListDatasetImportJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatasetImportJobsResponse.proto
diff --git a/fixture/ListDatasets.yaml b/fixture/ListDatasets.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatasets.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListDatasetsResponse.proto b/fixture/ListDatasetsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatasetsResponse.proto
diff --git a/fixture/ListEventTrackers.yaml b/fixture/ListEventTrackers.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListEventTrackers.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListEventTrackersResponse.proto b/fixture/ListEventTrackersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListEventTrackersResponse.proto
diff --git a/fixture/ListFilters.yaml b/fixture/ListFilters.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListFilters.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListFiltersResponse.proto b/fixture/ListFiltersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListFiltersResponse.proto
diff --git a/fixture/ListMetricAttributionMetrics.yaml b/fixture/ListMetricAttributionMetrics.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListMetricAttributionMetrics.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListMetricAttributionMetricsResponse.proto b/fixture/ListMetricAttributionMetricsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListMetricAttributionMetricsResponse.proto
diff --git a/fixture/ListMetricAttributions.yaml b/fixture/ListMetricAttributions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListMetricAttributions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListMetricAttributionsResponse.proto b/fixture/ListMetricAttributionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListMetricAttributionsResponse.proto
diff --git a/fixture/ListRecipes.yaml b/fixture/ListRecipes.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListRecipes.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListRecipesResponse.proto b/fixture/ListRecipesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListRecipesResponse.proto
diff --git a/fixture/ListRecommenders.yaml b/fixture/ListRecommenders.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListRecommenders.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListRecommendersResponse.proto b/fixture/ListRecommendersResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListRecommendersResponse.proto
diff --git a/fixture/ListSchemas.yaml b/fixture/ListSchemas.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListSchemas.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListSchemasResponse.proto b/fixture/ListSchemasResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListSchemasResponse.proto
diff --git a/fixture/ListSolutionVersions.yaml b/fixture/ListSolutionVersions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListSolutionVersions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListSolutionVersionsResponse.proto b/fixture/ListSolutionVersionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListSolutionVersionsResponse.proto
diff --git a/fixture/ListSolutions.yaml b/fixture/ListSolutions.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListSolutions.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListSolutionsResponse.proto b/fixture/ListSolutionsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListSolutionsResponse.proto
diff --git a/fixture/ListTagsForResource.yaml b/fixture/ListTagsForResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/ListTagsForResourceResponse.proto b/fixture/ListTagsForResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListTagsForResourceResponse.proto
diff --git a/fixture/StartRecommender.yaml b/fixture/StartRecommender.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartRecommender.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/StartRecommenderResponse.proto b/fixture/StartRecommenderResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartRecommenderResponse.proto
diff --git a/fixture/StopRecommender.yaml b/fixture/StopRecommender.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StopRecommender.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/StopRecommenderResponse.proto b/fixture/StopRecommenderResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StopRecommenderResponse.proto
diff --git a/fixture/StopSolutionVersionCreation.yaml b/fixture/StopSolutionVersionCreation.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StopSolutionVersionCreation.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/StopSolutionVersionCreationResponse.proto b/fixture/StopSolutionVersionCreationResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StopSolutionVersionCreationResponse.proto
diff --git a/fixture/TagResource.yaml b/fixture/TagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/TagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/TagResourceResponse.proto b/fixture/TagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/TagResourceResponse.proto
diff --git a/fixture/UntagResource.yaml b/fixture/UntagResource.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResource.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UntagResourceResponse.proto b/fixture/UntagResourceResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UntagResourceResponse.proto
diff --git a/fixture/UpdateCampaign.yaml b/fixture/UpdateCampaign.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateCampaign.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateCampaignResponse.proto b/fixture/UpdateCampaignResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateCampaignResponse.proto
diff --git a/fixture/UpdateMetricAttribution.yaml b/fixture/UpdateMetricAttribution.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateMetricAttribution.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateMetricAttributionResponse.proto b/fixture/UpdateMetricAttributionResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateMetricAttributionResponse.proto
diff --git a/fixture/UpdateRecommender.yaml b/fixture/UpdateRecommender.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateRecommender.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/personalize/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  personalize.us-east-1.amazonaws.com
+  Content-Type:          application/x-www-form-urlencoded; charset=utf-8
+  X-Amz-Content-SHA256:  abcdef
+  X-Amz-Date:            20091028T223200Z
+body:
+  ''
diff --git a/fixture/UpdateRecommenderResponse.proto b/fixture/UpdateRecommenderResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateRecommenderResponse.proto
diff --git a/gen/Amazonka/Personalize.hs b/gen/Amazonka/Personalize.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize.hs
@@ -0,0 +1,822 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.Personalize
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Derived from API version @2018-05-22@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- Amazon Personalize is a machine learning service that makes it easy to
+-- add individualized recommendations to customers.
+module Amazonka.Personalize
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** InvalidInputException
+    _InvalidInputException,
+
+    -- ** InvalidNextTokenException
+    _InvalidNextTokenException,
+
+    -- ** LimitExceededException
+    _LimitExceededException,
+
+    -- ** ResourceAlreadyExistsException
+    _ResourceAlreadyExistsException,
+
+    -- ** ResourceInUseException
+    _ResourceInUseException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** TooManyTagKeysException
+    _TooManyTagKeysException,
+
+    -- ** TooManyTagsException
+    _TooManyTagsException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** CreateBatchInferenceJob
+    CreateBatchInferenceJob (CreateBatchInferenceJob'),
+    newCreateBatchInferenceJob,
+    CreateBatchInferenceJobResponse (CreateBatchInferenceJobResponse'),
+    newCreateBatchInferenceJobResponse,
+
+    -- ** CreateBatchSegmentJob
+    CreateBatchSegmentJob (CreateBatchSegmentJob'),
+    newCreateBatchSegmentJob,
+    CreateBatchSegmentJobResponse (CreateBatchSegmentJobResponse'),
+    newCreateBatchSegmentJobResponse,
+
+    -- ** CreateCampaign
+    CreateCampaign (CreateCampaign'),
+    newCreateCampaign,
+    CreateCampaignResponse (CreateCampaignResponse'),
+    newCreateCampaignResponse,
+
+    -- ** CreateDataset
+    CreateDataset (CreateDataset'),
+    newCreateDataset,
+    CreateDatasetResponse (CreateDatasetResponse'),
+    newCreateDatasetResponse,
+
+    -- ** CreateDatasetExportJob
+    CreateDatasetExportJob (CreateDatasetExportJob'),
+    newCreateDatasetExportJob,
+    CreateDatasetExportJobResponse (CreateDatasetExportJobResponse'),
+    newCreateDatasetExportJobResponse,
+
+    -- ** CreateDatasetGroup
+    CreateDatasetGroup (CreateDatasetGroup'),
+    newCreateDatasetGroup,
+    CreateDatasetGroupResponse (CreateDatasetGroupResponse'),
+    newCreateDatasetGroupResponse,
+
+    -- ** CreateDatasetImportJob
+    CreateDatasetImportJob (CreateDatasetImportJob'),
+    newCreateDatasetImportJob,
+    CreateDatasetImportJobResponse (CreateDatasetImportJobResponse'),
+    newCreateDatasetImportJobResponse,
+
+    -- ** CreateEventTracker
+    CreateEventTracker (CreateEventTracker'),
+    newCreateEventTracker,
+    CreateEventTrackerResponse (CreateEventTrackerResponse'),
+    newCreateEventTrackerResponse,
+
+    -- ** CreateFilter
+    CreateFilter (CreateFilter'),
+    newCreateFilter,
+    CreateFilterResponse (CreateFilterResponse'),
+    newCreateFilterResponse,
+
+    -- ** CreateMetricAttribution
+    CreateMetricAttribution (CreateMetricAttribution'),
+    newCreateMetricAttribution,
+    CreateMetricAttributionResponse (CreateMetricAttributionResponse'),
+    newCreateMetricAttributionResponse,
+
+    -- ** CreateRecommender
+    CreateRecommender (CreateRecommender'),
+    newCreateRecommender,
+    CreateRecommenderResponse (CreateRecommenderResponse'),
+    newCreateRecommenderResponse,
+
+    -- ** CreateSchema
+    CreateSchema (CreateSchema'),
+    newCreateSchema,
+    CreateSchemaResponse (CreateSchemaResponse'),
+    newCreateSchemaResponse,
+
+    -- ** CreateSolution
+    CreateSolution (CreateSolution'),
+    newCreateSolution,
+    CreateSolutionResponse (CreateSolutionResponse'),
+    newCreateSolutionResponse,
+
+    -- ** CreateSolutionVersion
+    CreateSolutionVersion (CreateSolutionVersion'),
+    newCreateSolutionVersion,
+    CreateSolutionVersionResponse (CreateSolutionVersionResponse'),
+    newCreateSolutionVersionResponse,
+
+    -- ** DeleteCampaign
+    DeleteCampaign (DeleteCampaign'),
+    newDeleteCampaign,
+    DeleteCampaignResponse (DeleteCampaignResponse'),
+    newDeleteCampaignResponse,
+
+    -- ** DeleteDataset
+    DeleteDataset (DeleteDataset'),
+    newDeleteDataset,
+    DeleteDatasetResponse (DeleteDatasetResponse'),
+    newDeleteDatasetResponse,
+
+    -- ** DeleteDatasetGroup
+    DeleteDatasetGroup (DeleteDatasetGroup'),
+    newDeleteDatasetGroup,
+    DeleteDatasetGroupResponse (DeleteDatasetGroupResponse'),
+    newDeleteDatasetGroupResponse,
+
+    -- ** DeleteEventTracker
+    DeleteEventTracker (DeleteEventTracker'),
+    newDeleteEventTracker,
+    DeleteEventTrackerResponse (DeleteEventTrackerResponse'),
+    newDeleteEventTrackerResponse,
+
+    -- ** DeleteFilter
+    DeleteFilter (DeleteFilter'),
+    newDeleteFilter,
+    DeleteFilterResponse (DeleteFilterResponse'),
+    newDeleteFilterResponse,
+
+    -- ** DeleteMetricAttribution
+    DeleteMetricAttribution (DeleteMetricAttribution'),
+    newDeleteMetricAttribution,
+    DeleteMetricAttributionResponse (DeleteMetricAttributionResponse'),
+    newDeleteMetricAttributionResponse,
+
+    -- ** DeleteRecommender
+    DeleteRecommender (DeleteRecommender'),
+    newDeleteRecommender,
+    DeleteRecommenderResponse (DeleteRecommenderResponse'),
+    newDeleteRecommenderResponse,
+
+    -- ** DeleteSchema
+    DeleteSchema (DeleteSchema'),
+    newDeleteSchema,
+    DeleteSchemaResponse (DeleteSchemaResponse'),
+    newDeleteSchemaResponse,
+
+    -- ** DeleteSolution
+    DeleteSolution (DeleteSolution'),
+    newDeleteSolution,
+    DeleteSolutionResponse (DeleteSolutionResponse'),
+    newDeleteSolutionResponse,
+
+    -- ** DescribeAlgorithm
+    DescribeAlgorithm (DescribeAlgorithm'),
+    newDescribeAlgorithm,
+    DescribeAlgorithmResponse (DescribeAlgorithmResponse'),
+    newDescribeAlgorithmResponse,
+
+    -- ** DescribeBatchInferenceJob
+    DescribeBatchInferenceJob (DescribeBatchInferenceJob'),
+    newDescribeBatchInferenceJob,
+    DescribeBatchInferenceJobResponse (DescribeBatchInferenceJobResponse'),
+    newDescribeBatchInferenceJobResponse,
+
+    -- ** DescribeBatchSegmentJob
+    DescribeBatchSegmentJob (DescribeBatchSegmentJob'),
+    newDescribeBatchSegmentJob,
+    DescribeBatchSegmentJobResponse (DescribeBatchSegmentJobResponse'),
+    newDescribeBatchSegmentJobResponse,
+
+    -- ** DescribeCampaign
+    DescribeCampaign (DescribeCampaign'),
+    newDescribeCampaign,
+    DescribeCampaignResponse (DescribeCampaignResponse'),
+    newDescribeCampaignResponse,
+
+    -- ** DescribeDataset
+    DescribeDataset (DescribeDataset'),
+    newDescribeDataset,
+    DescribeDatasetResponse (DescribeDatasetResponse'),
+    newDescribeDatasetResponse,
+
+    -- ** DescribeDatasetExportJob
+    DescribeDatasetExportJob (DescribeDatasetExportJob'),
+    newDescribeDatasetExportJob,
+    DescribeDatasetExportJobResponse (DescribeDatasetExportJobResponse'),
+    newDescribeDatasetExportJobResponse,
+
+    -- ** DescribeDatasetGroup
+    DescribeDatasetGroup (DescribeDatasetGroup'),
+    newDescribeDatasetGroup,
+    DescribeDatasetGroupResponse (DescribeDatasetGroupResponse'),
+    newDescribeDatasetGroupResponse,
+
+    -- ** DescribeDatasetImportJob
+    DescribeDatasetImportJob (DescribeDatasetImportJob'),
+    newDescribeDatasetImportJob,
+    DescribeDatasetImportJobResponse (DescribeDatasetImportJobResponse'),
+    newDescribeDatasetImportJobResponse,
+
+    -- ** DescribeEventTracker
+    DescribeEventTracker (DescribeEventTracker'),
+    newDescribeEventTracker,
+    DescribeEventTrackerResponse (DescribeEventTrackerResponse'),
+    newDescribeEventTrackerResponse,
+
+    -- ** DescribeFeatureTransformation
+    DescribeFeatureTransformation (DescribeFeatureTransformation'),
+    newDescribeFeatureTransformation,
+    DescribeFeatureTransformationResponse (DescribeFeatureTransformationResponse'),
+    newDescribeFeatureTransformationResponse,
+
+    -- ** DescribeFilter
+    DescribeFilter (DescribeFilter'),
+    newDescribeFilter,
+    DescribeFilterResponse (DescribeFilterResponse'),
+    newDescribeFilterResponse,
+
+    -- ** DescribeMetricAttribution
+    DescribeMetricAttribution (DescribeMetricAttribution'),
+    newDescribeMetricAttribution,
+    DescribeMetricAttributionResponse (DescribeMetricAttributionResponse'),
+    newDescribeMetricAttributionResponse,
+
+    -- ** DescribeRecipe
+    DescribeRecipe (DescribeRecipe'),
+    newDescribeRecipe,
+    DescribeRecipeResponse (DescribeRecipeResponse'),
+    newDescribeRecipeResponse,
+
+    -- ** DescribeRecommender
+    DescribeRecommender (DescribeRecommender'),
+    newDescribeRecommender,
+    DescribeRecommenderResponse (DescribeRecommenderResponse'),
+    newDescribeRecommenderResponse,
+
+    -- ** DescribeSchema
+    DescribeSchema (DescribeSchema'),
+    newDescribeSchema,
+    DescribeSchemaResponse (DescribeSchemaResponse'),
+    newDescribeSchemaResponse,
+
+    -- ** DescribeSolution
+    DescribeSolution (DescribeSolution'),
+    newDescribeSolution,
+    DescribeSolutionResponse (DescribeSolutionResponse'),
+    newDescribeSolutionResponse,
+
+    -- ** DescribeSolutionVersion
+    DescribeSolutionVersion (DescribeSolutionVersion'),
+    newDescribeSolutionVersion,
+    DescribeSolutionVersionResponse (DescribeSolutionVersionResponse'),
+    newDescribeSolutionVersionResponse,
+
+    -- ** GetSolutionMetrics
+    GetSolutionMetrics (GetSolutionMetrics'),
+    newGetSolutionMetrics,
+    GetSolutionMetricsResponse (GetSolutionMetricsResponse'),
+    newGetSolutionMetricsResponse,
+
+    -- ** ListBatchInferenceJobs (Paginated)
+    ListBatchInferenceJobs (ListBatchInferenceJobs'),
+    newListBatchInferenceJobs,
+    ListBatchInferenceJobsResponse (ListBatchInferenceJobsResponse'),
+    newListBatchInferenceJobsResponse,
+
+    -- ** ListBatchSegmentJobs (Paginated)
+    ListBatchSegmentJobs (ListBatchSegmentJobs'),
+    newListBatchSegmentJobs,
+    ListBatchSegmentJobsResponse (ListBatchSegmentJobsResponse'),
+    newListBatchSegmentJobsResponse,
+
+    -- ** ListCampaigns (Paginated)
+    ListCampaigns (ListCampaigns'),
+    newListCampaigns,
+    ListCampaignsResponse (ListCampaignsResponse'),
+    newListCampaignsResponse,
+
+    -- ** ListDatasetExportJobs (Paginated)
+    ListDatasetExportJobs (ListDatasetExportJobs'),
+    newListDatasetExportJobs,
+    ListDatasetExportJobsResponse (ListDatasetExportJobsResponse'),
+    newListDatasetExportJobsResponse,
+
+    -- ** ListDatasetGroups (Paginated)
+    ListDatasetGroups (ListDatasetGroups'),
+    newListDatasetGroups,
+    ListDatasetGroupsResponse (ListDatasetGroupsResponse'),
+    newListDatasetGroupsResponse,
+
+    -- ** ListDatasetImportJobs (Paginated)
+    ListDatasetImportJobs (ListDatasetImportJobs'),
+    newListDatasetImportJobs,
+    ListDatasetImportJobsResponse (ListDatasetImportJobsResponse'),
+    newListDatasetImportJobsResponse,
+
+    -- ** ListDatasets (Paginated)
+    ListDatasets (ListDatasets'),
+    newListDatasets,
+    ListDatasetsResponse (ListDatasetsResponse'),
+    newListDatasetsResponse,
+
+    -- ** ListEventTrackers (Paginated)
+    ListEventTrackers (ListEventTrackers'),
+    newListEventTrackers,
+    ListEventTrackersResponse (ListEventTrackersResponse'),
+    newListEventTrackersResponse,
+
+    -- ** ListFilters (Paginated)
+    ListFilters (ListFilters'),
+    newListFilters,
+    ListFiltersResponse (ListFiltersResponse'),
+    newListFiltersResponse,
+
+    -- ** ListMetricAttributionMetrics (Paginated)
+    ListMetricAttributionMetrics (ListMetricAttributionMetrics'),
+    newListMetricAttributionMetrics,
+    ListMetricAttributionMetricsResponse (ListMetricAttributionMetricsResponse'),
+    newListMetricAttributionMetricsResponse,
+
+    -- ** ListMetricAttributions (Paginated)
+    ListMetricAttributions (ListMetricAttributions'),
+    newListMetricAttributions,
+    ListMetricAttributionsResponse (ListMetricAttributionsResponse'),
+    newListMetricAttributionsResponse,
+
+    -- ** ListRecipes (Paginated)
+    ListRecipes (ListRecipes'),
+    newListRecipes,
+    ListRecipesResponse (ListRecipesResponse'),
+    newListRecipesResponse,
+
+    -- ** ListRecommenders (Paginated)
+    ListRecommenders (ListRecommenders'),
+    newListRecommenders,
+    ListRecommendersResponse (ListRecommendersResponse'),
+    newListRecommendersResponse,
+
+    -- ** ListSchemas (Paginated)
+    ListSchemas (ListSchemas'),
+    newListSchemas,
+    ListSchemasResponse (ListSchemasResponse'),
+    newListSchemasResponse,
+
+    -- ** ListSolutionVersions (Paginated)
+    ListSolutionVersions (ListSolutionVersions'),
+    newListSolutionVersions,
+    ListSolutionVersionsResponse (ListSolutionVersionsResponse'),
+    newListSolutionVersionsResponse,
+
+    -- ** ListSolutions (Paginated)
+    ListSolutions (ListSolutions'),
+    newListSolutions,
+    ListSolutionsResponse (ListSolutionsResponse'),
+    newListSolutionsResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** StartRecommender
+    StartRecommender (StartRecommender'),
+    newStartRecommender,
+    StartRecommenderResponse (StartRecommenderResponse'),
+    newStartRecommenderResponse,
+
+    -- ** StopRecommender
+    StopRecommender (StopRecommender'),
+    newStopRecommender,
+    StopRecommenderResponse (StopRecommenderResponse'),
+    newStopRecommenderResponse,
+
+    -- ** StopSolutionVersionCreation
+    StopSolutionVersionCreation (StopSolutionVersionCreation'),
+    newStopSolutionVersionCreation,
+    StopSolutionVersionCreationResponse (StopSolutionVersionCreationResponse'),
+    newStopSolutionVersionCreationResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateCampaign
+    UpdateCampaign (UpdateCampaign'),
+    newUpdateCampaign,
+    UpdateCampaignResponse (UpdateCampaignResponse'),
+    newUpdateCampaignResponse,
+
+    -- ** UpdateMetricAttribution
+    UpdateMetricAttribution (UpdateMetricAttribution'),
+    newUpdateMetricAttribution,
+    UpdateMetricAttributionResponse (UpdateMetricAttributionResponse'),
+    newUpdateMetricAttributionResponse,
+
+    -- ** UpdateRecommender
+    UpdateRecommender (UpdateRecommender'),
+    newUpdateRecommender,
+    UpdateRecommenderResponse (UpdateRecommenderResponse'),
+    newUpdateRecommenderResponse,
+
+    -- * Types
+
+    -- ** Domain
+    Domain (..),
+
+    -- ** ImportMode
+    ImportMode (..),
+
+    -- ** IngestionMode
+    IngestionMode (..),
+
+    -- ** ObjectiveSensitivity
+    ObjectiveSensitivity (..),
+
+    -- ** RecipeProvider
+    RecipeProvider (..),
+
+    -- ** TrainingMode
+    TrainingMode (..),
+
+    -- ** Algorithm
+    Algorithm (Algorithm'),
+    newAlgorithm,
+
+    -- ** AlgorithmImage
+    AlgorithmImage (AlgorithmImage'),
+    newAlgorithmImage,
+
+    -- ** AutoMLConfig
+    AutoMLConfig (AutoMLConfig'),
+    newAutoMLConfig,
+
+    -- ** AutoMLResult
+    AutoMLResult (AutoMLResult'),
+    newAutoMLResult,
+
+    -- ** BatchInferenceJob
+    BatchInferenceJob (BatchInferenceJob'),
+    newBatchInferenceJob,
+
+    -- ** BatchInferenceJobConfig
+    BatchInferenceJobConfig (BatchInferenceJobConfig'),
+    newBatchInferenceJobConfig,
+
+    -- ** BatchInferenceJobInput
+    BatchInferenceJobInput (BatchInferenceJobInput'),
+    newBatchInferenceJobInput,
+
+    -- ** BatchInferenceJobOutput
+    BatchInferenceJobOutput (BatchInferenceJobOutput'),
+    newBatchInferenceJobOutput,
+
+    -- ** BatchInferenceJobSummary
+    BatchInferenceJobSummary (BatchInferenceJobSummary'),
+    newBatchInferenceJobSummary,
+
+    -- ** BatchSegmentJob
+    BatchSegmentJob (BatchSegmentJob'),
+    newBatchSegmentJob,
+
+    -- ** BatchSegmentJobInput
+    BatchSegmentJobInput (BatchSegmentJobInput'),
+    newBatchSegmentJobInput,
+
+    -- ** BatchSegmentJobOutput
+    BatchSegmentJobOutput (BatchSegmentJobOutput'),
+    newBatchSegmentJobOutput,
+
+    -- ** BatchSegmentJobSummary
+    BatchSegmentJobSummary (BatchSegmentJobSummary'),
+    newBatchSegmentJobSummary,
+
+    -- ** Campaign
+    Campaign (Campaign'),
+    newCampaign,
+
+    -- ** CampaignConfig
+    CampaignConfig (CampaignConfig'),
+    newCampaignConfig,
+
+    -- ** CampaignSummary
+    CampaignSummary (CampaignSummary'),
+    newCampaignSummary,
+
+    -- ** CampaignUpdateSummary
+    CampaignUpdateSummary (CampaignUpdateSummary'),
+    newCampaignUpdateSummary,
+
+    -- ** CategoricalHyperParameterRange
+    CategoricalHyperParameterRange (CategoricalHyperParameterRange'),
+    newCategoricalHyperParameterRange,
+
+    -- ** ContinuousHyperParameterRange
+    ContinuousHyperParameterRange (ContinuousHyperParameterRange'),
+    newContinuousHyperParameterRange,
+
+    -- ** DataSource
+    DataSource (DataSource'),
+    newDataSource,
+
+    -- ** Dataset
+    Dataset (Dataset'),
+    newDataset,
+
+    -- ** DatasetExportJob
+    DatasetExportJob (DatasetExportJob'),
+    newDatasetExportJob,
+
+    -- ** DatasetExportJobOutput
+    DatasetExportJobOutput (DatasetExportJobOutput'),
+    newDatasetExportJobOutput,
+
+    -- ** DatasetExportJobSummary
+    DatasetExportJobSummary (DatasetExportJobSummary'),
+    newDatasetExportJobSummary,
+
+    -- ** DatasetGroup
+    DatasetGroup (DatasetGroup'),
+    newDatasetGroup,
+
+    -- ** DatasetGroupSummary
+    DatasetGroupSummary (DatasetGroupSummary'),
+    newDatasetGroupSummary,
+
+    -- ** DatasetImportJob
+    DatasetImportJob (DatasetImportJob'),
+    newDatasetImportJob,
+
+    -- ** DatasetImportJobSummary
+    DatasetImportJobSummary (DatasetImportJobSummary'),
+    newDatasetImportJobSummary,
+
+    -- ** DatasetSchema
+    DatasetSchema (DatasetSchema'),
+    newDatasetSchema,
+
+    -- ** DatasetSchemaSummary
+    DatasetSchemaSummary (DatasetSchemaSummary'),
+    newDatasetSchemaSummary,
+
+    -- ** DatasetSummary
+    DatasetSummary (DatasetSummary'),
+    newDatasetSummary,
+
+    -- ** DefaultCategoricalHyperParameterRange
+    DefaultCategoricalHyperParameterRange (DefaultCategoricalHyperParameterRange'),
+    newDefaultCategoricalHyperParameterRange,
+
+    -- ** DefaultContinuousHyperParameterRange
+    DefaultContinuousHyperParameterRange (DefaultContinuousHyperParameterRange'),
+    newDefaultContinuousHyperParameterRange,
+
+    -- ** DefaultHyperParameterRanges
+    DefaultHyperParameterRanges (DefaultHyperParameterRanges'),
+    newDefaultHyperParameterRanges,
+
+    -- ** DefaultIntegerHyperParameterRange
+    DefaultIntegerHyperParameterRange (DefaultIntegerHyperParameterRange'),
+    newDefaultIntegerHyperParameterRange,
+
+    -- ** EventTracker
+    EventTracker (EventTracker'),
+    newEventTracker,
+
+    -- ** EventTrackerSummary
+    EventTrackerSummary (EventTrackerSummary'),
+    newEventTrackerSummary,
+
+    -- ** FeatureTransformation
+    FeatureTransformation (FeatureTransformation'),
+    newFeatureTransformation,
+
+    -- ** Filter
+    Filter (Filter'),
+    newFilter,
+
+    -- ** FilterSummary
+    FilterSummary (FilterSummary'),
+    newFilterSummary,
+
+    -- ** HPOConfig
+    HPOConfig (HPOConfig'),
+    newHPOConfig,
+
+    -- ** HPOObjective
+    HPOObjective (HPOObjective'),
+    newHPOObjective,
+
+    -- ** HPOResourceConfig
+    HPOResourceConfig (HPOResourceConfig'),
+    newHPOResourceConfig,
+
+    -- ** HyperParameterRanges
+    HyperParameterRanges (HyperParameterRanges'),
+    newHyperParameterRanges,
+
+    -- ** IntegerHyperParameterRange
+    IntegerHyperParameterRange (IntegerHyperParameterRange'),
+    newIntegerHyperParameterRange,
+
+    -- ** MetricAttribute
+    MetricAttribute (MetricAttribute'),
+    newMetricAttribute,
+
+    -- ** MetricAttribution
+    MetricAttribution (MetricAttribution'),
+    newMetricAttribution,
+
+    -- ** MetricAttributionOutput
+    MetricAttributionOutput (MetricAttributionOutput'),
+    newMetricAttributionOutput,
+
+    -- ** MetricAttributionSummary
+    MetricAttributionSummary (MetricAttributionSummary'),
+    newMetricAttributionSummary,
+
+    -- ** OptimizationObjective
+    OptimizationObjective (OptimizationObjective'),
+    newOptimizationObjective,
+
+    -- ** Recipe
+    Recipe (Recipe'),
+    newRecipe,
+
+    -- ** RecipeSummary
+    RecipeSummary (RecipeSummary'),
+    newRecipeSummary,
+
+    -- ** Recommender
+    Recommender (Recommender'),
+    newRecommender,
+
+    -- ** RecommenderConfig
+    RecommenderConfig (RecommenderConfig'),
+    newRecommenderConfig,
+
+    -- ** RecommenderSummary
+    RecommenderSummary (RecommenderSummary'),
+    newRecommenderSummary,
+
+    -- ** RecommenderUpdateSummary
+    RecommenderUpdateSummary (RecommenderUpdateSummary'),
+    newRecommenderUpdateSummary,
+
+    -- ** S3DataConfig
+    S3DataConfig (S3DataConfig'),
+    newS3DataConfig,
+
+    -- ** Solution
+    Solution (Solution'),
+    newSolution,
+
+    -- ** SolutionConfig
+    SolutionConfig (SolutionConfig'),
+    newSolutionConfig,
+
+    -- ** SolutionSummary
+    SolutionSummary (SolutionSummary'),
+    newSolutionSummary,
+
+    -- ** SolutionVersion
+    SolutionVersion (SolutionVersion'),
+    newSolutionVersion,
+
+    -- ** SolutionVersionSummary
+    SolutionVersionSummary (SolutionVersionSummary'),
+    newSolutionVersionSummary,
+
+    -- ** Tag
+    Tag (Tag'),
+    newTag,
+
+    -- ** TunedHPOParams
+    TunedHPOParams (TunedHPOParams'),
+    newTunedHPOParams,
+  )
+where
+
+import Amazonka.Personalize.CreateBatchInferenceJob
+import Amazonka.Personalize.CreateBatchSegmentJob
+import Amazonka.Personalize.CreateCampaign
+import Amazonka.Personalize.CreateDataset
+import Amazonka.Personalize.CreateDatasetExportJob
+import Amazonka.Personalize.CreateDatasetGroup
+import Amazonka.Personalize.CreateDatasetImportJob
+import Amazonka.Personalize.CreateEventTracker
+import Amazonka.Personalize.CreateFilter
+import Amazonka.Personalize.CreateMetricAttribution
+import Amazonka.Personalize.CreateRecommender
+import Amazonka.Personalize.CreateSchema
+import Amazonka.Personalize.CreateSolution
+import Amazonka.Personalize.CreateSolutionVersion
+import Amazonka.Personalize.DeleteCampaign
+import Amazonka.Personalize.DeleteDataset
+import Amazonka.Personalize.DeleteDatasetGroup
+import Amazonka.Personalize.DeleteEventTracker
+import Amazonka.Personalize.DeleteFilter
+import Amazonka.Personalize.DeleteMetricAttribution
+import Amazonka.Personalize.DeleteRecommender
+import Amazonka.Personalize.DeleteSchema
+import Amazonka.Personalize.DeleteSolution
+import Amazonka.Personalize.DescribeAlgorithm
+import Amazonka.Personalize.DescribeBatchInferenceJob
+import Amazonka.Personalize.DescribeBatchSegmentJob
+import Amazonka.Personalize.DescribeCampaign
+import Amazonka.Personalize.DescribeDataset
+import Amazonka.Personalize.DescribeDatasetExportJob
+import Amazonka.Personalize.DescribeDatasetGroup
+import Amazonka.Personalize.DescribeDatasetImportJob
+import Amazonka.Personalize.DescribeEventTracker
+import Amazonka.Personalize.DescribeFeatureTransformation
+import Amazonka.Personalize.DescribeFilter
+import Amazonka.Personalize.DescribeMetricAttribution
+import Amazonka.Personalize.DescribeRecipe
+import Amazonka.Personalize.DescribeRecommender
+import Amazonka.Personalize.DescribeSchema
+import Amazonka.Personalize.DescribeSolution
+import Amazonka.Personalize.DescribeSolutionVersion
+import Amazonka.Personalize.GetSolutionMetrics
+import Amazonka.Personalize.Lens
+import Amazonka.Personalize.ListBatchInferenceJobs
+import Amazonka.Personalize.ListBatchSegmentJobs
+import Amazonka.Personalize.ListCampaigns
+import Amazonka.Personalize.ListDatasetExportJobs
+import Amazonka.Personalize.ListDatasetGroups
+import Amazonka.Personalize.ListDatasetImportJobs
+import Amazonka.Personalize.ListDatasets
+import Amazonka.Personalize.ListEventTrackers
+import Amazonka.Personalize.ListFilters
+import Amazonka.Personalize.ListMetricAttributionMetrics
+import Amazonka.Personalize.ListMetricAttributions
+import Amazonka.Personalize.ListRecipes
+import Amazonka.Personalize.ListRecommenders
+import Amazonka.Personalize.ListSchemas
+import Amazonka.Personalize.ListSolutionVersions
+import Amazonka.Personalize.ListSolutions
+import Amazonka.Personalize.ListTagsForResource
+import Amazonka.Personalize.StartRecommender
+import Amazonka.Personalize.StopRecommender
+import Amazonka.Personalize.StopSolutionVersionCreation
+import Amazonka.Personalize.TagResource
+import Amazonka.Personalize.Types
+import Amazonka.Personalize.UntagResource
+import Amazonka.Personalize.UpdateCampaign
+import Amazonka.Personalize.UpdateMetricAttribution
+import Amazonka.Personalize.UpdateRecommender
+import Amazonka.Personalize.Waiters
+
+-- $errors
+-- Error matchers are designed for use with the functions provided by
+-- <http://hackage.haskell.org/package/lens/docs/Control-Exception-Lens.html Control.Exception.Lens>.
+-- This allows catching (and rethrowing) service specific errors returned
+-- by 'Personalize'.
+
+-- $operations
+-- Some AWS operations return results that are incomplete and require subsequent
+-- requests in order to obtain the entire result set. The process of sending
+-- subsequent requests to continue where a previous request left off is called
+-- pagination. For example, the 'ListObjects' operation of Amazon S3 returns up to
+-- 1000 objects at a time, and you must send subsequent requests with the
+-- appropriate Marker in order to retrieve the next page of results.
+--
+-- Operations that have an 'AWSPager' instance can transparently perform subsequent
+-- requests, correctly setting Markers and other request facets to iterate through
+-- the entire result set of a truncated API operation. Operations which support
+-- this have an additional note in the documentation.
+--
+-- Many operations have the ability to filter results on the server side. See the
+-- individual operation parameters for details.
+
+-- $waiters
+-- Waiters poll by repeatedly sending a request until some remote success condition
+-- configured by the 'Wait' specification is fulfilled. The 'Wait' specification
+-- determines how many attempts should be made, in addition to delay and retry strategies.
diff --git a/gen/Amazonka/Personalize/CreateBatchInferenceJob.hs b/gen/Amazonka/Personalize/CreateBatchInferenceJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateBatchInferenceJob.hs
@@ -0,0 +1,323 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateBatchInferenceJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a batch inference job. The operation can handle up to 50 million
+-- records and the input file must be in JSON format. For more information,
+-- see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/creating-batch-inference-job.html Creating a batch inference job>.
+module Amazonka.Personalize.CreateBatchInferenceJob
+  ( -- * Creating a Request
+    CreateBatchInferenceJob (..),
+    newCreateBatchInferenceJob,
+
+    -- * Request Lenses
+    createBatchInferenceJob_batchInferenceJobConfig,
+    createBatchInferenceJob_filterArn,
+    createBatchInferenceJob_numResults,
+    createBatchInferenceJob_tags,
+    createBatchInferenceJob_jobName,
+    createBatchInferenceJob_solutionVersionArn,
+    createBatchInferenceJob_jobInput,
+    createBatchInferenceJob_jobOutput,
+    createBatchInferenceJob_roleArn,
+
+    -- * Destructuring the Response
+    CreateBatchInferenceJobResponse (..),
+    newCreateBatchInferenceJobResponse,
+
+    -- * Response Lenses
+    createBatchInferenceJobResponse_batchInferenceJobArn,
+    createBatchInferenceJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateBatchInferenceJob' smart constructor.
+data CreateBatchInferenceJob = CreateBatchInferenceJob'
+  { -- | The configuration details of a batch inference job.
+    batchInferenceJobConfig :: Prelude.Maybe BatchInferenceJobConfig,
+    -- | The ARN of the filter to apply to the batch inference job. For more
+    -- information on using filters, see
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/filter-batch.html Filtering batch recommendations>.
+    filterArn :: Prelude.Maybe Prelude.Text,
+    -- | The number of recommendations to retrieve.
+    numResults :: Prelude.Maybe Prelude.Int,
+    -- | A list of
+    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+    -- to apply to the batch inference job.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name of the batch inference job to create.
+    jobName :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the solution version that will be used
+    -- to generate the batch inference recommendations.
+    solutionVersionArn :: Prelude.Text,
+    -- | The Amazon S3 path that leads to the input file to base your
+    -- recommendations on. The input material must be in JSON format.
+    jobInput :: BatchInferenceJobInput,
+    -- | The path to the Amazon S3 bucket where the job\'s output will be stored.
+    jobOutput :: BatchInferenceJobOutput,
+    -- | The ARN of the Amazon Identity and Access Management role that has
+    -- permissions to read and write to your input and output Amazon S3 buckets
+    -- respectively.
+    roleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateBatchInferenceJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchInferenceJobConfig', 'createBatchInferenceJob_batchInferenceJobConfig' - The configuration details of a batch inference job.
+--
+-- 'filterArn', 'createBatchInferenceJob_filterArn' - The ARN of the filter to apply to the batch inference job. For more
+-- information on using filters, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/filter-batch.html Filtering batch recommendations>.
+--
+-- 'numResults', 'createBatchInferenceJob_numResults' - The number of recommendations to retrieve.
+--
+-- 'tags', 'createBatchInferenceJob_tags' - A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the batch inference job.
+--
+-- 'jobName', 'createBatchInferenceJob_jobName' - The name of the batch inference job to create.
+--
+-- 'solutionVersionArn', 'createBatchInferenceJob_solutionVersionArn' - The Amazon Resource Name (ARN) of the solution version that will be used
+-- to generate the batch inference recommendations.
+--
+-- 'jobInput', 'createBatchInferenceJob_jobInput' - The Amazon S3 path that leads to the input file to base your
+-- recommendations on. The input material must be in JSON format.
+--
+-- 'jobOutput', 'createBatchInferenceJob_jobOutput' - The path to the Amazon S3 bucket where the job\'s output will be stored.
+--
+-- 'roleArn', 'createBatchInferenceJob_roleArn' - The ARN of the Amazon Identity and Access Management role that has
+-- permissions to read and write to your input and output Amazon S3 buckets
+-- respectively.
+newCreateBatchInferenceJob ::
+  -- | 'jobName'
+  Prelude.Text ->
+  -- | 'solutionVersionArn'
+  Prelude.Text ->
+  -- | 'jobInput'
+  BatchInferenceJobInput ->
+  -- | 'jobOutput'
+  BatchInferenceJobOutput ->
+  -- | 'roleArn'
+  Prelude.Text ->
+  CreateBatchInferenceJob
+newCreateBatchInferenceJob
+  pJobName_
+  pSolutionVersionArn_
+  pJobInput_
+  pJobOutput_
+  pRoleArn_ =
+    CreateBatchInferenceJob'
+      { batchInferenceJobConfig =
+          Prelude.Nothing,
+        filterArn = Prelude.Nothing,
+        numResults = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        jobName = pJobName_,
+        solutionVersionArn = pSolutionVersionArn_,
+        jobInput = pJobInput_,
+        jobOutput = pJobOutput_,
+        roleArn = pRoleArn_
+      }
+
+-- | The configuration details of a batch inference job.
+createBatchInferenceJob_batchInferenceJobConfig :: Lens.Lens' CreateBatchInferenceJob (Prelude.Maybe BatchInferenceJobConfig)
+createBatchInferenceJob_batchInferenceJobConfig = Lens.lens (\CreateBatchInferenceJob' {batchInferenceJobConfig} -> batchInferenceJobConfig) (\s@CreateBatchInferenceJob' {} a -> s {batchInferenceJobConfig = a} :: CreateBatchInferenceJob)
+
+-- | The ARN of the filter to apply to the batch inference job. For more
+-- information on using filters, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/filter-batch.html Filtering batch recommendations>.
+createBatchInferenceJob_filterArn :: Lens.Lens' CreateBatchInferenceJob (Prelude.Maybe Prelude.Text)
+createBatchInferenceJob_filterArn = Lens.lens (\CreateBatchInferenceJob' {filterArn} -> filterArn) (\s@CreateBatchInferenceJob' {} a -> s {filterArn = a} :: CreateBatchInferenceJob)
+
+-- | The number of recommendations to retrieve.
+createBatchInferenceJob_numResults :: Lens.Lens' CreateBatchInferenceJob (Prelude.Maybe Prelude.Int)
+createBatchInferenceJob_numResults = Lens.lens (\CreateBatchInferenceJob' {numResults} -> numResults) (\s@CreateBatchInferenceJob' {} a -> s {numResults = a} :: CreateBatchInferenceJob)
+
+-- | A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the batch inference job.
+createBatchInferenceJob_tags :: Lens.Lens' CreateBatchInferenceJob (Prelude.Maybe [Tag])
+createBatchInferenceJob_tags = Lens.lens (\CreateBatchInferenceJob' {tags} -> tags) (\s@CreateBatchInferenceJob' {} a -> s {tags = a} :: CreateBatchInferenceJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the batch inference job to create.
+createBatchInferenceJob_jobName :: Lens.Lens' CreateBatchInferenceJob Prelude.Text
+createBatchInferenceJob_jobName = Lens.lens (\CreateBatchInferenceJob' {jobName} -> jobName) (\s@CreateBatchInferenceJob' {} a -> s {jobName = a} :: CreateBatchInferenceJob)
+
+-- | The Amazon Resource Name (ARN) of the solution version that will be used
+-- to generate the batch inference recommendations.
+createBatchInferenceJob_solutionVersionArn :: Lens.Lens' CreateBatchInferenceJob Prelude.Text
+createBatchInferenceJob_solutionVersionArn = Lens.lens (\CreateBatchInferenceJob' {solutionVersionArn} -> solutionVersionArn) (\s@CreateBatchInferenceJob' {} a -> s {solutionVersionArn = a} :: CreateBatchInferenceJob)
+
+-- | The Amazon S3 path that leads to the input file to base your
+-- recommendations on. The input material must be in JSON format.
+createBatchInferenceJob_jobInput :: Lens.Lens' CreateBatchInferenceJob BatchInferenceJobInput
+createBatchInferenceJob_jobInput = Lens.lens (\CreateBatchInferenceJob' {jobInput} -> jobInput) (\s@CreateBatchInferenceJob' {} a -> s {jobInput = a} :: CreateBatchInferenceJob)
+
+-- | The path to the Amazon S3 bucket where the job\'s output will be stored.
+createBatchInferenceJob_jobOutput :: Lens.Lens' CreateBatchInferenceJob BatchInferenceJobOutput
+createBatchInferenceJob_jobOutput = Lens.lens (\CreateBatchInferenceJob' {jobOutput} -> jobOutput) (\s@CreateBatchInferenceJob' {} a -> s {jobOutput = a} :: CreateBatchInferenceJob)
+
+-- | The ARN of the Amazon Identity and Access Management role that has
+-- permissions to read and write to your input and output Amazon S3 buckets
+-- respectively.
+createBatchInferenceJob_roleArn :: Lens.Lens' CreateBatchInferenceJob Prelude.Text
+createBatchInferenceJob_roleArn = Lens.lens (\CreateBatchInferenceJob' {roleArn} -> roleArn) (\s@CreateBatchInferenceJob' {} a -> s {roleArn = a} :: CreateBatchInferenceJob)
+
+instance Core.AWSRequest CreateBatchInferenceJob where
+  type
+    AWSResponse CreateBatchInferenceJob =
+      CreateBatchInferenceJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateBatchInferenceJobResponse'
+            Prelude.<$> (x Data..?> "batchInferenceJobArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateBatchInferenceJob where
+  hashWithSalt _salt CreateBatchInferenceJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` batchInferenceJobConfig
+      `Prelude.hashWithSalt` filterArn
+      `Prelude.hashWithSalt` numResults
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` solutionVersionArn
+      `Prelude.hashWithSalt` jobInput
+      `Prelude.hashWithSalt` jobOutput
+      `Prelude.hashWithSalt` roleArn
+
+instance Prelude.NFData CreateBatchInferenceJob where
+  rnf CreateBatchInferenceJob' {..} =
+    Prelude.rnf batchInferenceJobConfig
+      `Prelude.seq` Prelude.rnf filterArn
+      `Prelude.seq` Prelude.rnf numResults
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+      `Prelude.seq` Prelude.rnf jobInput
+      `Prelude.seq` Prelude.rnf jobOutput
+      `Prelude.seq` Prelude.rnf roleArn
+
+instance Data.ToHeaders CreateBatchInferenceJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateBatchInferenceJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateBatchInferenceJob where
+  toJSON CreateBatchInferenceJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("batchInferenceJobConfig" Data..=)
+              Prelude.<$> batchInferenceJobConfig,
+            ("filterArn" Data..=) Prelude.<$> filterArn,
+            ("numResults" Data..=) Prelude.<$> numResults,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("jobName" Data..= jobName),
+            Prelude.Just
+              ("solutionVersionArn" Data..= solutionVersionArn),
+            Prelude.Just ("jobInput" Data..= jobInput),
+            Prelude.Just ("jobOutput" Data..= jobOutput),
+            Prelude.Just ("roleArn" Data..= roleArn)
+          ]
+      )
+
+instance Data.ToPath CreateBatchInferenceJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateBatchInferenceJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateBatchInferenceJobResponse' smart constructor.
+data CreateBatchInferenceJobResponse = CreateBatchInferenceJobResponse'
+  { -- | The ARN of the batch inference job.
+    batchInferenceJobArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateBatchInferenceJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchInferenceJobArn', 'createBatchInferenceJobResponse_batchInferenceJobArn' - The ARN of the batch inference job.
+--
+-- 'httpStatus', 'createBatchInferenceJobResponse_httpStatus' - The response's http status code.
+newCreateBatchInferenceJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateBatchInferenceJobResponse
+newCreateBatchInferenceJobResponse pHttpStatus_ =
+  CreateBatchInferenceJobResponse'
+    { batchInferenceJobArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The ARN of the batch inference job.
+createBatchInferenceJobResponse_batchInferenceJobArn :: Lens.Lens' CreateBatchInferenceJobResponse (Prelude.Maybe Prelude.Text)
+createBatchInferenceJobResponse_batchInferenceJobArn = Lens.lens (\CreateBatchInferenceJobResponse' {batchInferenceJobArn} -> batchInferenceJobArn) (\s@CreateBatchInferenceJobResponse' {} a -> s {batchInferenceJobArn = a} :: CreateBatchInferenceJobResponse)
+
+-- | The response's http status code.
+createBatchInferenceJobResponse_httpStatus :: Lens.Lens' CreateBatchInferenceJobResponse Prelude.Int
+createBatchInferenceJobResponse_httpStatus = Lens.lens (\CreateBatchInferenceJobResponse' {httpStatus} -> httpStatus) (\s@CreateBatchInferenceJobResponse' {} a -> s {httpStatus = a} :: CreateBatchInferenceJobResponse)
+
+instance
+  Prelude.NFData
+    CreateBatchInferenceJobResponse
+  where
+  rnf CreateBatchInferenceJobResponse' {..} =
+    Prelude.rnf batchInferenceJobArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/CreateBatchSegmentJob.hs b/gen/Amazonka/Personalize/CreateBatchSegmentJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateBatchSegmentJob.hs
@@ -0,0 +1,311 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateBatchSegmentJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a batch segment job. The operation can handle up to 50 million
+-- records and the input file must be in JSON format. For more information,
+-- see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/recommendations-batch.html Getting batch recommendations and user segments>.
+module Amazonka.Personalize.CreateBatchSegmentJob
+  ( -- * Creating a Request
+    CreateBatchSegmentJob (..),
+    newCreateBatchSegmentJob,
+
+    -- * Request Lenses
+    createBatchSegmentJob_filterArn,
+    createBatchSegmentJob_numResults,
+    createBatchSegmentJob_tags,
+    createBatchSegmentJob_jobName,
+    createBatchSegmentJob_solutionVersionArn,
+    createBatchSegmentJob_jobInput,
+    createBatchSegmentJob_jobOutput,
+    createBatchSegmentJob_roleArn,
+
+    -- * Destructuring the Response
+    CreateBatchSegmentJobResponse (..),
+    newCreateBatchSegmentJobResponse,
+
+    -- * Response Lenses
+    createBatchSegmentJobResponse_batchSegmentJobArn,
+    createBatchSegmentJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateBatchSegmentJob' smart constructor.
+data CreateBatchSegmentJob = CreateBatchSegmentJob'
+  { -- | The ARN of the filter to apply to the batch segment job. For more
+    -- information on using filters, see
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/filter-batch.html Filtering batch recommendations>.
+    filterArn :: Prelude.Maybe Prelude.Text,
+    -- | The number of predicted users generated by the batch segment job for
+    -- each line of input data.
+    numResults :: Prelude.Maybe Prelude.Int,
+    -- | A list of
+    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+    -- to apply to the batch segment job.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name of the batch segment job to create.
+    jobName :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the solution version you want the
+    -- batch segment job to use to generate batch segments.
+    solutionVersionArn :: Prelude.Text,
+    -- | The Amazon S3 path for the input data used to generate the batch segment
+    -- job.
+    jobInput :: BatchSegmentJobInput,
+    -- | The Amazon S3 path for the bucket where the job\'s output will be
+    -- stored.
+    jobOutput :: BatchSegmentJobOutput,
+    -- | The ARN of the Amazon Identity and Access Management role that has
+    -- permissions to read and write to your input and output Amazon S3 buckets
+    -- respectively.
+    roleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateBatchSegmentJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filterArn', 'createBatchSegmentJob_filterArn' - The ARN of the filter to apply to the batch segment job. For more
+-- information on using filters, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/filter-batch.html Filtering batch recommendations>.
+--
+-- 'numResults', 'createBatchSegmentJob_numResults' - The number of predicted users generated by the batch segment job for
+-- each line of input data.
+--
+-- 'tags', 'createBatchSegmentJob_tags' - A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the batch segment job.
+--
+-- 'jobName', 'createBatchSegmentJob_jobName' - The name of the batch segment job to create.
+--
+-- 'solutionVersionArn', 'createBatchSegmentJob_solutionVersionArn' - The Amazon Resource Name (ARN) of the solution version you want the
+-- batch segment job to use to generate batch segments.
+--
+-- 'jobInput', 'createBatchSegmentJob_jobInput' - The Amazon S3 path for the input data used to generate the batch segment
+-- job.
+--
+-- 'jobOutput', 'createBatchSegmentJob_jobOutput' - The Amazon S3 path for the bucket where the job\'s output will be
+-- stored.
+--
+-- 'roleArn', 'createBatchSegmentJob_roleArn' - The ARN of the Amazon Identity and Access Management role that has
+-- permissions to read and write to your input and output Amazon S3 buckets
+-- respectively.
+newCreateBatchSegmentJob ::
+  -- | 'jobName'
+  Prelude.Text ->
+  -- | 'solutionVersionArn'
+  Prelude.Text ->
+  -- | 'jobInput'
+  BatchSegmentJobInput ->
+  -- | 'jobOutput'
+  BatchSegmentJobOutput ->
+  -- | 'roleArn'
+  Prelude.Text ->
+  CreateBatchSegmentJob
+newCreateBatchSegmentJob
+  pJobName_
+  pSolutionVersionArn_
+  pJobInput_
+  pJobOutput_
+  pRoleArn_ =
+    CreateBatchSegmentJob'
+      { filterArn = Prelude.Nothing,
+        numResults = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        jobName = pJobName_,
+        solutionVersionArn = pSolutionVersionArn_,
+        jobInput = pJobInput_,
+        jobOutput = pJobOutput_,
+        roleArn = pRoleArn_
+      }
+
+-- | The ARN of the filter to apply to the batch segment job. For more
+-- information on using filters, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/filter-batch.html Filtering batch recommendations>.
+createBatchSegmentJob_filterArn :: Lens.Lens' CreateBatchSegmentJob (Prelude.Maybe Prelude.Text)
+createBatchSegmentJob_filterArn = Lens.lens (\CreateBatchSegmentJob' {filterArn} -> filterArn) (\s@CreateBatchSegmentJob' {} a -> s {filterArn = a} :: CreateBatchSegmentJob)
+
+-- | The number of predicted users generated by the batch segment job for
+-- each line of input data.
+createBatchSegmentJob_numResults :: Lens.Lens' CreateBatchSegmentJob (Prelude.Maybe Prelude.Int)
+createBatchSegmentJob_numResults = Lens.lens (\CreateBatchSegmentJob' {numResults} -> numResults) (\s@CreateBatchSegmentJob' {} a -> s {numResults = a} :: CreateBatchSegmentJob)
+
+-- | A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the batch segment job.
+createBatchSegmentJob_tags :: Lens.Lens' CreateBatchSegmentJob (Prelude.Maybe [Tag])
+createBatchSegmentJob_tags = Lens.lens (\CreateBatchSegmentJob' {tags} -> tags) (\s@CreateBatchSegmentJob' {} a -> s {tags = a} :: CreateBatchSegmentJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the batch segment job to create.
+createBatchSegmentJob_jobName :: Lens.Lens' CreateBatchSegmentJob Prelude.Text
+createBatchSegmentJob_jobName = Lens.lens (\CreateBatchSegmentJob' {jobName} -> jobName) (\s@CreateBatchSegmentJob' {} a -> s {jobName = a} :: CreateBatchSegmentJob)
+
+-- | The Amazon Resource Name (ARN) of the solution version you want the
+-- batch segment job to use to generate batch segments.
+createBatchSegmentJob_solutionVersionArn :: Lens.Lens' CreateBatchSegmentJob Prelude.Text
+createBatchSegmentJob_solutionVersionArn = Lens.lens (\CreateBatchSegmentJob' {solutionVersionArn} -> solutionVersionArn) (\s@CreateBatchSegmentJob' {} a -> s {solutionVersionArn = a} :: CreateBatchSegmentJob)
+
+-- | The Amazon S3 path for the input data used to generate the batch segment
+-- job.
+createBatchSegmentJob_jobInput :: Lens.Lens' CreateBatchSegmentJob BatchSegmentJobInput
+createBatchSegmentJob_jobInput = Lens.lens (\CreateBatchSegmentJob' {jobInput} -> jobInput) (\s@CreateBatchSegmentJob' {} a -> s {jobInput = a} :: CreateBatchSegmentJob)
+
+-- | The Amazon S3 path for the bucket where the job\'s output will be
+-- stored.
+createBatchSegmentJob_jobOutput :: Lens.Lens' CreateBatchSegmentJob BatchSegmentJobOutput
+createBatchSegmentJob_jobOutput = Lens.lens (\CreateBatchSegmentJob' {jobOutput} -> jobOutput) (\s@CreateBatchSegmentJob' {} a -> s {jobOutput = a} :: CreateBatchSegmentJob)
+
+-- | The ARN of the Amazon Identity and Access Management role that has
+-- permissions to read and write to your input and output Amazon S3 buckets
+-- respectively.
+createBatchSegmentJob_roleArn :: Lens.Lens' CreateBatchSegmentJob Prelude.Text
+createBatchSegmentJob_roleArn = Lens.lens (\CreateBatchSegmentJob' {roleArn} -> roleArn) (\s@CreateBatchSegmentJob' {} a -> s {roleArn = a} :: CreateBatchSegmentJob)
+
+instance Core.AWSRequest CreateBatchSegmentJob where
+  type
+    AWSResponse CreateBatchSegmentJob =
+      CreateBatchSegmentJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateBatchSegmentJobResponse'
+            Prelude.<$> (x Data..?> "batchSegmentJobArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateBatchSegmentJob where
+  hashWithSalt _salt CreateBatchSegmentJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` filterArn
+      `Prelude.hashWithSalt` numResults
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` solutionVersionArn
+      `Prelude.hashWithSalt` jobInput
+      `Prelude.hashWithSalt` jobOutput
+      `Prelude.hashWithSalt` roleArn
+
+instance Prelude.NFData CreateBatchSegmentJob where
+  rnf CreateBatchSegmentJob' {..} =
+    Prelude.rnf filterArn
+      `Prelude.seq` Prelude.rnf numResults
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+      `Prelude.seq` Prelude.rnf jobInput
+      `Prelude.seq` Prelude.rnf jobOutput
+      `Prelude.seq` Prelude.rnf roleArn
+
+instance Data.ToHeaders CreateBatchSegmentJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateBatchSegmentJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateBatchSegmentJob where
+  toJSON CreateBatchSegmentJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("filterArn" Data..=) Prelude.<$> filterArn,
+            ("numResults" Data..=) Prelude.<$> numResults,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("jobName" Data..= jobName),
+            Prelude.Just
+              ("solutionVersionArn" Data..= solutionVersionArn),
+            Prelude.Just ("jobInput" Data..= jobInput),
+            Prelude.Just ("jobOutput" Data..= jobOutput),
+            Prelude.Just ("roleArn" Data..= roleArn)
+          ]
+      )
+
+instance Data.ToPath CreateBatchSegmentJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateBatchSegmentJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateBatchSegmentJobResponse' smart constructor.
+data CreateBatchSegmentJobResponse = CreateBatchSegmentJobResponse'
+  { -- | The ARN of the batch segment job.
+    batchSegmentJobArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateBatchSegmentJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchSegmentJobArn', 'createBatchSegmentJobResponse_batchSegmentJobArn' - The ARN of the batch segment job.
+--
+-- 'httpStatus', 'createBatchSegmentJobResponse_httpStatus' - The response's http status code.
+newCreateBatchSegmentJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateBatchSegmentJobResponse
+newCreateBatchSegmentJobResponse pHttpStatus_ =
+  CreateBatchSegmentJobResponse'
+    { batchSegmentJobArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The ARN of the batch segment job.
+createBatchSegmentJobResponse_batchSegmentJobArn :: Lens.Lens' CreateBatchSegmentJobResponse (Prelude.Maybe Prelude.Text)
+createBatchSegmentJobResponse_batchSegmentJobArn = Lens.lens (\CreateBatchSegmentJobResponse' {batchSegmentJobArn} -> batchSegmentJobArn) (\s@CreateBatchSegmentJobResponse' {} a -> s {batchSegmentJobArn = a} :: CreateBatchSegmentJobResponse)
+
+-- | The response's http status code.
+createBatchSegmentJobResponse_httpStatus :: Lens.Lens' CreateBatchSegmentJobResponse Prelude.Int
+createBatchSegmentJobResponse_httpStatus = Lens.lens (\CreateBatchSegmentJobResponse' {httpStatus} -> httpStatus) (\s@CreateBatchSegmentJobResponse' {} a -> s {httpStatus = a} :: CreateBatchSegmentJobResponse)
+
+instance Prelude.NFData CreateBatchSegmentJobResponse where
+  rnf CreateBatchSegmentJobResponse' {..} =
+    Prelude.rnf batchSegmentJobArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/CreateCampaign.hs b/gen/Amazonka/Personalize/CreateCampaign.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateCampaign.hs
@@ -0,0 +1,290 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateCampaign
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a campaign that deploys a solution version. When a client calls
+-- the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_RS_GetRecommendations.html GetRecommendations>
+-- and
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_RS_GetPersonalizedRanking.html GetPersonalizedRanking>
+-- APIs, a campaign is specified in the request.
+--
+-- __Minimum Provisioned TPS and Auto-Scaling__
+--
+-- A transaction is a single @GetRecommendations@ or
+-- @GetPersonalizedRanking@ call. Transactions per second (TPS) is the
+-- throughput and unit of billing for Amazon Personalize. The minimum
+-- provisioned TPS (@minProvisionedTPS@) specifies the baseline throughput
+-- provisioned by Amazon Personalize, and thus, the minimum billing charge.
+--
+-- If your TPS increases beyond @minProvisionedTPS@, Amazon Personalize
+-- auto-scales the provisioned capacity up and down, but never below
+-- @minProvisionedTPS@. There\'s a short time delay while the capacity is
+-- increased that might cause loss of transactions.
+--
+-- The actual TPS used is calculated as the average requests\/second within
+-- a 5-minute window. You pay for maximum of either the minimum provisioned
+-- TPS or the actual TPS. We recommend starting with a low
+-- @minProvisionedTPS@, track your usage using Amazon CloudWatch metrics,
+-- and then increase the @minProvisionedTPS@ as necessary.
+--
+-- __Status__
+--
+-- A campaign can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+--
+-- To get the campaign status, call
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeCampaign.html DescribeCampaign>.
+--
+-- Wait until the @status@ of the campaign is @ACTIVE@ before asking the
+-- campaign for recommendations.
+--
+-- __Related APIs__
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_ListCampaigns.html ListCampaigns>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeCampaign.html DescribeCampaign>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_UpdateCampaign.html UpdateCampaign>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DeleteCampaign.html DeleteCampaign>
+module Amazonka.Personalize.CreateCampaign
+  ( -- * Creating a Request
+    CreateCampaign (..),
+    newCreateCampaign,
+
+    -- * Request Lenses
+    createCampaign_campaignConfig,
+    createCampaign_minProvisionedTPS,
+    createCampaign_tags,
+    createCampaign_name,
+    createCampaign_solutionVersionArn,
+
+    -- * Destructuring the Response
+    CreateCampaignResponse (..),
+    newCreateCampaignResponse,
+
+    -- * Response Lenses
+    createCampaignResponse_campaignArn,
+    createCampaignResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateCampaign' smart constructor.
+data CreateCampaign = CreateCampaign'
+  { -- | The configuration details of a campaign.
+    campaignConfig :: Prelude.Maybe CampaignConfig,
+    -- | Specifies the requested minimum provisioned transactions
+    -- (recommendations) per second that Amazon Personalize will support.
+    minProvisionedTPS :: Prelude.Maybe Prelude.Natural,
+    -- | A list of
+    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+    -- to apply to the campaign.
+    tags :: Prelude.Maybe [Tag],
+    -- | A name for the new campaign. The campaign name must be unique within
+    -- your account.
+    name :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the solution version to deploy.
+    solutionVersionArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateCampaign' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'campaignConfig', 'createCampaign_campaignConfig' - The configuration details of a campaign.
+--
+-- 'minProvisionedTPS', 'createCampaign_minProvisionedTPS' - Specifies the requested minimum provisioned transactions
+-- (recommendations) per second that Amazon Personalize will support.
+--
+-- 'tags', 'createCampaign_tags' - A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the campaign.
+--
+-- 'name', 'createCampaign_name' - A name for the new campaign. The campaign name must be unique within
+-- your account.
+--
+-- 'solutionVersionArn', 'createCampaign_solutionVersionArn' - The Amazon Resource Name (ARN) of the solution version to deploy.
+newCreateCampaign ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'solutionVersionArn'
+  Prelude.Text ->
+  CreateCampaign
+newCreateCampaign pName_ pSolutionVersionArn_ =
+  CreateCampaign'
+    { campaignConfig = Prelude.Nothing,
+      minProvisionedTPS = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      name = pName_,
+      solutionVersionArn = pSolutionVersionArn_
+    }
+
+-- | The configuration details of a campaign.
+createCampaign_campaignConfig :: Lens.Lens' CreateCampaign (Prelude.Maybe CampaignConfig)
+createCampaign_campaignConfig = Lens.lens (\CreateCampaign' {campaignConfig} -> campaignConfig) (\s@CreateCampaign' {} a -> s {campaignConfig = a} :: CreateCampaign)
+
+-- | Specifies the requested minimum provisioned transactions
+-- (recommendations) per second that Amazon Personalize will support.
+createCampaign_minProvisionedTPS :: Lens.Lens' CreateCampaign (Prelude.Maybe Prelude.Natural)
+createCampaign_minProvisionedTPS = Lens.lens (\CreateCampaign' {minProvisionedTPS} -> minProvisionedTPS) (\s@CreateCampaign' {} a -> s {minProvisionedTPS = a} :: CreateCampaign)
+
+-- | A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the campaign.
+createCampaign_tags :: Lens.Lens' CreateCampaign (Prelude.Maybe [Tag])
+createCampaign_tags = Lens.lens (\CreateCampaign' {tags} -> tags) (\s@CreateCampaign' {} a -> s {tags = a} :: CreateCampaign) Prelude.. Lens.mapping Lens.coerced
+
+-- | A name for the new campaign. The campaign name must be unique within
+-- your account.
+createCampaign_name :: Lens.Lens' CreateCampaign Prelude.Text
+createCampaign_name = Lens.lens (\CreateCampaign' {name} -> name) (\s@CreateCampaign' {} a -> s {name = a} :: CreateCampaign)
+
+-- | The Amazon Resource Name (ARN) of the solution version to deploy.
+createCampaign_solutionVersionArn :: Lens.Lens' CreateCampaign Prelude.Text
+createCampaign_solutionVersionArn = Lens.lens (\CreateCampaign' {solutionVersionArn} -> solutionVersionArn) (\s@CreateCampaign' {} a -> s {solutionVersionArn = a} :: CreateCampaign)
+
+instance Core.AWSRequest CreateCampaign where
+  type
+    AWSResponse CreateCampaign =
+      CreateCampaignResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateCampaignResponse'
+            Prelude.<$> (x Data..?> "campaignArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateCampaign where
+  hashWithSalt _salt CreateCampaign' {..} =
+    _salt
+      `Prelude.hashWithSalt` campaignConfig
+      `Prelude.hashWithSalt` minProvisionedTPS
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` solutionVersionArn
+
+instance Prelude.NFData CreateCampaign where
+  rnf CreateCampaign' {..} =
+    Prelude.rnf campaignConfig
+      `Prelude.seq` Prelude.rnf minProvisionedTPS
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+
+instance Data.ToHeaders CreateCampaign where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateCampaign" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateCampaign where
+  toJSON CreateCampaign' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("campaignConfig" Data..=)
+              Prelude.<$> campaignConfig,
+            ("minProvisionedTPS" Data..=)
+              Prelude.<$> minProvisionedTPS,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just
+              ("solutionVersionArn" Data..= solutionVersionArn)
+          ]
+      )
+
+instance Data.ToPath CreateCampaign where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateCampaign where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateCampaignResponse' smart constructor.
+data CreateCampaignResponse = CreateCampaignResponse'
+  { -- | The Amazon Resource Name (ARN) of the campaign.
+    campaignArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateCampaignResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'campaignArn', 'createCampaignResponse_campaignArn' - The Amazon Resource Name (ARN) of the campaign.
+--
+-- 'httpStatus', 'createCampaignResponse_httpStatus' - The response's http status code.
+newCreateCampaignResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateCampaignResponse
+newCreateCampaignResponse pHttpStatus_ =
+  CreateCampaignResponse'
+    { campaignArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the campaign.
+createCampaignResponse_campaignArn :: Lens.Lens' CreateCampaignResponse (Prelude.Maybe Prelude.Text)
+createCampaignResponse_campaignArn = Lens.lens (\CreateCampaignResponse' {campaignArn} -> campaignArn) (\s@CreateCampaignResponse' {} a -> s {campaignArn = a} :: CreateCampaignResponse)
+
+-- | The response's http status code.
+createCampaignResponse_httpStatus :: Lens.Lens' CreateCampaignResponse Prelude.Int
+createCampaignResponse_httpStatus = Lens.lens (\CreateCampaignResponse' {httpStatus} -> httpStatus) (\s@CreateCampaignResponse' {} a -> s {httpStatus = a} :: CreateCampaignResponse)
+
+instance Prelude.NFData CreateCampaignResponse where
+  rnf CreateCampaignResponse' {..} =
+    Prelude.rnf campaignArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/CreateDataset.hs b/gen/Amazonka/Personalize/CreateDataset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateDataset.hs
@@ -0,0 +1,305 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateDataset
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an empty dataset and adds it to the specified dataset group. Use
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetImportJob.html CreateDatasetImportJob>
+-- to import your training data to a dataset.
+--
+-- There are three types of datasets:
+--
+-- -   Interactions
+--
+-- -   Items
+--
+-- -   Users
+--
+-- Each dataset type has an associated schema with required field types.
+-- Only the @Interactions@ dataset is required in order to train a model
+-- (also referred to as creating a solution).
+--
+-- A dataset can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+--
+-- To get the status of the dataset, call
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeDataset.html DescribeDataset>.
+--
+-- __Related APIs__
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetGroup.html CreateDatasetGroup>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_ListDatasets.html ListDatasets>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeDataset.html DescribeDataset>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DeleteDataset.html DeleteDataset>
+module Amazonka.Personalize.CreateDataset
+  ( -- * Creating a Request
+    CreateDataset (..),
+    newCreateDataset,
+
+    -- * Request Lenses
+    createDataset_tags,
+    createDataset_name,
+    createDataset_schemaArn,
+    createDataset_datasetGroupArn,
+    createDataset_datasetType,
+
+    -- * Destructuring the Response
+    CreateDatasetResponse (..),
+    newCreateDatasetResponse,
+
+    -- * Response Lenses
+    createDatasetResponse_datasetArn,
+    createDatasetResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateDataset' smart constructor.
+data CreateDataset = CreateDataset'
+  { -- | A list of
+    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+    -- to apply to the dataset.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name for the dataset.
+    name :: Prelude.Text,
+    -- | The ARN of the schema to associate with the dataset. The schema defines
+    -- the dataset fields.
+    schemaArn :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the dataset group to add the dataset
+    -- to.
+    datasetGroupArn :: Prelude.Text,
+    -- | The type of dataset.
+    --
+    -- One of the following (case insensitive) values:
+    --
+    -- -   Interactions
+    --
+    -- -   Items
+    --
+    -- -   Users
+    datasetType :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDataset' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'createDataset_tags' - A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the dataset.
+--
+-- 'name', 'createDataset_name' - The name for the dataset.
+--
+-- 'schemaArn', 'createDataset_schemaArn' - The ARN of the schema to associate with the dataset. The schema defines
+-- the dataset fields.
+--
+-- 'datasetGroupArn', 'createDataset_datasetGroupArn' - The Amazon Resource Name (ARN) of the dataset group to add the dataset
+-- to.
+--
+-- 'datasetType', 'createDataset_datasetType' - The type of dataset.
+--
+-- One of the following (case insensitive) values:
+--
+-- -   Interactions
+--
+-- -   Items
+--
+-- -   Users
+newCreateDataset ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'schemaArn'
+  Prelude.Text ->
+  -- | 'datasetGroupArn'
+  Prelude.Text ->
+  -- | 'datasetType'
+  Prelude.Text ->
+  CreateDataset
+newCreateDataset
+  pName_
+  pSchemaArn_
+  pDatasetGroupArn_
+  pDatasetType_ =
+    CreateDataset'
+      { tags = Prelude.Nothing,
+        name = pName_,
+        schemaArn = pSchemaArn_,
+        datasetGroupArn = pDatasetGroupArn_,
+        datasetType = pDatasetType_
+      }
+
+-- | A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the dataset.
+createDataset_tags :: Lens.Lens' CreateDataset (Prelude.Maybe [Tag])
+createDataset_tags = Lens.lens (\CreateDataset' {tags} -> tags) (\s@CreateDataset' {} a -> s {tags = a} :: CreateDataset) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name for the dataset.
+createDataset_name :: Lens.Lens' CreateDataset Prelude.Text
+createDataset_name = Lens.lens (\CreateDataset' {name} -> name) (\s@CreateDataset' {} a -> s {name = a} :: CreateDataset)
+
+-- | The ARN of the schema to associate with the dataset. The schema defines
+-- the dataset fields.
+createDataset_schemaArn :: Lens.Lens' CreateDataset Prelude.Text
+createDataset_schemaArn = Lens.lens (\CreateDataset' {schemaArn} -> schemaArn) (\s@CreateDataset' {} a -> s {schemaArn = a} :: CreateDataset)
+
+-- | The Amazon Resource Name (ARN) of the dataset group to add the dataset
+-- to.
+createDataset_datasetGroupArn :: Lens.Lens' CreateDataset Prelude.Text
+createDataset_datasetGroupArn = Lens.lens (\CreateDataset' {datasetGroupArn} -> datasetGroupArn) (\s@CreateDataset' {} a -> s {datasetGroupArn = a} :: CreateDataset)
+
+-- | The type of dataset.
+--
+-- One of the following (case insensitive) values:
+--
+-- -   Interactions
+--
+-- -   Items
+--
+-- -   Users
+createDataset_datasetType :: Lens.Lens' CreateDataset Prelude.Text
+createDataset_datasetType = Lens.lens (\CreateDataset' {datasetType} -> datasetType) (\s@CreateDataset' {} a -> s {datasetType = a} :: CreateDataset)
+
+instance Core.AWSRequest CreateDataset where
+  type
+    AWSResponse CreateDataset =
+      CreateDatasetResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateDatasetResponse'
+            Prelude.<$> (x Data..?> "datasetArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateDataset where
+  hashWithSalt _salt CreateDataset' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` schemaArn
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` datasetType
+
+instance Prelude.NFData CreateDataset where
+  rnf CreateDataset' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf schemaArn
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf datasetType
+
+instance Data.ToHeaders CreateDataset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateDataset" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateDataset where
+  toJSON CreateDataset' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just ("schemaArn" Data..= schemaArn),
+            Prelude.Just
+              ("datasetGroupArn" Data..= datasetGroupArn),
+            Prelude.Just ("datasetType" Data..= datasetType)
+          ]
+      )
+
+instance Data.ToPath CreateDataset where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateDataset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateDatasetResponse' smart constructor.
+data CreateDatasetResponse = CreateDatasetResponse'
+  { -- | The ARN of the dataset.
+    datasetArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDatasetResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetArn', 'createDatasetResponse_datasetArn' - The ARN of the dataset.
+--
+-- 'httpStatus', 'createDatasetResponse_httpStatus' - The response's http status code.
+newCreateDatasetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateDatasetResponse
+newCreateDatasetResponse pHttpStatus_ =
+  CreateDatasetResponse'
+    { datasetArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The ARN of the dataset.
+createDatasetResponse_datasetArn :: Lens.Lens' CreateDatasetResponse (Prelude.Maybe Prelude.Text)
+createDatasetResponse_datasetArn = Lens.lens (\CreateDatasetResponse' {datasetArn} -> datasetArn) (\s@CreateDatasetResponse' {} a -> s {datasetArn = a} :: CreateDatasetResponse)
+
+-- | The response's http status code.
+createDatasetResponse_httpStatus :: Lens.Lens' CreateDatasetResponse Prelude.Int
+createDatasetResponse_httpStatus = Lens.lens (\CreateDatasetResponse' {httpStatus} -> httpStatus) (\s@CreateDatasetResponse' {} a -> s {httpStatus = a} :: CreateDatasetResponse)
+
+instance Prelude.NFData CreateDatasetResponse where
+  rnf CreateDatasetResponse' {..} =
+    Prelude.rnf datasetArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/CreateDatasetExportJob.hs b/gen/Amazonka/Personalize/CreateDatasetExportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateDatasetExportJob.hs
@@ -0,0 +1,294 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateDatasetExportJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a job that exports data from your dataset to an Amazon S3
+-- bucket. To allow Amazon Personalize to export the training data, you
+-- must specify an service-linked IAM role that gives Amazon Personalize
+-- @PutObject@ permissions for your Amazon S3 bucket. For information, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/export-data.html Exporting a dataset>
+-- in the Amazon Personalize developer guide.
+--
+-- __Status__
+--
+-- A dataset export job can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- To get the status of the export job, call
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeDatasetExportJob.html DescribeDatasetExportJob>,
+-- and specify the Amazon Resource Name (ARN) of the dataset export job.
+-- The dataset export is complete when the status shows as ACTIVE. If the
+-- status shows as CREATE FAILED, the response includes a @failureReason@
+-- key, which describes why the job failed.
+module Amazonka.Personalize.CreateDatasetExportJob
+  ( -- * Creating a Request
+    CreateDatasetExportJob (..),
+    newCreateDatasetExportJob,
+
+    -- * Request Lenses
+    createDatasetExportJob_ingestionMode,
+    createDatasetExportJob_tags,
+    createDatasetExportJob_jobName,
+    createDatasetExportJob_datasetArn,
+    createDatasetExportJob_roleArn,
+    createDatasetExportJob_jobOutput,
+
+    -- * Destructuring the Response
+    CreateDatasetExportJobResponse (..),
+    newCreateDatasetExportJobResponse,
+
+    -- * Response Lenses
+    createDatasetExportJobResponse_datasetExportJobArn,
+    createDatasetExportJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateDatasetExportJob' smart constructor.
+data CreateDatasetExportJob = CreateDatasetExportJob'
+  { -- | The data to export, based on how you imported the data. You can choose
+    -- to export only @BULK@ data that you imported using a dataset import job,
+    -- only @PUT@ data that you imported incrementally (using the console,
+    -- PutEvents, PutUsers and PutItems operations), or @ALL@ for both types.
+    -- The default value is @PUT@.
+    ingestionMode :: Prelude.Maybe IngestionMode,
+    -- | A list of
+    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+    -- to apply to the dataset export job.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name for the dataset export job.
+    jobName :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the dataset that contains the data to
+    -- export.
+    datasetArn :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the IAM service role that has
+    -- permissions to add data to your output Amazon S3 bucket.
+    roleArn :: Prelude.Text,
+    -- | The path to the Amazon S3 bucket where the job\'s output is stored.
+    jobOutput :: DatasetExportJobOutput
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDatasetExportJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'ingestionMode', 'createDatasetExportJob_ingestionMode' - The data to export, based on how you imported the data. You can choose
+-- to export only @BULK@ data that you imported using a dataset import job,
+-- only @PUT@ data that you imported incrementally (using the console,
+-- PutEvents, PutUsers and PutItems operations), or @ALL@ for both types.
+-- The default value is @PUT@.
+--
+-- 'tags', 'createDatasetExportJob_tags' - A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the dataset export job.
+--
+-- 'jobName', 'createDatasetExportJob_jobName' - The name for the dataset export job.
+--
+-- 'datasetArn', 'createDatasetExportJob_datasetArn' - The Amazon Resource Name (ARN) of the dataset that contains the data to
+-- export.
+--
+-- 'roleArn', 'createDatasetExportJob_roleArn' - The Amazon Resource Name (ARN) of the IAM service role that has
+-- permissions to add data to your output Amazon S3 bucket.
+--
+-- 'jobOutput', 'createDatasetExportJob_jobOutput' - The path to the Amazon S3 bucket where the job\'s output is stored.
+newCreateDatasetExportJob ::
+  -- | 'jobName'
+  Prelude.Text ->
+  -- | 'datasetArn'
+  Prelude.Text ->
+  -- | 'roleArn'
+  Prelude.Text ->
+  -- | 'jobOutput'
+  DatasetExportJobOutput ->
+  CreateDatasetExportJob
+newCreateDatasetExportJob
+  pJobName_
+  pDatasetArn_
+  pRoleArn_
+  pJobOutput_ =
+    CreateDatasetExportJob'
+      { ingestionMode =
+          Prelude.Nothing,
+        tags = Prelude.Nothing,
+        jobName = pJobName_,
+        datasetArn = pDatasetArn_,
+        roleArn = pRoleArn_,
+        jobOutput = pJobOutput_
+      }
+
+-- | The data to export, based on how you imported the data. You can choose
+-- to export only @BULK@ data that you imported using a dataset import job,
+-- only @PUT@ data that you imported incrementally (using the console,
+-- PutEvents, PutUsers and PutItems operations), or @ALL@ for both types.
+-- The default value is @PUT@.
+createDatasetExportJob_ingestionMode :: Lens.Lens' CreateDatasetExportJob (Prelude.Maybe IngestionMode)
+createDatasetExportJob_ingestionMode = Lens.lens (\CreateDatasetExportJob' {ingestionMode} -> ingestionMode) (\s@CreateDatasetExportJob' {} a -> s {ingestionMode = a} :: CreateDatasetExportJob)
+
+-- | A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the dataset export job.
+createDatasetExportJob_tags :: Lens.Lens' CreateDatasetExportJob (Prelude.Maybe [Tag])
+createDatasetExportJob_tags = Lens.lens (\CreateDatasetExportJob' {tags} -> tags) (\s@CreateDatasetExportJob' {} a -> s {tags = a} :: CreateDatasetExportJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name for the dataset export job.
+createDatasetExportJob_jobName :: Lens.Lens' CreateDatasetExportJob Prelude.Text
+createDatasetExportJob_jobName = Lens.lens (\CreateDatasetExportJob' {jobName} -> jobName) (\s@CreateDatasetExportJob' {} a -> s {jobName = a} :: CreateDatasetExportJob)
+
+-- | The Amazon Resource Name (ARN) of the dataset that contains the data to
+-- export.
+createDatasetExportJob_datasetArn :: Lens.Lens' CreateDatasetExportJob Prelude.Text
+createDatasetExportJob_datasetArn = Lens.lens (\CreateDatasetExportJob' {datasetArn} -> datasetArn) (\s@CreateDatasetExportJob' {} a -> s {datasetArn = a} :: CreateDatasetExportJob)
+
+-- | The Amazon Resource Name (ARN) of the IAM service role that has
+-- permissions to add data to your output Amazon S3 bucket.
+createDatasetExportJob_roleArn :: Lens.Lens' CreateDatasetExportJob Prelude.Text
+createDatasetExportJob_roleArn = Lens.lens (\CreateDatasetExportJob' {roleArn} -> roleArn) (\s@CreateDatasetExportJob' {} a -> s {roleArn = a} :: CreateDatasetExportJob)
+
+-- | The path to the Amazon S3 bucket where the job\'s output is stored.
+createDatasetExportJob_jobOutput :: Lens.Lens' CreateDatasetExportJob DatasetExportJobOutput
+createDatasetExportJob_jobOutput = Lens.lens (\CreateDatasetExportJob' {jobOutput} -> jobOutput) (\s@CreateDatasetExportJob' {} a -> s {jobOutput = a} :: CreateDatasetExportJob)
+
+instance Core.AWSRequest CreateDatasetExportJob where
+  type
+    AWSResponse CreateDatasetExportJob =
+      CreateDatasetExportJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateDatasetExportJobResponse'
+            Prelude.<$> (x Data..?> "datasetExportJobArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateDatasetExportJob where
+  hashWithSalt _salt CreateDatasetExportJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` ingestionMode
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` datasetArn
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` jobOutput
+
+instance Prelude.NFData CreateDatasetExportJob where
+  rnf CreateDatasetExportJob' {..} =
+    Prelude.rnf ingestionMode
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf datasetArn
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf jobOutput
+
+instance Data.ToHeaders CreateDatasetExportJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateDatasetExportJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateDatasetExportJob where
+  toJSON CreateDatasetExportJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("ingestionMode" Data..=) Prelude.<$> ingestionMode,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("jobName" Data..= jobName),
+            Prelude.Just ("datasetArn" Data..= datasetArn),
+            Prelude.Just ("roleArn" Data..= roleArn),
+            Prelude.Just ("jobOutput" Data..= jobOutput)
+          ]
+      )
+
+instance Data.ToPath CreateDatasetExportJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateDatasetExportJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateDatasetExportJobResponse' smart constructor.
+data CreateDatasetExportJobResponse = CreateDatasetExportJobResponse'
+  { -- | The Amazon Resource Name (ARN) of the dataset export job.
+    datasetExportJobArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDatasetExportJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetExportJobArn', 'createDatasetExportJobResponse_datasetExportJobArn' - The Amazon Resource Name (ARN) of the dataset export job.
+--
+-- 'httpStatus', 'createDatasetExportJobResponse_httpStatus' - The response's http status code.
+newCreateDatasetExportJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateDatasetExportJobResponse
+newCreateDatasetExportJobResponse pHttpStatus_ =
+  CreateDatasetExportJobResponse'
+    { datasetExportJobArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the dataset export job.
+createDatasetExportJobResponse_datasetExportJobArn :: Lens.Lens' CreateDatasetExportJobResponse (Prelude.Maybe Prelude.Text)
+createDatasetExportJobResponse_datasetExportJobArn = Lens.lens (\CreateDatasetExportJobResponse' {datasetExportJobArn} -> datasetExportJobArn) (\s@CreateDatasetExportJobResponse' {} a -> s {datasetExportJobArn = a} :: CreateDatasetExportJobResponse)
+
+-- | The response's http status code.
+createDatasetExportJobResponse_httpStatus :: Lens.Lens' CreateDatasetExportJobResponse Prelude.Int
+createDatasetExportJobResponse_httpStatus = Lens.lens (\CreateDatasetExportJobResponse' {httpStatus} -> httpStatus) (\s@CreateDatasetExportJobResponse' {} a -> s {httpStatus = a} :: CreateDatasetExportJobResponse)
+
+instance
+  Prelude.NFData
+    CreateDatasetExportJobResponse
+  where
+  rnf CreateDatasetExportJobResponse' {..} =
+    Prelude.rnf datasetExportJobArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/CreateDatasetGroup.hs b/gen/Amazonka/Personalize/CreateDatasetGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateDatasetGroup.hs
@@ -0,0 +1,315 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateDatasetGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an empty dataset group. A dataset group is a container for
+-- Amazon Personalize resources. A dataset group can contain at most three
+-- datasets, one for each type of dataset:
+--
+-- -   Interactions
+--
+-- -   Items
+--
+-- -   Users
+--
+-- A dataset group can be a Domain dataset group, where you specify a
+-- domain and use pre-configured resources like recommenders, or a Custom
+-- dataset group, where you use custom resources, such as a solution with a
+-- solution version, that you deploy with a campaign. If you start with a
+-- Domain dataset group, you can still add custom resources such as
+-- solutions and solution versions trained with recipes for custom use
+-- cases and deployed with campaigns.
+--
+-- A dataset group can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING
+--
+-- To get the status of the dataset group, call
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeDatasetGroup.html DescribeDatasetGroup>.
+-- If the status shows as CREATE FAILED, the response includes a
+-- @failureReason@ key, which describes why the creation failed.
+--
+-- You must wait until the @status@ of the dataset group is @ACTIVE@ before
+-- adding a dataset to the group.
+--
+-- You can specify an Key Management Service (KMS) key to encrypt the
+-- datasets in the group. If you specify a KMS key, you must also include
+-- an Identity and Access Management (IAM) role that has permission to
+-- access the key.
+--
+-- __APIs that require a dataset group ARN in the request__
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDataset.html CreateDataset>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateEventTracker.html CreateEventTracker>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolution.html CreateSolution>
+--
+-- __Related APIs__
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_ListDatasetGroups.html ListDatasetGroups>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeDatasetGroup.html DescribeDatasetGroup>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DeleteDatasetGroup.html DeleteDatasetGroup>
+module Amazonka.Personalize.CreateDatasetGroup
+  ( -- * Creating a Request
+    CreateDatasetGroup (..),
+    newCreateDatasetGroup,
+
+    -- * Request Lenses
+    createDatasetGroup_domain,
+    createDatasetGroup_kmsKeyArn,
+    createDatasetGroup_roleArn,
+    createDatasetGroup_tags,
+    createDatasetGroup_name,
+
+    -- * Destructuring the Response
+    CreateDatasetGroupResponse (..),
+    newCreateDatasetGroupResponse,
+
+    -- * Response Lenses
+    createDatasetGroupResponse_datasetGroupArn,
+    createDatasetGroupResponse_domain,
+    createDatasetGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateDatasetGroup' smart constructor.
+data CreateDatasetGroup = CreateDatasetGroup'
+  { -- | The domain of the dataset group. Specify a domain to create a Domain
+    -- dataset group. The domain you specify determines the default schemas for
+    -- datasets and the use cases available for recommenders. If you don\'t
+    -- specify a domain, you create a Custom dataset group with solution
+    -- versions that you deploy with a campaign.
+    domain :: Prelude.Maybe Domain,
+    -- | The Amazon Resource Name (ARN) of a Key Management Service (KMS) key
+    -- used to encrypt the datasets.
+    kmsKeyArn :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the Identity and Access Management (IAM) role that has
+    -- permissions to access the Key Management Service (KMS) key. Supplying an
+    -- IAM role is only valid when also specifying a KMS key.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | A list of
+    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+    -- to apply to the dataset group.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name for the new dataset group.
+    name :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDatasetGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domain', 'createDatasetGroup_domain' - The domain of the dataset group. Specify a domain to create a Domain
+-- dataset group. The domain you specify determines the default schemas for
+-- datasets and the use cases available for recommenders. If you don\'t
+-- specify a domain, you create a Custom dataset group with solution
+-- versions that you deploy with a campaign.
+--
+-- 'kmsKeyArn', 'createDatasetGroup_kmsKeyArn' - The Amazon Resource Name (ARN) of a Key Management Service (KMS) key
+-- used to encrypt the datasets.
+--
+-- 'roleArn', 'createDatasetGroup_roleArn' - The ARN of the Identity and Access Management (IAM) role that has
+-- permissions to access the Key Management Service (KMS) key. Supplying an
+-- IAM role is only valid when also specifying a KMS key.
+--
+-- 'tags', 'createDatasetGroup_tags' - A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the dataset group.
+--
+-- 'name', 'createDatasetGroup_name' - The name for the new dataset group.
+newCreateDatasetGroup ::
+  -- | 'name'
+  Prelude.Text ->
+  CreateDatasetGroup
+newCreateDatasetGroup pName_ =
+  CreateDatasetGroup'
+    { domain = Prelude.Nothing,
+      kmsKeyArn = Prelude.Nothing,
+      roleArn = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      name = pName_
+    }
+
+-- | The domain of the dataset group. Specify a domain to create a Domain
+-- dataset group. The domain you specify determines the default schemas for
+-- datasets and the use cases available for recommenders. If you don\'t
+-- specify a domain, you create a Custom dataset group with solution
+-- versions that you deploy with a campaign.
+createDatasetGroup_domain :: Lens.Lens' CreateDatasetGroup (Prelude.Maybe Domain)
+createDatasetGroup_domain = Lens.lens (\CreateDatasetGroup' {domain} -> domain) (\s@CreateDatasetGroup' {} a -> s {domain = a} :: CreateDatasetGroup)
+
+-- | The Amazon Resource Name (ARN) of a Key Management Service (KMS) key
+-- used to encrypt the datasets.
+createDatasetGroup_kmsKeyArn :: Lens.Lens' CreateDatasetGroup (Prelude.Maybe Prelude.Text)
+createDatasetGroup_kmsKeyArn = Lens.lens (\CreateDatasetGroup' {kmsKeyArn} -> kmsKeyArn) (\s@CreateDatasetGroup' {} a -> s {kmsKeyArn = a} :: CreateDatasetGroup)
+
+-- | The ARN of the Identity and Access Management (IAM) role that has
+-- permissions to access the Key Management Service (KMS) key. Supplying an
+-- IAM role is only valid when also specifying a KMS key.
+createDatasetGroup_roleArn :: Lens.Lens' CreateDatasetGroup (Prelude.Maybe Prelude.Text)
+createDatasetGroup_roleArn = Lens.lens (\CreateDatasetGroup' {roleArn} -> roleArn) (\s@CreateDatasetGroup' {} a -> s {roleArn = a} :: CreateDatasetGroup)
+
+-- | A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the dataset group.
+createDatasetGroup_tags :: Lens.Lens' CreateDatasetGroup (Prelude.Maybe [Tag])
+createDatasetGroup_tags = Lens.lens (\CreateDatasetGroup' {tags} -> tags) (\s@CreateDatasetGroup' {} a -> s {tags = a} :: CreateDatasetGroup) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name for the new dataset group.
+createDatasetGroup_name :: Lens.Lens' CreateDatasetGroup Prelude.Text
+createDatasetGroup_name = Lens.lens (\CreateDatasetGroup' {name} -> name) (\s@CreateDatasetGroup' {} a -> s {name = a} :: CreateDatasetGroup)
+
+instance Core.AWSRequest CreateDatasetGroup where
+  type
+    AWSResponse CreateDatasetGroup =
+      CreateDatasetGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateDatasetGroupResponse'
+            Prelude.<$> (x Data..?> "datasetGroupArn")
+            Prelude.<*> (x Data..?> "domain")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateDatasetGroup where
+  hashWithSalt _salt CreateDatasetGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` domain
+      `Prelude.hashWithSalt` kmsKeyArn
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData CreateDatasetGroup where
+  rnf CreateDatasetGroup' {..} =
+    Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf kmsKeyArn
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToHeaders CreateDatasetGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateDatasetGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateDatasetGroup where
+  toJSON CreateDatasetGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("domain" Data..=) Prelude.<$> domain,
+            ("kmsKeyArn" Data..=) Prelude.<$> kmsKeyArn,
+            ("roleArn" Data..=) Prelude.<$> roleArn,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("name" Data..= name)
+          ]
+      )
+
+instance Data.ToPath CreateDatasetGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateDatasetGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateDatasetGroupResponse' smart constructor.
+data CreateDatasetGroupResponse = CreateDatasetGroupResponse'
+  { -- | The Amazon Resource Name (ARN) of the new dataset group.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The domain for the new Domain dataset group.
+    domain :: Prelude.Maybe Domain,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDatasetGroupResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetGroupArn', 'createDatasetGroupResponse_datasetGroupArn' - The Amazon Resource Name (ARN) of the new dataset group.
+--
+-- 'domain', 'createDatasetGroupResponse_domain' - The domain for the new Domain dataset group.
+--
+-- 'httpStatus', 'createDatasetGroupResponse_httpStatus' - The response's http status code.
+newCreateDatasetGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateDatasetGroupResponse
+newCreateDatasetGroupResponse pHttpStatus_ =
+  CreateDatasetGroupResponse'
+    { datasetGroupArn =
+        Prelude.Nothing,
+      domain = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the new dataset group.
+createDatasetGroupResponse_datasetGroupArn :: Lens.Lens' CreateDatasetGroupResponse (Prelude.Maybe Prelude.Text)
+createDatasetGroupResponse_datasetGroupArn = Lens.lens (\CreateDatasetGroupResponse' {datasetGroupArn} -> datasetGroupArn) (\s@CreateDatasetGroupResponse' {} a -> s {datasetGroupArn = a} :: CreateDatasetGroupResponse)
+
+-- | The domain for the new Domain dataset group.
+createDatasetGroupResponse_domain :: Lens.Lens' CreateDatasetGroupResponse (Prelude.Maybe Domain)
+createDatasetGroupResponse_domain = Lens.lens (\CreateDatasetGroupResponse' {domain} -> domain) (\s@CreateDatasetGroupResponse' {} a -> s {domain = a} :: CreateDatasetGroupResponse)
+
+-- | The response's http status code.
+createDatasetGroupResponse_httpStatus :: Lens.Lens' CreateDatasetGroupResponse Prelude.Int
+createDatasetGroupResponse_httpStatus = Lens.lens (\CreateDatasetGroupResponse' {httpStatus} -> httpStatus) (\s@CreateDatasetGroupResponse' {} a -> s {httpStatus = a} :: CreateDatasetGroupResponse)
+
+instance Prelude.NFData CreateDatasetGroupResponse where
+  rnf CreateDatasetGroupResponse' {..} =
+    Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/CreateDatasetImportJob.hs b/gen/Amazonka/Personalize/CreateDatasetImportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateDatasetImportJob.hs
@@ -0,0 +1,338 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateDatasetImportJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a job that imports training data from your data source (an
+-- Amazon S3 bucket) to an Amazon Personalize dataset. To allow Amazon
+-- Personalize to import the training data, you must specify an IAM service
+-- role that has permission to read from the data source, as Amazon
+-- Personalize makes a copy of your data and processes it internally. For
+-- information on granting access to your Amazon S3 bucket, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/granting-personalize-s3-access.html Giving Amazon Personalize Access to Amazon S3 Resources>.
+--
+-- By default, a dataset import job replaces any existing data in the
+-- dataset that you imported in bulk. To add new records without replacing
+-- existing data, specify INCREMENTAL for the import mode in the
+-- CreateDatasetImportJob operation.
+--
+-- __Status__
+--
+-- A dataset import job can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- To get the status of the import job, call
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeDatasetImportJob.html DescribeDatasetImportJob>,
+-- providing the Amazon Resource Name (ARN) of the dataset import job. The
+-- dataset import is complete when the status shows as ACTIVE. If the
+-- status shows as CREATE FAILED, the response includes a @failureReason@
+-- key, which describes why the job failed.
+--
+-- Importing takes time. You must wait until the status shows as ACTIVE
+-- before training a model using the dataset.
+--
+-- __Related APIs__
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_ListDatasetImportJobs.html ListDatasetImportJobs>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeDatasetImportJob.html DescribeDatasetImportJob>
+module Amazonka.Personalize.CreateDatasetImportJob
+  ( -- * Creating a Request
+    CreateDatasetImportJob (..),
+    newCreateDatasetImportJob,
+
+    -- * Request Lenses
+    createDatasetImportJob_importMode,
+    createDatasetImportJob_publishAttributionMetricsToS3,
+    createDatasetImportJob_tags,
+    createDatasetImportJob_jobName,
+    createDatasetImportJob_datasetArn,
+    createDatasetImportJob_dataSource,
+    createDatasetImportJob_roleArn,
+
+    -- * Destructuring the Response
+    CreateDatasetImportJobResponse (..),
+    newCreateDatasetImportJobResponse,
+
+    -- * Response Lenses
+    createDatasetImportJobResponse_datasetImportJobArn,
+    createDatasetImportJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateDatasetImportJob' smart constructor.
+data CreateDatasetImportJob = CreateDatasetImportJob'
+  { -- | Specify how to add the new records to an existing dataset. The default
+    -- import mode is @FULL@. If you haven\'t imported bulk records into the
+    -- dataset previously, you can only specify @FULL@.
+    --
+    -- -   Specify @FULL@ to overwrite all existing bulk data in your dataset.
+    --     Data you imported individually is not replaced.
+    --
+    -- -   Specify @INCREMENTAL@ to append the new records to the existing data
+    --     in your dataset. Amazon Personalize replaces any record with the
+    --     same ID with the new one.
+    importMode :: Prelude.Maybe ImportMode,
+    -- | If you created a metric attribution, specify whether to publish metrics
+    -- for this import job to Amazon S3
+    publishAttributionMetricsToS3 :: Prelude.Maybe Prelude.Bool,
+    -- | A list of
+    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+    -- to apply to the dataset import job.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name for the dataset import job.
+    jobName :: Prelude.Text,
+    -- | The ARN of the dataset that receives the imported data.
+    datasetArn :: Prelude.Text,
+    -- | The Amazon S3 bucket that contains the training data to import.
+    dataSource :: DataSource,
+    -- | The ARN of the IAM role that has permissions to read from the Amazon S3
+    -- data source.
+    roleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDatasetImportJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'importMode', 'createDatasetImportJob_importMode' - Specify how to add the new records to an existing dataset. The default
+-- import mode is @FULL@. If you haven\'t imported bulk records into the
+-- dataset previously, you can only specify @FULL@.
+--
+-- -   Specify @FULL@ to overwrite all existing bulk data in your dataset.
+--     Data you imported individually is not replaced.
+--
+-- -   Specify @INCREMENTAL@ to append the new records to the existing data
+--     in your dataset. Amazon Personalize replaces any record with the
+--     same ID with the new one.
+--
+-- 'publishAttributionMetricsToS3', 'createDatasetImportJob_publishAttributionMetricsToS3' - If you created a metric attribution, specify whether to publish metrics
+-- for this import job to Amazon S3
+--
+-- 'tags', 'createDatasetImportJob_tags' - A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the dataset import job.
+--
+-- 'jobName', 'createDatasetImportJob_jobName' - The name for the dataset import job.
+--
+-- 'datasetArn', 'createDatasetImportJob_datasetArn' - The ARN of the dataset that receives the imported data.
+--
+-- 'dataSource', 'createDatasetImportJob_dataSource' - The Amazon S3 bucket that contains the training data to import.
+--
+-- 'roleArn', 'createDatasetImportJob_roleArn' - The ARN of the IAM role that has permissions to read from the Amazon S3
+-- data source.
+newCreateDatasetImportJob ::
+  -- | 'jobName'
+  Prelude.Text ->
+  -- | 'datasetArn'
+  Prelude.Text ->
+  -- | 'dataSource'
+  DataSource ->
+  -- | 'roleArn'
+  Prelude.Text ->
+  CreateDatasetImportJob
+newCreateDatasetImportJob
+  pJobName_
+  pDatasetArn_
+  pDataSource_
+  pRoleArn_ =
+    CreateDatasetImportJob'
+      { importMode =
+          Prelude.Nothing,
+        publishAttributionMetricsToS3 = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        jobName = pJobName_,
+        datasetArn = pDatasetArn_,
+        dataSource = pDataSource_,
+        roleArn = pRoleArn_
+      }
+
+-- | Specify how to add the new records to an existing dataset. The default
+-- import mode is @FULL@. If you haven\'t imported bulk records into the
+-- dataset previously, you can only specify @FULL@.
+--
+-- -   Specify @FULL@ to overwrite all existing bulk data in your dataset.
+--     Data you imported individually is not replaced.
+--
+-- -   Specify @INCREMENTAL@ to append the new records to the existing data
+--     in your dataset. Amazon Personalize replaces any record with the
+--     same ID with the new one.
+createDatasetImportJob_importMode :: Lens.Lens' CreateDatasetImportJob (Prelude.Maybe ImportMode)
+createDatasetImportJob_importMode = Lens.lens (\CreateDatasetImportJob' {importMode} -> importMode) (\s@CreateDatasetImportJob' {} a -> s {importMode = a} :: CreateDatasetImportJob)
+
+-- | If you created a metric attribution, specify whether to publish metrics
+-- for this import job to Amazon S3
+createDatasetImportJob_publishAttributionMetricsToS3 :: Lens.Lens' CreateDatasetImportJob (Prelude.Maybe Prelude.Bool)
+createDatasetImportJob_publishAttributionMetricsToS3 = Lens.lens (\CreateDatasetImportJob' {publishAttributionMetricsToS3} -> publishAttributionMetricsToS3) (\s@CreateDatasetImportJob' {} a -> s {publishAttributionMetricsToS3 = a} :: CreateDatasetImportJob)
+
+-- | A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the dataset import job.
+createDatasetImportJob_tags :: Lens.Lens' CreateDatasetImportJob (Prelude.Maybe [Tag])
+createDatasetImportJob_tags = Lens.lens (\CreateDatasetImportJob' {tags} -> tags) (\s@CreateDatasetImportJob' {} a -> s {tags = a} :: CreateDatasetImportJob) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name for the dataset import job.
+createDatasetImportJob_jobName :: Lens.Lens' CreateDatasetImportJob Prelude.Text
+createDatasetImportJob_jobName = Lens.lens (\CreateDatasetImportJob' {jobName} -> jobName) (\s@CreateDatasetImportJob' {} a -> s {jobName = a} :: CreateDatasetImportJob)
+
+-- | The ARN of the dataset that receives the imported data.
+createDatasetImportJob_datasetArn :: Lens.Lens' CreateDatasetImportJob Prelude.Text
+createDatasetImportJob_datasetArn = Lens.lens (\CreateDatasetImportJob' {datasetArn} -> datasetArn) (\s@CreateDatasetImportJob' {} a -> s {datasetArn = a} :: CreateDatasetImportJob)
+
+-- | The Amazon S3 bucket that contains the training data to import.
+createDatasetImportJob_dataSource :: Lens.Lens' CreateDatasetImportJob DataSource
+createDatasetImportJob_dataSource = Lens.lens (\CreateDatasetImportJob' {dataSource} -> dataSource) (\s@CreateDatasetImportJob' {} a -> s {dataSource = a} :: CreateDatasetImportJob)
+
+-- | The ARN of the IAM role that has permissions to read from the Amazon S3
+-- data source.
+createDatasetImportJob_roleArn :: Lens.Lens' CreateDatasetImportJob Prelude.Text
+createDatasetImportJob_roleArn = Lens.lens (\CreateDatasetImportJob' {roleArn} -> roleArn) (\s@CreateDatasetImportJob' {} a -> s {roleArn = a} :: CreateDatasetImportJob)
+
+instance Core.AWSRequest CreateDatasetImportJob where
+  type
+    AWSResponse CreateDatasetImportJob =
+      CreateDatasetImportJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateDatasetImportJobResponse'
+            Prelude.<$> (x Data..?> "datasetImportJobArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateDatasetImportJob where
+  hashWithSalt _salt CreateDatasetImportJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` importMode
+      `Prelude.hashWithSalt` publishAttributionMetricsToS3
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` datasetArn
+      `Prelude.hashWithSalt` dataSource
+      `Prelude.hashWithSalt` roleArn
+
+instance Prelude.NFData CreateDatasetImportJob where
+  rnf CreateDatasetImportJob' {..} =
+    Prelude.rnf importMode
+      `Prelude.seq` Prelude.rnf publishAttributionMetricsToS3
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf datasetArn
+      `Prelude.seq` Prelude.rnf dataSource
+      `Prelude.seq` Prelude.rnf roleArn
+
+instance Data.ToHeaders CreateDatasetImportJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateDatasetImportJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateDatasetImportJob where
+  toJSON CreateDatasetImportJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("importMode" Data..=) Prelude.<$> importMode,
+            ("publishAttributionMetricsToS3" Data..=)
+              Prelude.<$> publishAttributionMetricsToS3,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("jobName" Data..= jobName),
+            Prelude.Just ("datasetArn" Data..= datasetArn),
+            Prelude.Just ("dataSource" Data..= dataSource),
+            Prelude.Just ("roleArn" Data..= roleArn)
+          ]
+      )
+
+instance Data.ToPath CreateDatasetImportJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateDatasetImportJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateDatasetImportJobResponse' smart constructor.
+data CreateDatasetImportJobResponse = CreateDatasetImportJobResponse'
+  { -- | The ARN of the dataset import job.
+    datasetImportJobArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateDatasetImportJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetImportJobArn', 'createDatasetImportJobResponse_datasetImportJobArn' - The ARN of the dataset import job.
+--
+-- 'httpStatus', 'createDatasetImportJobResponse_httpStatus' - The response's http status code.
+newCreateDatasetImportJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateDatasetImportJobResponse
+newCreateDatasetImportJobResponse pHttpStatus_ =
+  CreateDatasetImportJobResponse'
+    { datasetImportJobArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The ARN of the dataset import job.
+createDatasetImportJobResponse_datasetImportJobArn :: Lens.Lens' CreateDatasetImportJobResponse (Prelude.Maybe Prelude.Text)
+createDatasetImportJobResponse_datasetImportJobArn = Lens.lens (\CreateDatasetImportJobResponse' {datasetImportJobArn} -> datasetImportJobArn) (\s@CreateDatasetImportJobResponse' {} a -> s {datasetImportJobArn = a} :: CreateDatasetImportJobResponse)
+
+-- | The response's http status code.
+createDatasetImportJobResponse_httpStatus :: Lens.Lens' CreateDatasetImportJobResponse Prelude.Int
+createDatasetImportJobResponse_httpStatus = Lens.lens (\CreateDatasetImportJobResponse' {httpStatus} -> httpStatus) (\s@CreateDatasetImportJobResponse' {} a -> s {httpStatus = a} :: CreateDatasetImportJobResponse)
+
+instance
+  Prelude.NFData
+    CreateDatasetImportJobResponse
+  where
+  rnf CreateDatasetImportJobResponse' {..} =
+    Prelude.rnf datasetImportJobArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/CreateEventTracker.hs b/gen/Amazonka/Personalize/CreateEventTracker.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateEventTracker.hs
@@ -0,0 +1,263 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateEventTracker
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an event tracker that you use when adding event data to a
+-- specified dataset group using the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_UBS_PutEvents.html PutEvents>
+-- API.
+--
+-- Only one event tracker can be associated with a dataset group. You will
+-- get an error if you call @CreateEventTracker@ using the same dataset
+-- group as an existing event tracker.
+--
+-- When you create an event tracker, the response includes a tracking ID,
+-- which you pass as a parameter when you use the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_UBS_PutEvents.html PutEvents>
+-- operation. Amazon Personalize then appends the event data to the
+-- Interactions dataset of the dataset group you specify in your event
+-- tracker.
+--
+-- The event tracker can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+--
+-- To get the status of the event tracker, call
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeEventTracker.html DescribeEventTracker>.
+--
+-- The event tracker must be in the ACTIVE state before using the tracking
+-- ID.
+--
+-- __Related APIs__
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_ListEventTrackers.html ListEventTrackers>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeEventTracker.html DescribeEventTracker>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DeleteEventTracker.html DeleteEventTracker>
+module Amazonka.Personalize.CreateEventTracker
+  ( -- * Creating a Request
+    CreateEventTracker (..),
+    newCreateEventTracker,
+
+    -- * Request Lenses
+    createEventTracker_tags,
+    createEventTracker_name,
+    createEventTracker_datasetGroupArn,
+
+    -- * Destructuring the Response
+    CreateEventTrackerResponse (..),
+    newCreateEventTrackerResponse,
+
+    -- * Response Lenses
+    createEventTrackerResponse_eventTrackerArn,
+    createEventTrackerResponse_trackingId,
+    createEventTrackerResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateEventTracker' smart constructor.
+data CreateEventTracker = CreateEventTracker'
+  { -- | A list of
+    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+    -- to apply to the event tracker.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name for the event tracker.
+    name :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the dataset group that receives the
+    -- event data.
+    datasetGroupArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateEventTracker' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'createEventTracker_tags' - A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the event tracker.
+--
+-- 'name', 'createEventTracker_name' - The name for the event tracker.
+--
+-- 'datasetGroupArn', 'createEventTracker_datasetGroupArn' - The Amazon Resource Name (ARN) of the dataset group that receives the
+-- event data.
+newCreateEventTracker ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'datasetGroupArn'
+  Prelude.Text ->
+  CreateEventTracker
+newCreateEventTracker pName_ pDatasetGroupArn_ =
+  CreateEventTracker'
+    { tags = Prelude.Nothing,
+      name = pName_,
+      datasetGroupArn = pDatasetGroupArn_
+    }
+
+-- | A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the event tracker.
+createEventTracker_tags :: Lens.Lens' CreateEventTracker (Prelude.Maybe [Tag])
+createEventTracker_tags = Lens.lens (\CreateEventTracker' {tags} -> tags) (\s@CreateEventTracker' {} a -> s {tags = a} :: CreateEventTracker) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name for the event tracker.
+createEventTracker_name :: Lens.Lens' CreateEventTracker Prelude.Text
+createEventTracker_name = Lens.lens (\CreateEventTracker' {name} -> name) (\s@CreateEventTracker' {} a -> s {name = a} :: CreateEventTracker)
+
+-- | The Amazon Resource Name (ARN) of the dataset group that receives the
+-- event data.
+createEventTracker_datasetGroupArn :: Lens.Lens' CreateEventTracker Prelude.Text
+createEventTracker_datasetGroupArn = Lens.lens (\CreateEventTracker' {datasetGroupArn} -> datasetGroupArn) (\s@CreateEventTracker' {} a -> s {datasetGroupArn = a} :: CreateEventTracker)
+
+instance Core.AWSRequest CreateEventTracker where
+  type
+    AWSResponse CreateEventTracker =
+      CreateEventTrackerResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateEventTrackerResponse'
+            Prelude.<$> (x Data..?> "eventTrackerArn")
+            Prelude.<*> (x Data..?> "trackingId")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateEventTracker where
+  hashWithSalt _salt CreateEventTracker' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` datasetGroupArn
+
+instance Prelude.NFData CreateEventTracker where
+  rnf CreateEventTracker' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+
+instance Data.ToHeaders CreateEventTracker where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateEventTracker" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateEventTracker where
+  toJSON CreateEventTracker' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just
+              ("datasetGroupArn" Data..= datasetGroupArn)
+          ]
+      )
+
+instance Data.ToPath CreateEventTracker where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateEventTracker where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateEventTrackerResponse' smart constructor.
+data CreateEventTrackerResponse = CreateEventTrackerResponse'
+  { -- | The ARN of the event tracker.
+    eventTrackerArn :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the event tracker. Include this ID in requests to the
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/API_UBS_PutEvents.html PutEvents>
+    -- API.
+    trackingId :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateEventTrackerResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'eventTrackerArn', 'createEventTrackerResponse_eventTrackerArn' - The ARN of the event tracker.
+--
+-- 'trackingId', 'createEventTrackerResponse_trackingId' - The ID of the event tracker. Include this ID in requests to the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_UBS_PutEvents.html PutEvents>
+-- API.
+--
+-- 'httpStatus', 'createEventTrackerResponse_httpStatus' - The response's http status code.
+newCreateEventTrackerResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateEventTrackerResponse
+newCreateEventTrackerResponse pHttpStatus_ =
+  CreateEventTrackerResponse'
+    { eventTrackerArn =
+        Prelude.Nothing,
+      trackingId = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The ARN of the event tracker.
+createEventTrackerResponse_eventTrackerArn :: Lens.Lens' CreateEventTrackerResponse (Prelude.Maybe Prelude.Text)
+createEventTrackerResponse_eventTrackerArn = Lens.lens (\CreateEventTrackerResponse' {eventTrackerArn} -> eventTrackerArn) (\s@CreateEventTrackerResponse' {} a -> s {eventTrackerArn = a} :: CreateEventTrackerResponse)
+
+-- | The ID of the event tracker. Include this ID in requests to the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_UBS_PutEvents.html PutEvents>
+-- API.
+createEventTrackerResponse_trackingId :: Lens.Lens' CreateEventTrackerResponse (Prelude.Maybe Prelude.Text)
+createEventTrackerResponse_trackingId = Lens.lens (\CreateEventTrackerResponse' {trackingId} -> trackingId) (\s@CreateEventTrackerResponse' {} a -> s {trackingId = a} :: CreateEventTrackerResponse)
+
+-- | The response's http status code.
+createEventTrackerResponse_httpStatus :: Lens.Lens' CreateEventTrackerResponse Prelude.Int
+createEventTrackerResponse_httpStatus = Lens.lens (\CreateEventTrackerResponse' {httpStatus} -> httpStatus) (\s@CreateEventTrackerResponse' {} a -> s {httpStatus = a} :: CreateEventTrackerResponse)
+
+instance Prelude.NFData CreateEventTrackerResponse where
+  rnf CreateEventTrackerResponse' {..} =
+    Prelude.rnf eventTrackerArn
+      `Prelude.seq` Prelude.rnf trackingId
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/CreateFilter.hs b/gen/Amazonka/Personalize/CreateFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateFilter.hs
@@ -0,0 +1,235 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a recommendation filter. For more information, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/filter.html Filtering recommendations and user segments>.
+module Amazonka.Personalize.CreateFilter
+  ( -- * Creating a Request
+    CreateFilter (..),
+    newCreateFilter,
+
+    -- * Request Lenses
+    createFilter_tags,
+    createFilter_name,
+    createFilter_datasetGroupArn,
+    createFilter_filterExpression,
+
+    -- * Destructuring the Response
+    CreateFilterResponse (..),
+    newCreateFilterResponse,
+
+    -- * Response Lenses
+    createFilterResponse_filterArn,
+    createFilterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateFilter' smart constructor.
+data CreateFilter = CreateFilter'
+  { -- | A list of
+    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+    -- to apply to the filter.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name of the filter to create.
+    name :: Prelude.Text,
+    -- | The ARN of the dataset group that the filter will belong to.
+    datasetGroupArn :: Prelude.Text,
+    -- | The filter expression defines which items are included or excluded from
+    -- recommendations. Filter expression must follow specific format rules.
+    -- For information about filter expression structure and syntax, see
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/filter-expressions.html Filter expressions>.
+    filterExpression :: Data.Sensitive Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'createFilter_tags' - A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the filter.
+--
+-- 'name', 'createFilter_name' - The name of the filter to create.
+--
+-- 'datasetGroupArn', 'createFilter_datasetGroupArn' - The ARN of the dataset group that the filter will belong to.
+--
+-- 'filterExpression', 'createFilter_filterExpression' - The filter expression defines which items are included or excluded from
+-- recommendations. Filter expression must follow specific format rules.
+-- For information about filter expression structure and syntax, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/filter-expressions.html Filter expressions>.
+newCreateFilter ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'datasetGroupArn'
+  Prelude.Text ->
+  -- | 'filterExpression'
+  Prelude.Text ->
+  CreateFilter
+newCreateFilter
+  pName_
+  pDatasetGroupArn_
+  pFilterExpression_ =
+    CreateFilter'
+      { tags = Prelude.Nothing,
+        name = pName_,
+        datasetGroupArn = pDatasetGroupArn_,
+        filterExpression =
+          Data._Sensitive Lens.# pFilterExpression_
+      }
+
+-- | A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the filter.
+createFilter_tags :: Lens.Lens' CreateFilter (Prelude.Maybe [Tag])
+createFilter_tags = Lens.lens (\CreateFilter' {tags} -> tags) (\s@CreateFilter' {} a -> s {tags = a} :: CreateFilter) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the filter to create.
+createFilter_name :: Lens.Lens' CreateFilter Prelude.Text
+createFilter_name = Lens.lens (\CreateFilter' {name} -> name) (\s@CreateFilter' {} a -> s {name = a} :: CreateFilter)
+
+-- | The ARN of the dataset group that the filter will belong to.
+createFilter_datasetGroupArn :: Lens.Lens' CreateFilter Prelude.Text
+createFilter_datasetGroupArn = Lens.lens (\CreateFilter' {datasetGroupArn} -> datasetGroupArn) (\s@CreateFilter' {} a -> s {datasetGroupArn = a} :: CreateFilter)
+
+-- | The filter expression defines which items are included or excluded from
+-- recommendations. Filter expression must follow specific format rules.
+-- For information about filter expression structure and syntax, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/filter-expressions.html Filter expressions>.
+createFilter_filterExpression :: Lens.Lens' CreateFilter Prelude.Text
+createFilter_filterExpression = Lens.lens (\CreateFilter' {filterExpression} -> filterExpression) (\s@CreateFilter' {} a -> s {filterExpression = a} :: CreateFilter) Prelude.. Data._Sensitive
+
+instance Core.AWSRequest CreateFilter where
+  type AWSResponse CreateFilter = CreateFilterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateFilterResponse'
+            Prelude.<$> (x Data..?> "filterArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateFilter where
+  hashWithSalt _salt CreateFilter' {..} =
+    _salt
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` filterExpression
+
+instance Prelude.NFData CreateFilter where
+  rnf CreateFilter' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf filterExpression
+
+instance Data.ToHeaders CreateFilter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateFilter" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateFilter where
+  toJSON CreateFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just
+              ("datasetGroupArn" Data..= datasetGroupArn),
+            Prelude.Just
+              ("filterExpression" Data..= filterExpression)
+          ]
+      )
+
+instance Data.ToPath CreateFilter where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateFilter where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateFilterResponse' smart constructor.
+data CreateFilterResponse = CreateFilterResponse'
+  { -- | The ARN of the new filter.
+    filterArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateFilterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filterArn', 'createFilterResponse_filterArn' - The ARN of the new filter.
+--
+-- 'httpStatus', 'createFilterResponse_httpStatus' - The response's http status code.
+newCreateFilterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateFilterResponse
+newCreateFilterResponse pHttpStatus_ =
+  CreateFilterResponse'
+    { filterArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The ARN of the new filter.
+createFilterResponse_filterArn :: Lens.Lens' CreateFilterResponse (Prelude.Maybe Prelude.Text)
+createFilterResponse_filterArn = Lens.lens (\CreateFilterResponse' {filterArn} -> filterArn) (\s@CreateFilterResponse' {} a -> s {filterArn = a} :: CreateFilterResponse)
+
+-- | The response's http status code.
+createFilterResponse_httpStatus :: Lens.Lens' CreateFilterResponse Prelude.Int
+createFilterResponse_httpStatus = Lens.lens (\CreateFilterResponse' {httpStatus} -> httpStatus) (\s@CreateFilterResponse' {} a -> s {httpStatus = a} :: CreateFilterResponse)
+
+instance Prelude.NFData CreateFilterResponse where
+  rnf CreateFilterResponse' {..} =
+    Prelude.rnf filterArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/CreateMetricAttribution.hs b/gen/Amazonka/Personalize/CreateMetricAttribution.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateMetricAttribution.hs
@@ -0,0 +1,243 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateMetricAttribution
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a metric attribution. A metric attribution creates reports on
+-- the data that you import into Amazon Personalize. Depending on how you
+-- imported the data, you can view reports in Amazon CloudWatch or Amazon
+-- S3. For more information, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/measuring-recommendation-impact.html Measuring impact of recommendations>.
+module Amazonka.Personalize.CreateMetricAttribution
+  ( -- * Creating a Request
+    CreateMetricAttribution (..),
+    newCreateMetricAttribution,
+
+    -- * Request Lenses
+    createMetricAttribution_name,
+    createMetricAttribution_datasetGroupArn,
+    createMetricAttribution_metrics,
+    createMetricAttribution_metricsOutputConfig,
+
+    -- * Destructuring the Response
+    CreateMetricAttributionResponse (..),
+    newCreateMetricAttributionResponse,
+
+    -- * Response Lenses
+    createMetricAttributionResponse_metricAttributionArn,
+    createMetricAttributionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateMetricAttribution' smart constructor.
+data CreateMetricAttribution = CreateMetricAttribution'
+  { -- | A name for the metric attribution.
+    name :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the destination dataset group for the
+    -- metric attribution.
+    datasetGroupArn :: Prelude.Text,
+    -- | A list of metric attributes for the metric attribution. Each metric
+    -- attribute specifies an event type to track and a function. Available
+    -- functions are @SUM()@ or @SAMPLECOUNT()@. For SUM() functions, provide
+    -- the dataset type (either Interactions or Items) and column to sum as a
+    -- parameter. For example SUM(Items.PRICE).
+    metrics :: [MetricAttribute],
+    -- | The output configuration details for the metric attribution.
+    metricsOutputConfig :: MetricAttributionOutput
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateMetricAttribution' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'createMetricAttribution_name' - A name for the metric attribution.
+--
+-- 'datasetGroupArn', 'createMetricAttribution_datasetGroupArn' - The Amazon Resource Name (ARN) of the destination dataset group for the
+-- metric attribution.
+--
+-- 'metrics', 'createMetricAttribution_metrics' - A list of metric attributes for the metric attribution. Each metric
+-- attribute specifies an event type to track and a function. Available
+-- functions are @SUM()@ or @SAMPLECOUNT()@. For SUM() functions, provide
+-- the dataset type (either Interactions or Items) and column to sum as a
+-- parameter. For example SUM(Items.PRICE).
+--
+-- 'metricsOutputConfig', 'createMetricAttribution_metricsOutputConfig' - The output configuration details for the metric attribution.
+newCreateMetricAttribution ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'datasetGroupArn'
+  Prelude.Text ->
+  -- | 'metricsOutputConfig'
+  MetricAttributionOutput ->
+  CreateMetricAttribution
+newCreateMetricAttribution
+  pName_
+  pDatasetGroupArn_
+  pMetricsOutputConfig_ =
+    CreateMetricAttribution'
+      { name = pName_,
+        datasetGroupArn = pDatasetGroupArn_,
+        metrics = Prelude.mempty,
+        metricsOutputConfig = pMetricsOutputConfig_
+      }
+
+-- | A name for the metric attribution.
+createMetricAttribution_name :: Lens.Lens' CreateMetricAttribution Prelude.Text
+createMetricAttribution_name = Lens.lens (\CreateMetricAttribution' {name} -> name) (\s@CreateMetricAttribution' {} a -> s {name = a} :: CreateMetricAttribution)
+
+-- | The Amazon Resource Name (ARN) of the destination dataset group for the
+-- metric attribution.
+createMetricAttribution_datasetGroupArn :: Lens.Lens' CreateMetricAttribution Prelude.Text
+createMetricAttribution_datasetGroupArn = Lens.lens (\CreateMetricAttribution' {datasetGroupArn} -> datasetGroupArn) (\s@CreateMetricAttribution' {} a -> s {datasetGroupArn = a} :: CreateMetricAttribution)
+
+-- | A list of metric attributes for the metric attribution. Each metric
+-- attribute specifies an event type to track and a function. Available
+-- functions are @SUM()@ or @SAMPLECOUNT()@. For SUM() functions, provide
+-- the dataset type (either Interactions or Items) and column to sum as a
+-- parameter. For example SUM(Items.PRICE).
+createMetricAttribution_metrics :: Lens.Lens' CreateMetricAttribution [MetricAttribute]
+createMetricAttribution_metrics = Lens.lens (\CreateMetricAttribution' {metrics} -> metrics) (\s@CreateMetricAttribution' {} a -> s {metrics = a} :: CreateMetricAttribution) Prelude.. Lens.coerced
+
+-- | The output configuration details for the metric attribution.
+createMetricAttribution_metricsOutputConfig :: Lens.Lens' CreateMetricAttribution MetricAttributionOutput
+createMetricAttribution_metricsOutputConfig = Lens.lens (\CreateMetricAttribution' {metricsOutputConfig} -> metricsOutputConfig) (\s@CreateMetricAttribution' {} a -> s {metricsOutputConfig = a} :: CreateMetricAttribution)
+
+instance Core.AWSRequest CreateMetricAttribution where
+  type
+    AWSResponse CreateMetricAttribution =
+      CreateMetricAttributionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateMetricAttributionResponse'
+            Prelude.<$> (x Data..?> "metricAttributionArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateMetricAttribution where
+  hashWithSalt _salt CreateMetricAttribution' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` metrics
+      `Prelude.hashWithSalt` metricsOutputConfig
+
+instance Prelude.NFData CreateMetricAttribution where
+  rnf CreateMetricAttribution' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf metrics
+      `Prelude.seq` Prelude.rnf metricsOutputConfig
+
+instance Data.ToHeaders CreateMetricAttribution where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateMetricAttribution" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateMetricAttribution where
+  toJSON CreateMetricAttribution' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("name" Data..= name),
+            Prelude.Just
+              ("datasetGroupArn" Data..= datasetGroupArn),
+            Prelude.Just ("metrics" Data..= metrics),
+            Prelude.Just
+              ("metricsOutputConfig" Data..= metricsOutputConfig)
+          ]
+      )
+
+instance Data.ToPath CreateMetricAttribution where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateMetricAttribution where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateMetricAttributionResponse' smart constructor.
+data CreateMetricAttributionResponse = CreateMetricAttributionResponse'
+  { -- | The Amazon Resource Name (ARN) for the new metric attribution.
+    metricAttributionArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateMetricAttributionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metricAttributionArn', 'createMetricAttributionResponse_metricAttributionArn' - The Amazon Resource Name (ARN) for the new metric attribution.
+--
+-- 'httpStatus', 'createMetricAttributionResponse_httpStatus' - The response's http status code.
+newCreateMetricAttributionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateMetricAttributionResponse
+newCreateMetricAttributionResponse pHttpStatus_ =
+  CreateMetricAttributionResponse'
+    { metricAttributionArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) for the new metric attribution.
+createMetricAttributionResponse_metricAttributionArn :: Lens.Lens' CreateMetricAttributionResponse (Prelude.Maybe Prelude.Text)
+createMetricAttributionResponse_metricAttributionArn = Lens.lens (\CreateMetricAttributionResponse' {metricAttributionArn} -> metricAttributionArn) (\s@CreateMetricAttributionResponse' {} a -> s {metricAttributionArn = a} :: CreateMetricAttributionResponse)
+
+-- | The response's http status code.
+createMetricAttributionResponse_httpStatus :: Lens.Lens' CreateMetricAttributionResponse Prelude.Int
+createMetricAttributionResponse_httpStatus = Lens.lens (\CreateMetricAttributionResponse' {httpStatus} -> httpStatus) (\s@CreateMetricAttributionResponse' {} a -> s {httpStatus = a} :: CreateMetricAttributionResponse)
+
+instance
+  Prelude.NFData
+    CreateMetricAttributionResponse
+  where
+  rnf CreateMetricAttributionResponse' {..} =
+    Prelude.rnf metricAttributionArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/CreateRecommender.hs b/gen/Amazonka/Personalize/CreateRecommender.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateRecommender.hs
@@ -0,0 +1,313 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateRecommender
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates a recommender with the recipe (a Domain dataset group use case)
+-- you specify. You create recommenders for a Domain dataset group and
+-- specify the recommender\'s Amazon Resource Name (ARN) when you make a
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_RS_GetRecommendations.html GetRecommendations>
+-- request.
+--
+-- __Minimum recommendation requests per second__
+--
+-- When you create a recommender, you can configure the recommender\'s
+-- minimum recommendation requests per second. The minimum recommendation
+-- requests per second (@minRecommendationRequestsPerSecond@) specifies the
+-- baseline recommendation request throughput provisioned by Amazon
+-- Personalize. The default minRecommendationRequestsPerSecond is @1@. A
+-- recommendation request is a single @GetRecommendations@ operation.
+-- Request throughput is measured in requests per second and Amazon
+-- Personalize uses your requests per second to derive your requests per
+-- hour and the price of your recommender usage.
+--
+-- If your requests per second increases beyond
+-- @minRecommendationRequestsPerSecond@, Amazon Personalize auto-scales the
+-- provisioned capacity up and down, but never below
+-- @minRecommendationRequestsPerSecond@. There\'s a short time delay while
+-- the capacity is increased that might cause loss of requests.
+--
+-- Your bill is the greater of either the minimum requests per hour (based
+-- on minRecommendationRequestsPerSecond) or the actual number of requests.
+-- The actual request throughput used is calculated as the average
+-- requests\/second within a one-hour window. We recommend starting with
+-- the default @minRecommendationRequestsPerSecond@, track your usage using
+-- Amazon CloudWatch metrics, and then increase the
+-- @minRecommendationRequestsPerSecond@ as necessary.
+--
+-- __Status__
+--
+-- A recommender can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   STOP PENDING > STOP IN_PROGRESS > INACTIVE > START PENDING > START
+--     IN_PROGRESS > ACTIVE
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+--
+-- To get the recommender status, call
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeRecommender.html DescribeRecommender>.
+--
+-- Wait until the @status@ of the recommender is @ACTIVE@ before asking the
+-- recommender for recommendations.
+--
+-- __Related APIs__
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_ListRecommenders.html ListRecommenders>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeRecommender.html DescribeRecommender>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_UpdateRecommender.html UpdateRecommender>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DeleteRecommender.html DeleteRecommender>
+module Amazonka.Personalize.CreateRecommender
+  ( -- * Creating a Request
+    CreateRecommender (..),
+    newCreateRecommender,
+
+    -- * Request Lenses
+    createRecommender_recommenderConfig,
+    createRecommender_tags,
+    createRecommender_name,
+    createRecommender_datasetGroupArn,
+    createRecommender_recipeArn,
+
+    -- * Destructuring the Response
+    CreateRecommenderResponse (..),
+    newCreateRecommenderResponse,
+
+    -- * Response Lenses
+    createRecommenderResponse_recommenderArn,
+    createRecommenderResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateRecommender' smart constructor.
+data CreateRecommender = CreateRecommender'
+  { -- | The configuration details of the recommender.
+    recommenderConfig :: Prelude.Maybe RecommenderConfig,
+    -- | A list of
+    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+    -- to apply to the recommender.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name of the recommender.
+    name :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the destination domain dataset group
+    -- for the recommender.
+    datasetGroupArn :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the recipe that the recommender will
+    -- use. For a recommender, a recipe is a Domain dataset group use case.
+    -- Only Domain dataset group use cases can be used to create a recommender.
+    -- For information about use cases see
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/domain-use-cases.html Choosing recommender use cases>.
+    recipeArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateRecommender' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recommenderConfig', 'createRecommender_recommenderConfig' - The configuration details of the recommender.
+--
+-- 'tags', 'createRecommender_tags' - A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the recommender.
+--
+-- 'name', 'createRecommender_name' - The name of the recommender.
+--
+-- 'datasetGroupArn', 'createRecommender_datasetGroupArn' - The Amazon Resource Name (ARN) of the destination domain dataset group
+-- for the recommender.
+--
+-- 'recipeArn', 'createRecommender_recipeArn' - The Amazon Resource Name (ARN) of the recipe that the recommender will
+-- use. For a recommender, a recipe is a Domain dataset group use case.
+-- Only Domain dataset group use cases can be used to create a recommender.
+-- For information about use cases see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/domain-use-cases.html Choosing recommender use cases>.
+newCreateRecommender ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'datasetGroupArn'
+  Prelude.Text ->
+  -- | 'recipeArn'
+  Prelude.Text ->
+  CreateRecommender
+newCreateRecommender
+  pName_
+  pDatasetGroupArn_
+  pRecipeArn_ =
+    CreateRecommender'
+      { recommenderConfig =
+          Prelude.Nothing,
+        tags = Prelude.Nothing,
+        name = pName_,
+        datasetGroupArn = pDatasetGroupArn_,
+        recipeArn = pRecipeArn_
+      }
+
+-- | The configuration details of the recommender.
+createRecommender_recommenderConfig :: Lens.Lens' CreateRecommender (Prelude.Maybe RecommenderConfig)
+createRecommender_recommenderConfig = Lens.lens (\CreateRecommender' {recommenderConfig} -> recommenderConfig) (\s@CreateRecommender' {} a -> s {recommenderConfig = a} :: CreateRecommender)
+
+-- | A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the recommender.
+createRecommender_tags :: Lens.Lens' CreateRecommender (Prelude.Maybe [Tag])
+createRecommender_tags = Lens.lens (\CreateRecommender' {tags} -> tags) (\s@CreateRecommender' {} a -> s {tags = a} :: CreateRecommender) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the recommender.
+createRecommender_name :: Lens.Lens' CreateRecommender Prelude.Text
+createRecommender_name = Lens.lens (\CreateRecommender' {name} -> name) (\s@CreateRecommender' {} a -> s {name = a} :: CreateRecommender)
+
+-- | The Amazon Resource Name (ARN) of the destination domain dataset group
+-- for the recommender.
+createRecommender_datasetGroupArn :: Lens.Lens' CreateRecommender Prelude.Text
+createRecommender_datasetGroupArn = Lens.lens (\CreateRecommender' {datasetGroupArn} -> datasetGroupArn) (\s@CreateRecommender' {} a -> s {datasetGroupArn = a} :: CreateRecommender)
+
+-- | The Amazon Resource Name (ARN) of the recipe that the recommender will
+-- use. For a recommender, a recipe is a Domain dataset group use case.
+-- Only Domain dataset group use cases can be used to create a recommender.
+-- For information about use cases see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/domain-use-cases.html Choosing recommender use cases>.
+createRecommender_recipeArn :: Lens.Lens' CreateRecommender Prelude.Text
+createRecommender_recipeArn = Lens.lens (\CreateRecommender' {recipeArn} -> recipeArn) (\s@CreateRecommender' {} a -> s {recipeArn = a} :: CreateRecommender)
+
+instance Core.AWSRequest CreateRecommender where
+  type
+    AWSResponse CreateRecommender =
+      CreateRecommenderResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateRecommenderResponse'
+            Prelude.<$> (x Data..?> "recommenderArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateRecommender where
+  hashWithSalt _salt CreateRecommender' {..} =
+    _salt
+      `Prelude.hashWithSalt` recommenderConfig
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` recipeArn
+
+instance Prelude.NFData CreateRecommender where
+  rnf CreateRecommender' {..} =
+    Prelude.rnf recommenderConfig
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf recipeArn
+
+instance Data.ToHeaders CreateRecommender where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateRecommender" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateRecommender where
+  toJSON CreateRecommender' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("recommenderConfig" Data..=)
+              Prelude.<$> recommenderConfig,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just
+              ("datasetGroupArn" Data..= datasetGroupArn),
+            Prelude.Just ("recipeArn" Data..= recipeArn)
+          ]
+      )
+
+instance Data.ToPath CreateRecommender where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateRecommender where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateRecommenderResponse' smart constructor.
+data CreateRecommenderResponse = CreateRecommenderResponse'
+  { -- | The Amazon Resource Name (ARN) of the recommender.
+    recommenderArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateRecommenderResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recommenderArn', 'createRecommenderResponse_recommenderArn' - The Amazon Resource Name (ARN) of the recommender.
+--
+-- 'httpStatus', 'createRecommenderResponse_httpStatus' - The response's http status code.
+newCreateRecommenderResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateRecommenderResponse
+newCreateRecommenderResponse pHttpStatus_ =
+  CreateRecommenderResponse'
+    { recommenderArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the recommender.
+createRecommenderResponse_recommenderArn :: Lens.Lens' CreateRecommenderResponse (Prelude.Maybe Prelude.Text)
+createRecommenderResponse_recommenderArn = Lens.lens (\CreateRecommenderResponse' {recommenderArn} -> recommenderArn) (\s@CreateRecommenderResponse' {} a -> s {recommenderArn = a} :: CreateRecommenderResponse)
+
+-- | The response's http status code.
+createRecommenderResponse_httpStatus :: Lens.Lens' CreateRecommenderResponse Prelude.Int
+createRecommenderResponse_httpStatus = Lens.lens (\CreateRecommenderResponse' {httpStatus} -> httpStatus) (\s@CreateRecommenderResponse' {} a -> s {httpStatus = a} :: CreateRecommenderResponse)
+
+instance Prelude.NFData CreateRecommenderResponse where
+  rnf CreateRecommenderResponse' {..} =
+    Prelude.rnf recommenderArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/CreateSchema.hs b/gen/Amazonka/Personalize/CreateSchema.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateSchema.hs
@@ -0,0 +1,220 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateSchema
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates an Amazon Personalize schema from the specified schema string.
+-- The schema you create must be in Avro JSON format.
+--
+-- Amazon Personalize recognizes three schema variants. Each schema is
+-- associated with a dataset type and has a set of required field and
+-- keywords. If you are creating a schema for a dataset in a Domain dataset
+-- group, you provide the domain of the Domain dataset group. You specify a
+-- schema when you call
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDataset.html CreateDataset>.
+--
+-- __Related APIs__
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_ListSchemas.html ListSchemas>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSchema.html DescribeSchema>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DeleteSchema.html DeleteSchema>
+module Amazonka.Personalize.CreateSchema
+  ( -- * Creating a Request
+    CreateSchema (..),
+    newCreateSchema,
+
+    -- * Request Lenses
+    createSchema_domain,
+    createSchema_name,
+    createSchema_schema,
+
+    -- * Destructuring the Response
+    CreateSchemaResponse (..),
+    newCreateSchemaResponse,
+
+    -- * Response Lenses
+    createSchemaResponse_schemaArn,
+    createSchemaResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateSchema' smart constructor.
+data CreateSchema = CreateSchema'
+  { -- | The domain for the schema. If you are creating a schema for a dataset in
+    -- a Domain dataset group, specify the domain you chose when you created
+    -- the Domain dataset group.
+    domain :: Prelude.Maybe Domain,
+    -- | The name for the schema.
+    name :: Prelude.Text,
+    -- | A schema in Avro JSON format.
+    schema :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSchema' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domain', 'createSchema_domain' - The domain for the schema. If you are creating a schema for a dataset in
+-- a Domain dataset group, specify the domain you chose when you created
+-- the Domain dataset group.
+--
+-- 'name', 'createSchema_name' - The name for the schema.
+--
+-- 'schema', 'createSchema_schema' - A schema in Avro JSON format.
+newCreateSchema ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'schema'
+  Prelude.Text ->
+  CreateSchema
+newCreateSchema pName_ pSchema_ =
+  CreateSchema'
+    { domain = Prelude.Nothing,
+      name = pName_,
+      schema = pSchema_
+    }
+
+-- | The domain for the schema. If you are creating a schema for a dataset in
+-- a Domain dataset group, specify the domain you chose when you created
+-- the Domain dataset group.
+createSchema_domain :: Lens.Lens' CreateSchema (Prelude.Maybe Domain)
+createSchema_domain = Lens.lens (\CreateSchema' {domain} -> domain) (\s@CreateSchema' {} a -> s {domain = a} :: CreateSchema)
+
+-- | The name for the schema.
+createSchema_name :: Lens.Lens' CreateSchema Prelude.Text
+createSchema_name = Lens.lens (\CreateSchema' {name} -> name) (\s@CreateSchema' {} a -> s {name = a} :: CreateSchema)
+
+-- | A schema in Avro JSON format.
+createSchema_schema :: Lens.Lens' CreateSchema Prelude.Text
+createSchema_schema = Lens.lens (\CreateSchema' {schema} -> schema) (\s@CreateSchema' {} a -> s {schema = a} :: CreateSchema)
+
+instance Core.AWSRequest CreateSchema where
+  type AWSResponse CreateSchema = CreateSchemaResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateSchemaResponse'
+            Prelude.<$> (x Data..?> "schemaArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateSchema where
+  hashWithSalt _salt CreateSchema' {..} =
+    _salt
+      `Prelude.hashWithSalt` domain
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` schema
+
+instance Prelude.NFData CreateSchema where
+  rnf CreateSchema' {..} =
+    Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf schema
+
+instance Data.ToHeaders CreateSchema where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateSchema" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateSchema where
+  toJSON CreateSchema' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("domain" Data..=) Prelude.<$> domain,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just ("schema" Data..= schema)
+          ]
+      )
+
+instance Data.ToPath CreateSchema where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateSchema where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateSchemaResponse' smart constructor.
+data CreateSchemaResponse = CreateSchemaResponse'
+  { -- | The Amazon Resource Name (ARN) of the created schema.
+    schemaArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSchemaResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'schemaArn', 'createSchemaResponse_schemaArn' - The Amazon Resource Name (ARN) of the created schema.
+--
+-- 'httpStatus', 'createSchemaResponse_httpStatus' - The response's http status code.
+newCreateSchemaResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateSchemaResponse
+newCreateSchemaResponse pHttpStatus_ =
+  CreateSchemaResponse'
+    { schemaArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the created schema.
+createSchemaResponse_schemaArn :: Lens.Lens' CreateSchemaResponse (Prelude.Maybe Prelude.Text)
+createSchemaResponse_schemaArn = Lens.lens (\CreateSchemaResponse' {schemaArn} -> schemaArn) (\s@CreateSchemaResponse' {} a -> s {schemaArn = a} :: CreateSchemaResponse)
+
+-- | The response's http status code.
+createSchemaResponse_httpStatus :: Lens.Lens' CreateSchemaResponse Prelude.Int
+createSchemaResponse_httpStatus = Lens.lens (\CreateSchemaResponse' {httpStatus} -> httpStatus) (\s@CreateSchemaResponse' {} a -> s {httpStatus = a} :: CreateSchemaResponse)
+
+instance Prelude.NFData CreateSchemaResponse where
+  rnf CreateSchemaResponse' {..} =
+    Prelude.rnf schemaArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/CreateSolution.hs b/gen/Amazonka/Personalize/CreateSolution.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateSolution.hs
@@ -0,0 +1,397 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateSolution
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Creates the configuration for training a model. A trained model is known
+-- as a solution. After the configuration is created, you train the model
+-- (create a solution) by calling the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolutionVersion.html CreateSolutionVersion>
+-- operation. Every time you call @CreateSolutionVersion@, a new version of
+-- the solution is created.
+--
+-- After creating a solution version, you check its accuracy by calling
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_GetSolutionMetrics.html GetSolutionMetrics>.
+-- When you are satisfied with the version, you deploy it using
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateCampaign.html CreateCampaign>.
+-- The campaign provides recommendations to a client through the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_RS_GetRecommendations.html GetRecommendations>
+-- API.
+--
+-- To train a model, Amazon Personalize requires training data and a
+-- recipe. The training data comes from the dataset group that you provide
+-- in the request. A recipe specifies the training algorithm and a feature
+-- transformation. You can specify one of the predefined recipes provided
+-- by Amazon Personalize. Alternatively, you can specify @performAutoML@
+-- and Amazon Personalize will analyze your data and select the optimum
+-- USER_PERSONALIZATION recipe for you.
+--
+-- Amazon Personalize doesn\'t support configuring the @hpoObjective@ for
+-- solution hyperparameter optimization at this time.
+--
+-- __Status__
+--
+-- A solution can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+--
+-- To get the status of the solution, call
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSolution.html DescribeSolution>.
+-- Wait until the status shows as ACTIVE before calling
+-- @CreateSolutionVersion@.
+--
+-- __Related APIs__
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_ListSolutions.html ListSolutions>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolutionVersion.html CreateSolutionVersion>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSolution.html DescribeSolution>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DeleteSolution.html DeleteSolution>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_ListSolutionVersions.html ListSolutionVersions>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSolutionVersion.html DescribeSolutionVersion>
+module Amazonka.Personalize.CreateSolution
+  ( -- * Creating a Request
+    CreateSolution (..),
+    newCreateSolution,
+
+    -- * Request Lenses
+    createSolution_eventType,
+    createSolution_performAutoML,
+    createSolution_performHPO,
+    createSolution_recipeArn,
+    createSolution_solutionConfig,
+    createSolution_tags,
+    createSolution_name,
+    createSolution_datasetGroupArn,
+
+    -- * Destructuring the Response
+    CreateSolutionResponse (..),
+    newCreateSolutionResponse,
+
+    -- * Response Lenses
+    createSolutionResponse_solutionArn,
+    createSolutionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateSolution' smart constructor.
+data CreateSolution = CreateSolution'
+  { -- | When your have multiple event types (using an @EVENT_TYPE@ schema
+    -- field), this parameter specifies which event type (for example,
+    -- \'click\' or \'like\') is used for training the model.
+    --
+    -- If you do not provide an @eventType@, Amazon Personalize will use all
+    -- interactions for training with equal weight regardless of type.
+    eventType :: Prelude.Maybe Prelude.Text,
+    -- | Whether to perform automated machine learning (AutoML). The default is
+    -- @false@. For this case, you must specify @recipeArn@.
+    --
+    -- When set to @true@, Amazon Personalize analyzes your training data and
+    -- selects the optimal USER_PERSONALIZATION recipe and hyperparameters. In
+    -- this case, you must omit @recipeArn@. Amazon Personalize determines the
+    -- optimal recipe by running tests with different values for the
+    -- hyperparameters. AutoML lengthens the training process as compared to
+    -- selecting a specific recipe.
+    performAutoML :: Prelude.Maybe Prelude.Bool,
+    -- | Whether to perform hyperparameter optimization (HPO) on the specified or
+    -- selected recipe. The default is @false@.
+    --
+    -- When performing AutoML, this parameter is always @true@ and you should
+    -- not set it to @false@.
+    performHPO :: Prelude.Maybe Prelude.Bool,
+    -- | The ARN of the recipe to use for model training. Only specified when
+    -- @performAutoML@ is false.
+    recipeArn :: Prelude.Maybe Prelude.Text,
+    -- | The configuration to use with the solution. When @performAutoML@ is set
+    -- to true, Amazon Personalize only evaluates the @autoMLConfig@ section of
+    -- the solution configuration.
+    --
+    -- Amazon Personalize doesn\'t support configuring the @hpoObjective@ at
+    -- this time.
+    solutionConfig :: Prelude.Maybe SolutionConfig,
+    -- | A list of
+    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+    -- to apply to the solution.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name for the solution.
+    name :: Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the dataset group that provides the
+    -- training data.
+    datasetGroupArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSolution' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'eventType', 'createSolution_eventType' - When your have multiple event types (using an @EVENT_TYPE@ schema
+-- field), this parameter specifies which event type (for example,
+-- \'click\' or \'like\') is used for training the model.
+--
+-- If you do not provide an @eventType@, Amazon Personalize will use all
+-- interactions for training with equal weight regardless of type.
+--
+-- 'performAutoML', 'createSolution_performAutoML' - Whether to perform automated machine learning (AutoML). The default is
+-- @false@. For this case, you must specify @recipeArn@.
+--
+-- When set to @true@, Amazon Personalize analyzes your training data and
+-- selects the optimal USER_PERSONALIZATION recipe and hyperparameters. In
+-- this case, you must omit @recipeArn@. Amazon Personalize determines the
+-- optimal recipe by running tests with different values for the
+-- hyperparameters. AutoML lengthens the training process as compared to
+-- selecting a specific recipe.
+--
+-- 'performHPO', 'createSolution_performHPO' - Whether to perform hyperparameter optimization (HPO) on the specified or
+-- selected recipe. The default is @false@.
+--
+-- When performing AutoML, this parameter is always @true@ and you should
+-- not set it to @false@.
+--
+-- 'recipeArn', 'createSolution_recipeArn' - The ARN of the recipe to use for model training. Only specified when
+-- @performAutoML@ is false.
+--
+-- 'solutionConfig', 'createSolution_solutionConfig' - The configuration to use with the solution. When @performAutoML@ is set
+-- to true, Amazon Personalize only evaluates the @autoMLConfig@ section of
+-- the solution configuration.
+--
+-- Amazon Personalize doesn\'t support configuring the @hpoObjective@ at
+-- this time.
+--
+-- 'tags', 'createSolution_tags' - A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the solution.
+--
+-- 'name', 'createSolution_name' - The name for the solution.
+--
+-- 'datasetGroupArn', 'createSolution_datasetGroupArn' - The Amazon Resource Name (ARN) of the dataset group that provides the
+-- training data.
+newCreateSolution ::
+  -- | 'name'
+  Prelude.Text ->
+  -- | 'datasetGroupArn'
+  Prelude.Text ->
+  CreateSolution
+newCreateSolution pName_ pDatasetGroupArn_ =
+  CreateSolution'
+    { eventType = Prelude.Nothing,
+      performAutoML = Prelude.Nothing,
+      performHPO = Prelude.Nothing,
+      recipeArn = Prelude.Nothing,
+      solutionConfig = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      name = pName_,
+      datasetGroupArn = pDatasetGroupArn_
+    }
+
+-- | When your have multiple event types (using an @EVENT_TYPE@ schema
+-- field), this parameter specifies which event type (for example,
+-- \'click\' or \'like\') is used for training the model.
+--
+-- If you do not provide an @eventType@, Amazon Personalize will use all
+-- interactions for training with equal weight regardless of type.
+createSolution_eventType :: Lens.Lens' CreateSolution (Prelude.Maybe Prelude.Text)
+createSolution_eventType = Lens.lens (\CreateSolution' {eventType} -> eventType) (\s@CreateSolution' {} a -> s {eventType = a} :: CreateSolution)
+
+-- | Whether to perform automated machine learning (AutoML). The default is
+-- @false@. For this case, you must specify @recipeArn@.
+--
+-- When set to @true@, Amazon Personalize analyzes your training data and
+-- selects the optimal USER_PERSONALIZATION recipe and hyperparameters. In
+-- this case, you must omit @recipeArn@. Amazon Personalize determines the
+-- optimal recipe by running tests with different values for the
+-- hyperparameters. AutoML lengthens the training process as compared to
+-- selecting a specific recipe.
+createSolution_performAutoML :: Lens.Lens' CreateSolution (Prelude.Maybe Prelude.Bool)
+createSolution_performAutoML = Lens.lens (\CreateSolution' {performAutoML} -> performAutoML) (\s@CreateSolution' {} a -> s {performAutoML = a} :: CreateSolution)
+
+-- | Whether to perform hyperparameter optimization (HPO) on the specified or
+-- selected recipe. The default is @false@.
+--
+-- When performing AutoML, this parameter is always @true@ and you should
+-- not set it to @false@.
+createSolution_performHPO :: Lens.Lens' CreateSolution (Prelude.Maybe Prelude.Bool)
+createSolution_performHPO = Lens.lens (\CreateSolution' {performHPO} -> performHPO) (\s@CreateSolution' {} a -> s {performHPO = a} :: CreateSolution)
+
+-- | The ARN of the recipe to use for model training. Only specified when
+-- @performAutoML@ is false.
+createSolution_recipeArn :: Lens.Lens' CreateSolution (Prelude.Maybe Prelude.Text)
+createSolution_recipeArn = Lens.lens (\CreateSolution' {recipeArn} -> recipeArn) (\s@CreateSolution' {} a -> s {recipeArn = a} :: CreateSolution)
+
+-- | The configuration to use with the solution. When @performAutoML@ is set
+-- to true, Amazon Personalize only evaluates the @autoMLConfig@ section of
+-- the solution configuration.
+--
+-- Amazon Personalize doesn\'t support configuring the @hpoObjective@ at
+-- this time.
+createSolution_solutionConfig :: Lens.Lens' CreateSolution (Prelude.Maybe SolutionConfig)
+createSolution_solutionConfig = Lens.lens (\CreateSolution' {solutionConfig} -> solutionConfig) (\s@CreateSolution' {} a -> s {solutionConfig = a} :: CreateSolution)
+
+-- | A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the solution.
+createSolution_tags :: Lens.Lens' CreateSolution (Prelude.Maybe [Tag])
+createSolution_tags = Lens.lens (\CreateSolution' {tags} -> tags) (\s@CreateSolution' {} a -> s {tags = a} :: CreateSolution) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name for the solution.
+createSolution_name :: Lens.Lens' CreateSolution Prelude.Text
+createSolution_name = Lens.lens (\CreateSolution' {name} -> name) (\s@CreateSolution' {} a -> s {name = a} :: CreateSolution)
+
+-- | The Amazon Resource Name (ARN) of the dataset group that provides the
+-- training data.
+createSolution_datasetGroupArn :: Lens.Lens' CreateSolution Prelude.Text
+createSolution_datasetGroupArn = Lens.lens (\CreateSolution' {datasetGroupArn} -> datasetGroupArn) (\s@CreateSolution' {} a -> s {datasetGroupArn = a} :: CreateSolution)
+
+instance Core.AWSRequest CreateSolution where
+  type
+    AWSResponse CreateSolution =
+      CreateSolutionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateSolutionResponse'
+            Prelude.<$> (x Data..?> "solutionArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateSolution where
+  hashWithSalt _salt CreateSolution' {..} =
+    _salt
+      `Prelude.hashWithSalt` eventType
+      `Prelude.hashWithSalt` performAutoML
+      `Prelude.hashWithSalt` performHPO
+      `Prelude.hashWithSalt` recipeArn
+      `Prelude.hashWithSalt` solutionConfig
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` datasetGroupArn
+
+instance Prelude.NFData CreateSolution where
+  rnf CreateSolution' {..} =
+    Prelude.rnf eventType
+      `Prelude.seq` Prelude.rnf performAutoML
+      `Prelude.seq` Prelude.rnf performHPO
+      `Prelude.seq` Prelude.rnf recipeArn
+      `Prelude.seq` Prelude.rnf solutionConfig
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+
+instance Data.ToHeaders CreateSolution where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateSolution" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateSolution where
+  toJSON CreateSolution' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("eventType" Data..=) Prelude.<$> eventType,
+            ("performAutoML" Data..=) Prelude.<$> performAutoML,
+            ("performHPO" Data..=) Prelude.<$> performHPO,
+            ("recipeArn" Data..=) Prelude.<$> recipeArn,
+            ("solutionConfig" Data..=)
+              Prelude.<$> solutionConfig,
+            ("tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("name" Data..= name),
+            Prelude.Just
+              ("datasetGroupArn" Data..= datasetGroupArn)
+          ]
+      )
+
+instance Data.ToPath CreateSolution where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateSolution where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateSolutionResponse' smart constructor.
+data CreateSolutionResponse = CreateSolutionResponse'
+  { -- | The ARN of the solution.
+    solutionArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSolutionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'solutionArn', 'createSolutionResponse_solutionArn' - The ARN of the solution.
+--
+-- 'httpStatus', 'createSolutionResponse_httpStatus' - The response's http status code.
+newCreateSolutionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateSolutionResponse
+newCreateSolutionResponse pHttpStatus_ =
+  CreateSolutionResponse'
+    { solutionArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The ARN of the solution.
+createSolutionResponse_solutionArn :: Lens.Lens' CreateSolutionResponse (Prelude.Maybe Prelude.Text)
+createSolutionResponse_solutionArn = Lens.lens (\CreateSolutionResponse' {solutionArn} -> solutionArn) (\s@CreateSolutionResponse' {} a -> s {solutionArn = a} :: CreateSolutionResponse)
+
+-- | The response's http status code.
+createSolutionResponse_httpStatus :: Lens.Lens' CreateSolutionResponse Prelude.Int
+createSolutionResponse_httpStatus = Lens.lens (\CreateSolutionResponse' {httpStatus} -> httpStatus) (\s@CreateSolutionResponse' {} a -> s {httpStatus = a} :: CreateSolutionResponse)
+
+instance Prelude.NFData CreateSolutionResponse where
+  rnf CreateSolutionResponse' {..} =
+    Prelude.rnf solutionArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/CreateSolutionVersion.hs b/gen/Amazonka/Personalize/CreateSolutionVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/CreateSolutionVersion.hs
@@ -0,0 +1,302 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.CreateSolutionVersion
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Trains or retrains an active solution in a Custom dataset group. A
+-- solution is created using the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolution.html CreateSolution>
+-- operation and must be in the ACTIVE state before calling
+-- @CreateSolutionVersion@. A new version of the solution is created every
+-- time you call this operation.
+--
+-- __Status__
+--
+-- A solution version can be in one of the following states:
+--
+-- -   CREATE PENDING
+--
+-- -   CREATE IN_PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+--
+-- -   CREATE STOPPING
+--
+-- -   CREATE STOPPED
+--
+-- To get the status of the version, call
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSolutionVersion.html DescribeSolutionVersion>.
+-- Wait until the status shows as ACTIVE before calling @CreateCampaign@.
+--
+-- If the status shows as CREATE FAILED, the response includes a
+-- @failureReason@ key, which describes why the job failed.
+--
+-- __Related APIs__
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_ListSolutionVersions.html ListSolutionVersions>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSolutionVersion.html DescribeSolutionVersion>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_ListSolutions.html ListSolutions>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolution.html CreateSolution>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSolution.html DescribeSolution>
+--
+-- -   <https://docs.aws.amazon.com/personalize/latest/dg/API_DeleteSolution.html DeleteSolution>
+module Amazonka.Personalize.CreateSolutionVersion
+  ( -- * Creating a Request
+    CreateSolutionVersion (..),
+    newCreateSolutionVersion,
+
+    -- * Request Lenses
+    createSolutionVersion_name,
+    createSolutionVersion_tags,
+    createSolutionVersion_trainingMode,
+    createSolutionVersion_solutionArn,
+
+    -- * Destructuring the Response
+    CreateSolutionVersionResponse (..),
+    newCreateSolutionVersionResponse,
+
+    -- * Response Lenses
+    createSolutionVersionResponse_solutionVersionArn,
+    createSolutionVersionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateSolutionVersion' smart constructor.
+data CreateSolutionVersion = CreateSolutionVersion'
+  { -- | The name of the solution version.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | A list of
+    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+    -- to apply to the solution version.
+    tags :: Prelude.Maybe [Tag],
+    -- | The scope of training to be performed when creating the solution
+    -- version. The @FULL@ option trains the solution version based on the
+    -- entirety of the input solution\'s training data, while the @UPDATE@
+    -- option processes only the data that has changed in comparison to the
+    -- input solution. Choose @UPDATE@ when you want to incrementally update
+    -- your solution version instead of creating an entirely new one.
+    --
+    -- The @UPDATE@ option can only be used when you already have an active
+    -- solution version created from the input solution using the @FULL@ option
+    -- and the input solution was trained with the
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html User-Personalization>
+    -- recipe or the
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-hrnn-coldstart.html HRNN-Coldstart>
+    -- recipe.
+    trainingMode :: Prelude.Maybe TrainingMode,
+    -- | The Amazon Resource Name (ARN) of the solution containing the training
+    -- configuration information.
+    solutionArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSolutionVersion' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'createSolutionVersion_name' - The name of the solution version.
+--
+-- 'tags', 'createSolutionVersion_tags' - A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the solution version.
+--
+-- 'trainingMode', 'createSolutionVersion_trainingMode' - The scope of training to be performed when creating the solution
+-- version. The @FULL@ option trains the solution version based on the
+-- entirety of the input solution\'s training data, while the @UPDATE@
+-- option processes only the data that has changed in comparison to the
+-- input solution. Choose @UPDATE@ when you want to incrementally update
+-- your solution version instead of creating an entirely new one.
+--
+-- The @UPDATE@ option can only be used when you already have an active
+-- solution version created from the input solution using the @FULL@ option
+-- and the input solution was trained with the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html User-Personalization>
+-- recipe or the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-hrnn-coldstart.html HRNN-Coldstart>
+-- recipe.
+--
+-- 'solutionArn', 'createSolutionVersion_solutionArn' - The Amazon Resource Name (ARN) of the solution containing the training
+-- configuration information.
+newCreateSolutionVersion ::
+  -- | 'solutionArn'
+  Prelude.Text ->
+  CreateSolutionVersion
+newCreateSolutionVersion pSolutionArn_ =
+  CreateSolutionVersion'
+    { name = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      trainingMode = Prelude.Nothing,
+      solutionArn = pSolutionArn_
+    }
+
+-- | The name of the solution version.
+createSolutionVersion_name :: Lens.Lens' CreateSolutionVersion (Prelude.Maybe Prelude.Text)
+createSolutionVersion_name = Lens.lens (\CreateSolutionVersion' {name} -> name) (\s@CreateSolutionVersion' {} a -> s {name = a} :: CreateSolutionVersion)
+
+-- | A list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- to apply to the solution version.
+createSolutionVersion_tags :: Lens.Lens' CreateSolutionVersion (Prelude.Maybe [Tag])
+createSolutionVersion_tags = Lens.lens (\CreateSolutionVersion' {tags} -> tags) (\s@CreateSolutionVersion' {} a -> s {tags = a} :: CreateSolutionVersion) Prelude.. Lens.mapping Lens.coerced
+
+-- | The scope of training to be performed when creating the solution
+-- version. The @FULL@ option trains the solution version based on the
+-- entirety of the input solution\'s training data, while the @UPDATE@
+-- option processes only the data that has changed in comparison to the
+-- input solution. Choose @UPDATE@ when you want to incrementally update
+-- your solution version instead of creating an entirely new one.
+--
+-- The @UPDATE@ option can only be used when you already have an active
+-- solution version created from the input solution using the @FULL@ option
+-- and the input solution was trained with the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html User-Personalization>
+-- recipe or the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-hrnn-coldstart.html HRNN-Coldstart>
+-- recipe.
+createSolutionVersion_trainingMode :: Lens.Lens' CreateSolutionVersion (Prelude.Maybe TrainingMode)
+createSolutionVersion_trainingMode = Lens.lens (\CreateSolutionVersion' {trainingMode} -> trainingMode) (\s@CreateSolutionVersion' {} a -> s {trainingMode = a} :: CreateSolutionVersion)
+
+-- | The Amazon Resource Name (ARN) of the solution containing the training
+-- configuration information.
+createSolutionVersion_solutionArn :: Lens.Lens' CreateSolutionVersion Prelude.Text
+createSolutionVersion_solutionArn = Lens.lens (\CreateSolutionVersion' {solutionArn} -> solutionArn) (\s@CreateSolutionVersion' {} a -> s {solutionArn = a} :: CreateSolutionVersion)
+
+instance Core.AWSRequest CreateSolutionVersion where
+  type
+    AWSResponse CreateSolutionVersion =
+      CreateSolutionVersionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateSolutionVersionResponse'
+            Prelude.<$> (x Data..?> "solutionVersionArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateSolutionVersion where
+  hashWithSalt _salt CreateSolutionVersion' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` trainingMode
+      `Prelude.hashWithSalt` solutionArn
+
+instance Prelude.NFData CreateSolutionVersion where
+  rnf CreateSolutionVersion' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf trainingMode
+      `Prelude.seq` Prelude.rnf solutionArn
+
+instance Data.ToHeaders CreateSolutionVersion where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.CreateSolutionVersion" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON CreateSolutionVersion where
+  toJSON CreateSolutionVersion' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("name" Data..=) Prelude.<$> name,
+            ("tags" Data..=) Prelude.<$> tags,
+            ("trainingMode" Data..=) Prelude.<$> trainingMode,
+            Prelude.Just ("solutionArn" Data..= solutionArn)
+          ]
+      )
+
+instance Data.ToPath CreateSolutionVersion where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery CreateSolutionVersion where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateSolutionVersionResponse' smart constructor.
+data CreateSolutionVersionResponse = CreateSolutionVersionResponse'
+  { -- | The ARN of the new solution version.
+    solutionVersionArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateSolutionVersionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'solutionVersionArn', 'createSolutionVersionResponse_solutionVersionArn' - The ARN of the new solution version.
+--
+-- 'httpStatus', 'createSolutionVersionResponse_httpStatus' - The response's http status code.
+newCreateSolutionVersionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateSolutionVersionResponse
+newCreateSolutionVersionResponse pHttpStatus_ =
+  CreateSolutionVersionResponse'
+    { solutionVersionArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The ARN of the new solution version.
+createSolutionVersionResponse_solutionVersionArn :: Lens.Lens' CreateSolutionVersionResponse (Prelude.Maybe Prelude.Text)
+createSolutionVersionResponse_solutionVersionArn = Lens.lens (\CreateSolutionVersionResponse' {solutionVersionArn} -> solutionVersionArn) (\s@CreateSolutionVersionResponse' {} a -> s {solutionVersionArn = a} :: CreateSolutionVersionResponse)
+
+-- | The response's http status code.
+createSolutionVersionResponse_httpStatus :: Lens.Lens' CreateSolutionVersionResponse Prelude.Int
+createSolutionVersionResponse_httpStatus = Lens.lens (\CreateSolutionVersionResponse' {httpStatus} -> httpStatus) (\s@CreateSolutionVersionResponse' {} a -> s {httpStatus = a} :: CreateSolutionVersionResponse)
+
+instance Prelude.NFData CreateSolutionVersionResponse where
+  rnf CreateSolutionVersionResponse' {..} =
+    Prelude.rnf solutionVersionArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DeleteCampaign.hs b/gen/Amazonka/Personalize/DeleteCampaign.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DeleteCampaign.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DeleteCampaign
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Removes a campaign by deleting the solution deployment. The solution
+-- that the campaign is based on is not deleted and can be redeployed when
+-- needed. A deleted campaign can no longer be specified in a
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_RS_GetRecommendations.html GetRecommendations>
+-- request. For information on creating campaigns, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateCampaign.html CreateCampaign>.
+module Amazonka.Personalize.DeleteCampaign
+  ( -- * Creating a Request
+    DeleteCampaign (..),
+    newDeleteCampaign,
+
+    -- * Request Lenses
+    deleteCampaign_campaignArn,
+
+    -- * Destructuring the Response
+    DeleteCampaignResponse (..),
+    newDeleteCampaignResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteCampaign' smart constructor.
+data DeleteCampaign = DeleteCampaign'
+  { -- | The Amazon Resource Name (ARN) of the campaign to delete.
+    campaignArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteCampaign' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'campaignArn', 'deleteCampaign_campaignArn' - The Amazon Resource Name (ARN) of the campaign to delete.
+newDeleteCampaign ::
+  -- | 'campaignArn'
+  Prelude.Text ->
+  DeleteCampaign
+newDeleteCampaign pCampaignArn_ =
+  DeleteCampaign' {campaignArn = pCampaignArn_}
+
+-- | The Amazon Resource Name (ARN) of the campaign to delete.
+deleteCampaign_campaignArn :: Lens.Lens' DeleteCampaign Prelude.Text
+deleteCampaign_campaignArn = Lens.lens (\DeleteCampaign' {campaignArn} -> campaignArn) (\s@DeleteCampaign' {} a -> s {campaignArn = a} :: DeleteCampaign)
+
+instance Core.AWSRequest DeleteCampaign where
+  type
+    AWSResponse DeleteCampaign =
+      DeleteCampaignResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteCampaignResponse'
+
+instance Prelude.Hashable DeleteCampaign where
+  hashWithSalt _salt DeleteCampaign' {..} =
+    _salt `Prelude.hashWithSalt` campaignArn
+
+instance Prelude.NFData DeleteCampaign where
+  rnf DeleteCampaign' {..} = Prelude.rnf campaignArn
+
+instance Data.ToHeaders DeleteCampaign where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DeleteCampaign" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteCampaign where
+  toJSON DeleteCampaign' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("campaignArn" Data..= campaignArn)]
+      )
+
+instance Data.ToPath DeleteCampaign where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteCampaign where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteCampaignResponse' smart constructor.
+data DeleteCampaignResponse = DeleteCampaignResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteCampaignResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteCampaignResponse ::
+  DeleteCampaignResponse
+newDeleteCampaignResponse = DeleteCampaignResponse'
+
+instance Prelude.NFData DeleteCampaignResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/Personalize/DeleteDataset.hs b/gen/Amazonka/Personalize/DeleteDataset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DeleteDataset.hs
@@ -0,0 +1,135 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DeleteDataset
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a dataset. You can\'t delete a dataset if an associated
+-- @DatasetImportJob@ or @SolutionVersion@ is in the CREATE PENDING or IN
+-- PROGRESS state. For more information on datasets, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDataset.html CreateDataset>.
+module Amazonka.Personalize.DeleteDataset
+  ( -- * Creating a Request
+    DeleteDataset (..),
+    newDeleteDataset,
+
+    -- * Request Lenses
+    deleteDataset_datasetArn,
+
+    -- * Destructuring the Response
+    DeleteDatasetResponse (..),
+    newDeleteDatasetResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteDataset' smart constructor.
+data DeleteDataset = DeleteDataset'
+  { -- | The Amazon Resource Name (ARN) of the dataset to delete.
+    datasetArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDataset' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetArn', 'deleteDataset_datasetArn' - The Amazon Resource Name (ARN) of the dataset to delete.
+newDeleteDataset ::
+  -- | 'datasetArn'
+  Prelude.Text ->
+  DeleteDataset
+newDeleteDataset pDatasetArn_ =
+  DeleteDataset' {datasetArn = pDatasetArn_}
+
+-- | The Amazon Resource Name (ARN) of the dataset to delete.
+deleteDataset_datasetArn :: Lens.Lens' DeleteDataset Prelude.Text
+deleteDataset_datasetArn = Lens.lens (\DeleteDataset' {datasetArn} -> datasetArn) (\s@DeleteDataset' {} a -> s {datasetArn = a} :: DeleteDataset)
+
+instance Core.AWSRequest DeleteDataset where
+  type
+    AWSResponse DeleteDataset =
+      DeleteDatasetResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteDatasetResponse'
+
+instance Prelude.Hashable DeleteDataset where
+  hashWithSalt _salt DeleteDataset' {..} =
+    _salt `Prelude.hashWithSalt` datasetArn
+
+instance Prelude.NFData DeleteDataset where
+  rnf DeleteDataset' {..} = Prelude.rnf datasetArn
+
+instance Data.ToHeaders DeleteDataset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DeleteDataset" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteDataset where
+  toJSON DeleteDataset' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("datasetArn" Data..= datasetArn)]
+      )
+
+instance Data.ToPath DeleteDataset where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteDataset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteDatasetResponse' smart constructor.
+data DeleteDatasetResponse = DeleteDatasetResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDatasetResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteDatasetResponse ::
+  DeleteDatasetResponse
+newDeleteDatasetResponse = DeleteDatasetResponse'
+
+instance Prelude.NFData DeleteDatasetResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/Personalize/DeleteDatasetGroup.hs b/gen/Amazonka/Personalize/DeleteDatasetGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DeleteDatasetGroup.hs
@@ -0,0 +1,146 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DeleteDatasetGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a dataset group. Before you delete a dataset group, you must
+-- delete the following:
+--
+-- -   All associated event trackers.
+--
+-- -   All associated solutions.
+--
+-- -   All datasets in the dataset group.
+module Amazonka.Personalize.DeleteDatasetGroup
+  ( -- * Creating a Request
+    DeleteDatasetGroup (..),
+    newDeleteDatasetGroup,
+
+    -- * Request Lenses
+    deleteDatasetGroup_datasetGroupArn,
+
+    -- * Destructuring the Response
+    DeleteDatasetGroupResponse (..),
+    newDeleteDatasetGroupResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteDatasetGroup' smart constructor.
+data DeleteDatasetGroup = DeleteDatasetGroup'
+  { -- | The ARN of the dataset group to delete.
+    datasetGroupArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDatasetGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetGroupArn', 'deleteDatasetGroup_datasetGroupArn' - The ARN of the dataset group to delete.
+newDeleteDatasetGroup ::
+  -- | 'datasetGroupArn'
+  Prelude.Text ->
+  DeleteDatasetGroup
+newDeleteDatasetGroup pDatasetGroupArn_ =
+  DeleteDatasetGroup'
+    { datasetGroupArn =
+        pDatasetGroupArn_
+    }
+
+-- | The ARN of the dataset group to delete.
+deleteDatasetGroup_datasetGroupArn :: Lens.Lens' DeleteDatasetGroup Prelude.Text
+deleteDatasetGroup_datasetGroupArn = Lens.lens (\DeleteDatasetGroup' {datasetGroupArn} -> datasetGroupArn) (\s@DeleteDatasetGroup' {} a -> s {datasetGroupArn = a} :: DeleteDatasetGroup)
+
+instance Core.AWSRequest DeleteDatasetGroup where
+  type
+    AWSResponse DeleteDatasetGroup =
+      DeleteDatasetGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteDatasetGroupResponse'
+
+instance Prelude.Hashable DeleteDatasetGroup where
+  hashWithSalt _salt DeleteDatasetGroup' {..} =
+    _salt `Prelude.hashWithSalt` datasetGroupArn
+
+instance Prelude.NFData DeleteDatasetGroup where
+  rnf DeleteDatasetGroup' {..} =
+    Prelude.rnf datasetGroupArn
+
+instance Data.ToHeaders DeleteDatasetGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DeleteDatasetGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteDatasetGroup where
+  toJSON DeleteDatasetGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("datasetGroupArn" Data..= datasetGroupArn)
+          ]
+      )
+
+instance Data.ToPath DeleteDatasetGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteDatasetGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteDatasetGroupResponse' smart constructor.
+data DeleteDatasetGroupResponse = DeleteDatasetGroupResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteDatasetGroupResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteDatasetGroupResponse ::
+  DeleteDatasetGroupResponse
+newDeleteDatasetGroupResponse =
+  DeleteDatasetGroupResponse'
+
+instance Prelude.NFData DeleteDatasetGroupResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/Personalize/DeleteEventTracker.hs b/gen/Amazonka/Personalize/DeleteEventTracker.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DeleteEventTracker.hs
@@ -0,0 +1,142 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DeleteEventTracker
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes the event tracker. Does not delete the event-interactions
+-- dataset from the associated dataset group. For more information on event
+-- trackers, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateEventTracker.html CreateEventTracker>.
+module Amazonka.Personalize.DeleteEventTracker
+  ( -- * Creating a Request
+    DeleteEventTracker (..),
+    newDeleteEventTracker,
+
+    -- * Request Lenses
+    deleteEventTracker_eventTrackerArn,
+
+    -- * Destructuring the Response
+    DeleteEventTrackerResponse (..),
+    newDeleteEventTrackerResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteEventTracker' smart constructor.
+data DeleteEventTracker = DeleteEventTracker'
+  { -- | The Amazon Resource Name (ARN) of the event tracker to delete.
+    eventTrackerArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteEventTracker' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'eventTrackerArn', 'deleteEventTracker_eventTrackerArn' - The Amazon Resource Name (ARN) of the event tracker to delete.
+newDeleteEventTracker ::
+  -- | 'eventTrackerArn'
+  Prelude.Text ->
+  DeleteEventTracker
+newDeleteEventTracker pEventTrackerArn_ =
+  DeleteEventTracker'
+    { eventTrackerArn =
+        pEventTrackerArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the event tracker to delete.
+deleteEventTracker_eventTrackerArn :: Lens.Lens' DeleteEventTracker Prelude.Text
+deleteEventTracker_eventTrackerArn = Lens.lens (\DeleteEventTracker' {eventTrackerArn} -> eventTrackerArn) (\s@DeleteEventTracker' {} a -> s {eventTrackerArn = a} :: DeleteEventTracker)
+
+instance Core.AWSRequest DeleteEventTracker where
+  type
+    AWSResponse DeleteEventTracker =
+      DeleteEventTrackerResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteEventTrackerResponse'
+
+instance Prelude.Hashable DeleteEventTracker where
+  hashWithSalt _salt DeleteEventTracker' {..} =
+    _salt `Prelude.hashWithSalt` eventTrackerArn
+
+instance Prelude.NFData DeleteEventTracker where
+  rnf DeleteEventTracker' {..} =
+    Prelude.rnf eventTrackerArn
+
+instance Data.ToHeaders DeleteEventTracker where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DeleteEventTracker" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteEventTracker where
+  toJSON DeleteEventTracker' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("eventTrackerArn" Data..= eventTrackerArn)
+          ]
+      )
+
+instance Data.ToPath DeleteEventTracker where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteEventTracker where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteEventTrackerResponse' smart constructor.
+data DeleteEventTrackerResponse = DeleteEventTrackerResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteEventTrackerResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteEventTrackerResponse ::
+  DeleteEventTrackerResponse
+newDeleteEventTrackerResponse =
+  DeleteEventTrackerResponse'
+
+instance Prelude.NFData DeleteEventTrackerResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/Personalize/DeleteFilter.hs b/gen/Amazonka/Personalize/DeleteFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DeleteFilter.hs
@@ -0,0 +1,129 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DeleteFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a filter.
+module Amazonka.Personalize.DeleteFilter
+  ( -- * Creating a Request
+    DeleteFilter (..),
+    newDeleteFilter,
+
+    -- * Request Lenses
+    deleteFilter_filterArn,
+
+    -- * Destructuring the Response
+    DeleteFilterResponse (..),
+    newDeleteFilterResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteFilter' smart constructor.
+data DeleteFilter = DeleteFilter'
+  { -- | The ARN of the filter to delete.
+    filterArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filterArn', 'deleteFilter_filterArn' - The ARN of the filter to delete.
+newDeleteFilter ::
+  -- | 'filterArn'
+  Prelude.Text ->
+  DeleteFilter
+newDeleteFilter pFilterArn_ =
+  DeleteFilter' {filterArn = pFilterArn_}
+
+-- | The ARN of the filter to delete.
+deleteFilter_filterArn :: Lens.Lens' DeleteFilter Prelude.Text
+deleteFilter_filterArn = Lens.lens (\DeleteFilter' {filterArn} -> filterArn) (\s@DeleteFilter' {} a -> s {filterArn = a} :: DeleteFilter)
+
+instance Core.AWSRequest DeleteFilter where
+  type AWSResponse DeleteFilter = DeleteFilterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response = Response.receiveNull DeleteFilterResponse'
+
+instance Prelude.Hashable DeleteFilter where
+  hashWithSalt _salt DeleteFilter' {..} =
+    _salt `Prelude.hashWithSalt` filterArn
+
+instance Prelude.NFData DeleteFilter where
+  rnf DeleteFilter' {..} = Prelude.rnf filterArn
+
+instance Data.ToHeaders DeleteFilter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DeleteFilter" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteFilter where
+  toJSON DeleteFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("filterArn" Data..= filterArn)]
+      )
+
+instance Data.ToPath DeleteFilter where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteFilter where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteFilterResponse' smart constructor.
+data DeleteFilterResponse = DeleteFilterResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteFilterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteFilterResponse ::
+  DeleteFilterResponse
+newDeleteFilterResponse = DeleteFilterResponse'
+
+instance Prelude.NFData DeleteFilterResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/Personalize/DeleteMetricAttribution.hs b/gen/Amazonka/Personalize/DeleteMetricAttribution.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DeleteMetricAttribution.hs
@@ -0,0 +1,145 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DeleteMetricAttribution
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a metric attribution.
+module Amazonka.Personalize.DeleteMetricAttribution
+  ( -- * Creating a Request
+    DeleteMetricAttribution (..),
+    newDeleteMetricAttribution,
+
+    -- * Request Lenses
+    deleteMetricAttribution_metricAttributionArn,
+
+    -- * Destructuring the Response
+    DeleteMetricAttributionResponse (..),
+    newDeleteMetricAttributionResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteMetricAttribution' smart constructor.
+data DeleteMetricAttribution = DeleteMetricAttribution'
+  { -- | The metric attribution\'s Amazon Resource Name (ARN).
+    metricAttributionArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteMetricAttribution' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metricAttributionArn', 'deleteMetricAttribution_metricAttributionArn' - The metric attribution\'s Amazon Resource Name (ARN).
+newDeleteMetricAttribution ::
+  -- | 'metricAttributionArn'
+  Prelude.Text ->
+  DeleteMetricAttribution
+newDeleteMetricAttribution pMetricAttributionArn_ =
+  DeleteMetricAttribution'
+    { metricAttributionArn =
+        pMetricAttributionArn_
+    }
+
+-- | The metric attribution\'s Amazon Resource Name (ARN).
+deleteMetricAttribution_metricAttributionArn :: Lens.Lens' DeleteMetricAttribution Prelude.Text
+deleteMetricAttribution_metricAttributionArn = Lens.lens (\DeleteMetricAttribution' {metricAttributionArn} -> metricAttributionArn) (\s@DeleteMetricAttribution' {} a -> s {metricAttributionArn = a} :: DeleteMetricAttribution)
+
+instance Core.AWSRequest DeleteMetricAttribution where
+  type
+    AWSResponse DeleteMetricAttribution =
+      DeleteMetricAttributionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull
+      DeleteMetricAttributionResponse'
+
+instance Prelude.Hashable DeleteMetricAttribution where
+  hashWithSalt _salt DeleteMetricAttribution' {..} =
+    _salt `Prelude.hashWithSalt` metricAttributionArn
+
+instance Prelude.NFData DeleteMetricAttribution where
+  rnf DeleteMetricAttribution' {..} =
+    Prelude.rnf metricAttributionArn
+
+instance Data.ToHeaders DeleteMetricAttribution where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DeleteMetricAttribution" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteMetricAttribution where
+  toJSON DeleteMetricAttribution' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "metricAttributionArn"
+                  Data..= metricAttributionArn
+              )
+          ]
+      )
+
+instance Data.ToPath DeleteMetricAttribution where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteMetricAttribution where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteMetricAttributionResponse' smart constructor.
+data DeleteMetricAttributionResponse = DeleteMetricAttributionResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteMetricAttributionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteMetricAttributionResponse ::
+  DeleteMetricAttributionResponse
+newDeleteMetricAttributionResponse =
+  DeleteMetricAttributionResponse'
+
+instance
+  Prelude.NFData
+    DeleteMetricAttributionResponse
+  where
+  rnf _ = ()
diff --git a/gen/Amazonka/Personalize/DeleteRecommender.hs b/gen/Amazonka/Personalize/DeleteRecommender.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DeleteRecommender.hs
@@ -0,0 +1,142 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DeleteRecommender
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deactivates and removes a recommender. A deleted recommender can no
+-- longer be specified in a
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_RS_GetRecommendations.html GetRecommendations>
+-- request.
+module Amazonka.Personalize.DeleteRecommender
+  ( -- * Creating a Request
+    DeleteRecommender (..),
+    newDeleteRecommender,
+
+    -- * Request Lenses
+    deleteRecommender_recommenderArn,
+
+    -- * Destructuring the Response
+    DeleteRecommenderResponse (..),
+    newDeleteRecommenderResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteRecommender' smart constructor.
+data DeleteRecommender = DeleteRecommender'
+  { -- | The Amazon Resource Name (ARN) of the recommender to delete.
+    recommenderArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRecommender' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recommenderArn', 'deleteRecommender_recommenderArn' - The Amazon Resource Name (ARN) of the recommender to delete.
+newDeleteRecommender ::
+  -- | 'recommenderArn'
+  Prelude.Text ->
+  DeleteRecommender
+newDeleteRecommender pRecommenderArn_ =
+  DeleteRecommender'
+    { recommenderArn =
+        pRecommenderArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the recommender to delete.
+deleteRecommender_recommenderArn :: Lens.Lens' DeleteRecommender Prelude.Text
+deleteRecommender_recommenderArn = Lens.lens (\DeleteRecommender' {recommenderArn} -> recommenderArn) (\s@DeleteRecommender' {} a -> s {recommenderArn = a} :: DeleteRecommender)
+
+instance Core.AWSRequest DeleteRecommender where
+  type
+    AWSResponse DeleteRecommender =
+      DeleteRecommenderResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteRecommenderResponse'
+
+instance Prelude.Hashable DeleteRecommender where
+  hashWithSalt _salt DeleteRecommender' {..} =
+    _salt `Prelude.hashWithSalt` recommenderArn
+
+instance Prelude.NFData DeleteRecommender where
+  rnf DeleteRecommender' {..} =
+    Prelude.rnf recommenderArn
+
+instance Data.ToHeaders DeleteRecommender where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DeleteRecommender" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteRecommender where
+  toJSON DeleteRecommender' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("recommenderArn" Data..= recommenderArn)
+          ]
+      )
+
+instance Data.ToPath DeleteRecommender where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteRecommender where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteRecommenderResponse' smart constructor.
+data DeleteRecommenderResponse = DeleteRecommenderResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteRecommenderResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteRecommenderResponse ::
+  DeleteRecommenderResponse
+newDeleteRecommenderResponse =
+  DeleteRecommenderResponse'
+
+instance Prelude.NFData DeleteRecommenderResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/Personalize/DeleteSchema.hs b/gen/Amazonka/Personalize/DeleteSchema.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DeleteSchema.hs
@@ -0,0 +1,131 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DeleteSchema
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes a schema. Before deleting a schema, you must delete all datasets
+-- referencing the schema. For more information on schemas, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSchema.html CreateSchema>.
+module Amazonka.Personalize.DeleteSchema
+  ( -- * Creating a Request
+    DeleteSchema (..),
+    newDeleteSchema,
+
+    -- * Request Lenses
+    deleteSchema_schemaArn,
+
+    -- * Destructuring the Response
+    DeleteSchemaResponse (..),
+    newDeleteSchemaResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteSchema' smart constructor.
+data DeleteSchema = DeleteSchema'
+  { -- | The Amazon Resource Name (ARN) of the schema to delete.
+    schemaArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSchema' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'schemaArn', 'deleteSchema_schemaArn' - The Amazon Resource Name (ARN) of the schema to delete.
+newDeleteSchema ::
+  -- | 'schemaArn'
+  Prelude.Text ->
+  DeleteSchema
+newDeleteSchema pSchemaArn_ =
+  DeleteSchema' {schemaArn = pSchemaArn_}
+
+-- | The Amazon Resource Name (ARN) of the schema to delete.
+deleteSchema_schemaArn :: Lens.Lens' DeleteSchema Prelude.Text
+deleteSchema_schemaArn = Lens.lens (\DeleteSchema' {schemaArn} -> schemaArn) (\s@DeleteSchema' {} a -> s {schemaArn = a} :: DeleteSchema)
+
+instance Core.AWSRequest DeleteSchema where
+  type AWSResponse DeleteSchema = DeleteSchemaResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response = Response.receiveNull DeleteSchemaResponse'
+
+instance Prelude.Hashable DeleteSchema where
+  hashWithSalt _salt DeleteSchema' {..} =
+    _salt `Prelude.hashWithSalt` schemaArn
+
+instance Prelude.NFData DeleteSchema where
+  rnf DeleteSchema' {..} = Prelude.rnf schemaArn
+
+instance Data.ToHeaders DeleteSchema where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DeleteSchema" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteSchema where
+  toJSON DeleteSchema' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("schemaArn" Data..= schemaArn)]
+      )
+
+instance Data.ToPath DeleteSchema where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteSchema where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteSchemaResponse' smart constructor.
+data DeleteSchemaResponse = DeleteSchemaResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSchemaResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteSchemaResponse ::
+  DeleteSchemaResponse
+newDeleteSchemaResponse = DeleteSchemaResponse'
+
+instance Prelude.NFData DeleteSchemaResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/Personalize/DeleteSolution.hs b/gen/Amazonka/Personalize/DeleteSolution.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DeleteSolution.hs
@@ -0,0 +1,139 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DeleteSolution
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Deletes all versions of a solution and the @Solution@ object itself.
+-- Before deleting a solution, you must delete all campaigns based on the
+-- solution. To determine what campaigns are using the solution, call
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_ListCampaigns.html ListCampaigns>
+-- and supply the Amazon Resource Name (ARN) of the solution. You can\'t
+-- delete a solution if an associated @SolutionVersion@ is in the CREATE
+-- PENDING or IN PROGRESS state. For more information on solutions, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolution.html CreateSolution>.
+module Amazonka.Personalize.DeleteSolution
+  ( -- * Creating a Request
+    DeleteSolution (..),
+    newDeleteSolution,
+
+    -- * Request Lenses
+    deleteSolution_solutionArn,
+
+    -- * Destructuring the Response
+    DeleteSolutionResponse (..),
+    newDeleteSolutionResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteSolution' smart constructor.
+data DeleteSolution = DeleteSolution'
+  { -- | The ARN of the solution to delete.
+    solutionArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSolution' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'solutionArn', 'deleteSolution_solutionArn' - The ARN of the solution to delete.
+newDeleteSolution ::
+  -- | 'solutionArn'
+  Prelude.Text ->
+  DeleteSolution
+newDeleteSolution pSolutionArn_ =
+  DeleteSolution' {solutionArn = pSolutionArn_}
+
+-- | The ARN of the solution to delete.
+deleteSolution_solutionArn :: Lens.Lens' DeleteSolution Prelude.Text
+deleteSolution_solutionArn = Lens.lens (\DeleteSolution' {solutionArn} -> solutionArn) (\s@DeleteSolution' {} a -> s {solutionArn = a} :: DeleteSolution)
+
+instance Core.AWSRequest DeleteSolution where
+  type
+    AWSResponse DeleteSolution =
+      DeleteSolutionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull DeleteSolutionResponse'
+
+instance Prelude.Hashable DeleteSolution where
+  hashWithSalt _salt DeleteSolution' {..} =
+    _salt `Prelude.hashWithSalt` solutionArn
+
+instance Prelude.NFData DeleteSolution where
+  rnf DeleteSolution' {..} = Prelude.rnf solutionArn
+
+instance Data.ToHeaders DeleteSolution where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DeleteSolution" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DeleteSolution where
+  toJSON DeleteSolution' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("solutionArn" Data..= solutionArn)]
+      )
+
+instance Data.ToPath DeleteSolution where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DeleteSolution where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteSolutionResponse' smart constructor.
+data DeleteSolutionResponse = DeleteSolutionResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteSolutionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newDeleteSolutionResponse ::
+  DeleteSolutionResponse
+newDeleteSolutionResponse = DeleteSolutionResponse'
+
+instance Prelude.NFData DeleteSolutionResponse where
+  rnf _ = ()
diff --git a/gen/Amazonka/Personalize/DescribeAlgorithm.hs b/gen/Amazonka/Personalize/DescribeAlgorithm.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeAlgorithm.hs
@@ -0,0 +1,168 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeAlgorithm
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the given algorithm.
+module Amazonka.Personalize.DescribeAlgorithm
+  ( -- * Creating a Request
+    DescribeAlgorithm (..),
+    newDescribeAlgorithm,
+
+    -- * Request Lenses
+    describeAlgorithm_algorithmArn,
+
+    -- * Destructuring the Response
+    DescribeAlgorithmResponse (..),
+    newDescribeAlgorithmResponse,
+
+    -- * Response Lenses
+    describeAlgorithmResponse_algorithm,
+    describeAlgorithmResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeAlgorithm' smart constructor.
+data DescribeAlgorithm = DescribeAlgorithm'
+  { -- | The Amazon Resource Name (ARN) of the algorithm to describe.
+    algorithmArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAlgorithm' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'algorithmArn', 'describeAlgorithm_algorithmArn' - The Amazon Resource Name (ARN) of the algorithm to describe.
+newDescribeAlgorithm ::
+  -- | 'algorithmArn'
+  Prelude.Text ->
+  DescribeAlgorithm
+newDescribeAlgorithm pAlgorithmArn_ =
+  DescribeAlgorithm' {algorithmArn = pAlgorithmArn_}
+
+-- | The Amazon Resource Name (ARN) of the algorithm to describe.
+describeAlgorithm_algorithmArn :: Lens.Lens' DescribeAlgorithm Prelude.Text
+describeAlgorithm_algorithmArn = Lens.lens (\DescribeAlgorithm' {algorithmArn} -> algorithmArn) (\s@DescribeAlgorithm' {} a -> s {algorithmArn = a} :: DescribeAlgorithm)
+
+instance Core.AWSRequest DescribeAlgorithm where
+  type
+    AWSResponse DescribeAlgorithm =
+      DescribeAlgorithmResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeAlgorithmResponse'
+            Prelude.<$> (x Data..?> "algorithm")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeAlgorithm where
+  hashWithSalt _salt DescribeAlgorithm' {..} =
+    _salt `Prelude.hashWithSalt` algorithmArn
+
+instance Prelude.NFData DescribeAlgorithm where
+  rnf DescribeAlgorithm' {..} = Prelude.rnf algorithmArn
+
+instance Data.ToHeaders DescribeAlgorithm where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeAlgorithm" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeAlgorithm where
+  toJSON DescribeAlgorithm' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("algorithmArn" Data..= algorithmArn)]
+      )
+
+instance Data.ToPath DescribeAlgorithm where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeAlgorithm where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeAlgorithmResponse' smart constructor.
+data DescribeAlgorithmResponse = DescribeAlgorithmResponse'
+  { -- | A listing of the properties of the algorithm.
+    algorithm :: Prelude.Maybe Algorithm,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeAlgorithmResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'algorithm', 'describeAlgorithmResponse_algorithm' - A listing of the properties of the algorithm.
+--
+-- 'httpStatus', 'describeAlgorithmResponse_httpStatus' - The response's http status code.
+newDescribeAlgorithmResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeAlgorithmResponse
+newDescribeAlgorithmResponse pHttpStatus_ =
+  DescribeAlgorithmResponse'
+    { algorithm =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A listing of the properties of the algorithm.
+describeAlgorithmResponse_algorithm :: Lens.Lens' DescribeAlgorithmResponse (Prelude.Maybe Algorithm)
+describeAlgorithmResponse_algorithm = Lens.lens (\DescribeAlgorithmResponse' {algorithm} -> algorithm) (\s@DescribeAlgorithmResponse' {} a -> s {algorithm = a} :: DescribeAlgorithmResponse)
+
+-- | The response's http status code.
+describeAlgorithmResponse_httpStatus :: Lens.Lens' DescribeAlgorithmResponse Prelude.Int
+describeAlgorithmResponse_httpStatus = Lens.lens (\DescribeAlgorithmResponse' {httpStatus} -> httpStatus) (\s@DescribeAlgorithmResponse' {} a -> s {httpStatus = a} :: DescribeAlgorithmResponse)
+
+instance Prelude.NFData DescribeAlgorithmResponse where
+  rnf DescribeAlgorithmResponse' {..} =
+    Prelude.rnf algorithm
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeBatchInferenceJob.hs b/gen/Amazonka/Personalize/DescribeBatchInferenceJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeBatchInferenceJob.hs
@@ -0,0 +1,181 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeBatchInferenceJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the properties of a batch inference job including name, Amazon
+-- Resource Name (ARN), status, input and output configurations, and the
+-- ARN of the solution version used to generate the recommendations.
+module Amazonka.Personalize.DescribeBatchInferenceJob
+  ( -- * Creating a Request
+    DescribeBatchInferenceJob (..),
+    newDescribeBatchInferenceJob,
+
+    -- * Request Lenses
+    describeBatchInferenceJob_batchInferenceJobArn,
+
+    -- * Destructuring the Response
+    DescribeBatchInferenceJobResponse (..),
+    newDescribeBatchInferenceJobResponse,
+
+    -- * Response Lenses
+    describeBatchInferenceJobResponse_batchInferenceJob,
+    describeBatchInferenceJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeBatchInferenceJob' smart constructor.
+data DescribeBatchInferenceJob = DescribeBatchInferenceJob'
+  { -- | The ARN of the batch inference job to describe.
+    batchInferenceJobArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeBatchInferenceJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchInferenceJobArn', 'describeBatchInferenceJob_batchInferenceJobArn' - The ARN of the batch inference job to describe.
+newDescribeBatchInferenceJob ::
+  -- | 'batchInferenceJobArn'
+  Prelude.Text ->
+  DescribeBatchInferenceJob
+newDescribeBatchInferenceJob pBatchInferenceJobArn_ =
+  DescribeBatchInferenceJob'
+    { batchInferenceJobArn =
+        pBatchInferenceJobArn_
+    }
+
+-- | The ARN of the batch inference job to describe.
+describeBatchInferenceJob_batchInferenceJobArn :: Lens.Lens' DescribeBatchInferenceJob Prelude.Text
+describeBatchInferenceJob_batchInferenceJobArn = Lens.lens (\DescribeBatchInferenceJob' {batchInferenceJobArn} -> batchInferenceJobArn) (\s@DescribeBatchInferenceJob' {} a -> s {batchInferenceJobArn = a} :: DescribeBatchInferenceJob)
+
+instance Core.AWSRequest DescribeBatchInferenceJob where
+  type
+    AWSResponse DescribeBatchInferenceJob =
+      DescribeBatchInferenceJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeBatchInferenceJobResponse'
+            Prelude.<$> (x Data..?> "batchInferenceJob")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeBatchInferenceJob where
+  hashWithSalt _salt DescribeBatchInferenceJob' {..} =
+    _salt `Prelude.hashWithSalt` batchInferenceJobArn
+
+instance Prelude.NFData DescribeBatchInferenceJob where
+  rnf DescribeBatchInferenceJob' {..} =
+    Prelude.rnf batchInferenceJobArn
+
+instance Data.ToHeaders DescribeBatchInferenceJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeBatchInferenceJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeBatchInferenceJob where
+  toJSON DescribeBatchInferenceJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "batchInferenceJobArn"
+                  Data..= batchInferenceJobArn
+              )
+          ]
+      )
+
+instance Data.ToPath DescribeBatchInferenceJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeBatchInferenceJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeBatchInferenceJobResponse' smart constructor.
+data DescribeBatchInferenceJobResponse = DescribeBatchInferenceJobResponse'
+  { -- | Information on the specified batch inference job.
+    batchInferenceJob :: Prelude.Maybe BatchInferenceJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeBatchInferenceJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchInferenceJob', 'describeBatchInferenceJobResponse_batchInferenceJob' - Information on the specified batch inference job.
+--
+-- 'httpStatus', 'describeBatchInferenceJobResponse_httpStatus' - The response's http status code.
+newDescribeBatchInferenceJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeBatchInferenceJobResponse
+newDescribeBatchInferenceJobResponse pHttpStatus_ =
+  DescribeBatchInferenceJobResponse'
+    { batchInferenceJob =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information on the specified batch inference job.
+describeBatchInferenceJobResponse_batchInferenceJob :: Lens.Lens' DescribeBatchInferenceJobResponse (Prelude.Maybe BatchInferenceJob)
+describeBatchInferenceJobResponse_batchInferenceJob = Lens.lens (\DescribeBatchInferenceJobResponse' {batchInferenceJob} -> batchInferenceJob) (\s@DescribeBatchInferenceJobResponse' {} a -> s {batchInferenceJob = a} :: DescribeBatchInferenceJobResponse)
+
+-- | The response's http status code.
+describeBatchInferenceJobResponse_httpStatus :: Lens.Lens' DescribeBatchInferenceJobResponse Prelude.Int
+describeBatchInferenceJobResponse_httpStatus = Lens.lens (\DescribeBatchInferenceJobResponse' {httpStatus} -> httpStatus) (\s@DescribeBatchInferenceJobResponse' {} a -> s {httpStatus = a} :: DescribeBatchInferenceJobResponse)
+
+instance
+  Prelude.NFData
+    DescribeBatchInferenceJobResponse
+  where
+  rnf DescribeBatchInferenceJobResponse' {..} =
+    Prelude.rnf batchInferenceJob
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeBatchSegmentJob.hs b/gen/Amazonka/Personalize/DescribeBatchSegmentJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeBatchSegmentJob.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeBatchSegmentJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the properties of a batch segment job including name, Amazon
+-- Resource Name (ARN), status, input and output configurations, and the
+-- ARN of the solution version used to generate segments.
+module Amazonka.Personalize.DescribeBatchSegmentJob
+  ( -- * Creating a Request
+    DescribeBatchSegmentJob (..),
+    newDescribeBatchSegmentJob,
+
+    -- * Request Lenses
+    describeBatchSegmentJob_batchSegmentJobArn,
+
+    -- * Destructuring the Response
+    DescribeBatchSegmentJobResponse (..),
+    newDescribeBatchSegmentJobResponse,
+
+    -- * Response Lenses
+    describeBatchSegmentJobResponse_batchSegmentJob,
+    describeBatchSegmentJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeBatchSegmentJob' smart constructor.
+data DescribeBatchSegmentJob = DescribeBatchSegmentJob'
+  { -- | The ARN of the batch segment job to describe.
+    batchSegmentJobArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeBatchSegmentJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchSegmentJobArn', 'describeBatchSegmentJob_batchSegmentJobArn' - The ARN of the batch segment job to describe.
+newDescribeBatchSegmentJob ::
+  -- | 'batchSegmentJobArn'
+  Prelude.Text ->
+  DescribeBatchSegmentJob
+newDescribeBatchSegmentJob pBatchSegmentJobArn_ =
+  DescribeBatchSegmentJob'
+    { batchSegmentJobArn =
+        pBatchSegmentJobArn_
+    }
+
+-- | The ARN of the batch segment job to describe.
+describeBatchSegmentJob_batchSegmentJobArn :: Lens.Lens' DescribeBatchSegmentJob Prelude.Text
+describeBatchSegmentJob_batchSegmentJobArn = Lens.lens (\DescribeBatchSegmentJob' {batchSegmentJobArn} -> batchSegmentJobArn) (\s@DescribeBatchSegmentJob' {} a -> s {batchSegmentJobArn = a} :: DescribeBatchSegmentJob)
+
+instance Core.AWSRequest DescribeBatchSegmentJob where
+  type
+    AWSResponse DescribeBatchSegmentJob =
+      DescribeBatchSegmentJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeBatchSegmentJobResponse'
+            Prelude.<$> (x Data..?> "batchSegmentJob")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeBatchSegmentJob where
+  hashWithSalt _salt DescribeBatchSegmentJob' {..} =
+    _salt `Prelude.hashWithSalt` batchSegmentJobArn
+
+instance Prelude.NFData DescribeBatchSegmentJob where
+  rnf DescribeBatchSegmentJob' {..} =
+    Prelude.rnf batchSegmentJobArn
+
+instance Data.ToHeaders DescribeBatchSegmentJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeBatchSegmentJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeBatchSegmentJob where
+  toJSON DescribeBatchSegmentJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("batchSegmentJobArn" Data..= batchSegmentJobArn)
+          ]
+      )
+
+instance Data.ToPath DescribeBatchSegmentJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeBatchSegmentJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeBatchSegmentJobResponse' smart constructor.
+data DescribeBatchSegmentJobResponse = DescribeBatchSegmentJobResponse'
+  { -- | Information on the specified batch segment job.
+    batchSegmentJob :: Prelude.Maybe BatchSegmentJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeBatchSegmentJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchSegmentJob', 'describeBatchSegmentJobResponse_batchSegmentJob' - Information on the specified batch segment job.
+--
+-- 'httpStatus', 'describeBatchSegmentJobResponse_httpStatus' - The response's http status code.
+newDescribeBatchSegmentJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeBatchSegmentJobResponse
+newDescribeBatchSegmentJobResponse pHttpStatus_ =
+  DescribeBatchSegmentJobResponse'
+    { batchSegmentJob =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information on the specified batch segment job.
+describeBatchSegmentJobResponse_batchSegmentJob :: Lens.Lens' DescribeBatchSegmentJobResponse (Prelude.Maybe BatchSegmentJob)
+describeBatchSegmentJobResponse_batchSegmentJob = Lens.lens (\DescribeBatchSegmentJobResponse' {batchSegmentJob} -> batchSegmentJob) (\s@DescribeBatchSegmentJobResponse' {} a -> s {batchSegmentJob = a} :: DescribeBatchSegmentJobResponse)
+
+-- | The response's http status code.
+describeBatchSegmentJobResponse_httpStatus :: Lens.Lens' DescribeBatchSegmentJobResponse Prelude.Int
+describeBatchSegmentJobResponse_httpStatus = Lens.lens (\DescribeBatchSegmentJobResponse' {httpStatus} -> httpStatus) (\s@DescribeBatchSegmentJobResponse' {} a -> s {httpStatus = a} :: DescribeBatchSegmentJobResponse)
+
+instance
+  Prelude.NFData
+    DescribeBatchSegmentJobResponse
+  where
+  rnf DescribeBatchSegmentJobResponse' {..} =
+    Prelude.rnf batchSegmentJob
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeCampaign.hs b/gen/Amazonka/Personalize/DescribeCampaign.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeCampaign.hs
@@ -0,0 +1,180 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeCampaign
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the given campaign, including its status.
+--
+-- A campaign can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+--
+-- When the @status@ is @CREATE FAILED@, the response includes the
+-- @failureReason@ key, which describes why.
+--
+-- For more information on campaigns, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateCampaign.html CreateCampaign>.
+module Amazonka.Personalize.DescribeCampaign
+  ( -- * Creating a Request
+    DescribeCampaign (..),
+    newDescribeCampaign,
+
+    -- * Request Lenses
+    describeCampaign_campaignArn,
+
+    -- * Destructuring the Response
+    DescribeCampaignResponse (..),
+    newDescribeCampaignResponse,
+
+    -- * Response Lenses
+    describeCampaignResponse_campaign,
+    describeCampaignResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeCampaign' smart constructor.
+data DescribeCampaign = DescribeCampaign'
+  { -- | The Amazon Resource Name (ARN) of the campaign.
+    campaignArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeCampaign' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'campaignArn', 'describeCampaign_campaignArn' - The Amazon Resource Name (ARN) of the campaign.
+newDescribeCampaign ::
+  -- | 'campaignArn'
+  Prelude.Text ->
+  DescribeCampaign
+newDescribeCampaign pCampaignArn_ =
+  DescribeCampaign' {campaignArn = pCampaignArn_}
+
+-- | The Amazon Resource Name (ARN) of the campaign.
+describeCampaign_campaignArn :: Lens.Lens' DescribeCampaign Prelude.Text
+describeCampaign_campaignArn = Lens.lens (\DescribeCampaign' {campaignArn} -> campaignArn) (\s@DescribeCampaign' {} a -> s {campaignArn = a} :: DescribeCampaign)
+
+instance Core.AWSRequest DescribeCampaign where
+  type
+    AWSResponse DescribeCampaign =
+      DescribeCampaignResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeCampaignResponse'
+            Prelude.<$> (x Data..?> "campaign")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeCampaign where
+  hashWithSalt _salt DescribeCampaign' {..} =
+    _salt `Prelude.hashWithSalt` campaignArn
+
+instance Prelude.NFData DescribeCampaign where
+  rnf DescribeCampaign' {..} = Prelude.rnf campaignArn
+
+instance Data.ToHeaders DescribeCampaign where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeCampaign" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeCampaign where
+  toJSON DescribeCampaign' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("campaignArn" Data..= campaignArn)]
+      )
+
+instance Data.ToPath DescribeCampaign where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeCampaign where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeCampaignResponse' smart constructor.
+data DescribeCampaignResponse = DescribeCampaignResponse'
+  { -- | The properties of the campaign.
+    campaign :: Prelude.Maybe Campaign,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeCampaignResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'campaign', 'describeCampaignResponse_campaign' - The properties of the campaign.
+--
+-- 'httpStatus', 'describeCampaignResponse_httpStatus' - The response's http status code.
+newDescribeCampaignResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeCampaignResponse
+newDescribeCampaignResponse pHttpStatus_ =
+  DescribeCampaignResponse'
+    { campaign =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The properties of the campaign.
+describeCampaignResponse_campaign :: Lens.Lens' DescribeCampaignResponse (Prelude.Maybe Campaign)
+describeCampaignResponse_campaign = Lens.lens (\DescribeCampaignResponse' {campaign} -> campaign) (\s@DescribeCampaignResponse' {} a -> s {campaign = a} :: DescribeCampaignResponse)
+
+-- | The response's http status code.
+describeCampaignResponse_httpStatus :: Lens.Lens' DescribeCampaignResponse Prelude.Int
+describeCampaignResponse_httpStatus = Lens.lens (\DescribeCampaignResponse' {httpStatus} -> httpStatus) (\s@DescribeCampaignResponse' {} a -> s {httpStatus = a} :: DescribeCampaignResponse)
+
+instance Prelude.NFData DescribeCampaignResponse where
+  rnf DescribeCampaignResponse' {..} =
+    Prelude.rnf campaign
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeDataset.hs b/gen/Amazonka/Personalize/DescribeDataset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeDataset.hs
@@ -0,0 +1,168 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeDataset
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the given dataset. For more information on datasets, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDataset.html CreateDataset>.
+module Amazonka.Personalize.DescribeDataset
+  ( -- * Creating a Request
+    DescribeDataset (..),
+    newDescribeDataset,
+
+    -- * Request Lenses
+    describeDataset_datasetArn,
+
+    -- * Destructuring the Response
+    DescribeDatasetResponse (..),
+    newDescribeDatasetResponse,
+
+    -- * Response Lenses
+    describeDatasetResponse_dataset,
+    describeDatasetResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeDataset' smart constructor.
+data DescribeDataset = DescribeDataset'
+  { -- | The Amazon Resource Name (ARN) of the dataset to describe.
+    datasetArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDataset' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetArn', 'describeDataset_datasetArn' - The Amazon Resource Name (ARN) of the dataset to describe.
+newDescribeDataset ::
+  -- | 'datasetArn'
+  Prelude.Text ->
+  DescribeDataset
+newDescribeDataset pDatasetArn_ =
+  DescribeDataset' {datasetArn = pDatasetArn_}
+
+-- | The Amazon Resource Name (ARN) of the dataset to describe.
+describeDataset_datasetArn :: Lens.Lens' DescribeDataset Prelude.Text
+describeDataset_datasetArn = Lens.lens (\DescribeDataset' {datasetArn} -> datasetArn) (\s@DescribeDataset' {} a -> s {datasetArn = a} :: DescribeDataset)
+
+instance Core.AWSRequest DescribeDataset where
+  type
+    AWSResponse DescribeDataset =
+      DescribeDatasetResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDatasetResponse'
+            Prelude.<$> (x Data..?> "dataset")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeDataset where
+  hashWithSalt _salt DescribeDataset' {..} =
+    _salt `Prelude.hashWithSalt` datasetArn
+
+instance Prelude.NFData DescribeDataset where
+  rnf DescribeDataset' {..} = Prelude.rnf datasetArn
+
+instance Data.ToHeaders DescribeDataset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeDataset" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeDataset where
+  toJSON DescribeDataset' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("datasetArn" Data..= datasetArn)]
+      )
+
+instance Data.ToPath DescribeDataset where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeDataset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeDatasetResponse' smart constructor.
+data DescribeDatasetResponse = DescribeDatasetResponse'
+  { -- | A listing of the dataset\'s properties.
+    dataset :: Prelude.Maybe Dataset,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDatasetResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dataset', 'describeDatasetResponse_dataset' - A listing of the dataset\'s properties.
+--
+-- 'httpStatus', 'describeDatasetResponse_httpStatus' - The response's http status code.
+newDescribeDatasetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeDatasetResponse
+newDescribeDatasetResponse pHttpStatus_ =
+  DescribeDatasetResponse'
+    { dataset = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A listing of the dataset\'s properties.
+describeDatasetResponse_dataset :: Lens.Lens' DescribeDatasetResponse (Prelude.Maybe Dataset)
+describeDatasetResponse_dataset = Lens.lens (\DescribeDatasetResponse' {dataset} -> dataset) (\s@DescribeDatasetResponse' {} a -> s {dataset = a} :: DescribeDatasetResponse)
+
+-- | The response's http status code.
+describeDatasetResponse_httpStatus :: Lens.Lens' DescribeDatasetResponse Prelude.Int
+describeDatasetResponse_httpStatus = Lens.lens (\DescribeDatasetResponse' {httpStatus} -> httpStatus) (\s@DescribeDatasetResponse' {} a -> s {httpStatus = a} :: DescribeDatasetResponse)
+
+instance Prelude.NFData DescribeDatasetResponse where
+  rnf DescribeDatasetResponse' {..} =
+    Prelude.rnf dataset
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeDatasetExportJob.hs b/gen/Amazonka/Personalize/DescribeDatasetExportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeDatasetExportJob.hs
@@ -0,0 +1,209 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeDatasetExportJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the dataset export job created by
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetExportJob.html CreateDatasetExportJob>,
+-- including the export job status.
+module Amazonka.Personalize.DescribeDatasetExportJob
+  ( -- * Creating a Request
+    DescribeDatasetExportJob (..),
+    newDescribeDatasetExportJob,
+
+    -- * Request Lenses
+    describeDatasetExportJob_datasetExportJobArn,
+
+    -- * Destructuring the Response
+    DescribeDatasetExportJobResponse (..),
+    newDescribeDatasetExportJobResponse,
+
+    -- * Response Lenses
+    describeDatasetExportJobResponse_datasetExportJob,
+    describeDatasetExportJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeDatasetExportJob' smart constructor.
+data DescribeDatasetExportJob = DescribeDatasetExportJob'
+  { -- | The Amazon Resource Name (ARN) of the dataset export job to describe.
+    datasetExportJobArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDatasetExportJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetExportJobArn', 'describeDatasetExportJob_datasetExportJobArn' - The Amazon Resource Name (ARN) of the dataset export job to describe.
+newDescribeDatasetExportJob ::
+  -- | 'datasetExportJobArn'
+  Prelude.Text ->
+  DescribeDatasetExportJob
+newDescribeDatasetExportJob pDatasetExportJobArn_ =
+  DescribeDatasetExportJob'
+    { datasetExportJobArn =
+        pDatasetExportJobArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the dataset export job to describe.
+describeDatasetExportJob_datasetExportJobArn :: Lens.Lens' DescribeDatasetExportJob Prelude.Text
+describeDatasetExportJob_datasetExportJobArn = Lens.lens (\DescribeDatasetExportJob' {datasetExportJobArn} -> datasetExportJobArn) (\s@DescribeDatasetExportJob' {} a -> s {datasetExportJobArn = a} :: DescribeDatasetExportJob)
+
+instance Core.AWSRequest DescribeDatasetExportJob where
+  type
+    AWSResponse DescribeDatasetExportJob =
+      DescribeDatasetExportJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDatasetExportJobResponse'
+            Prelude.<$> (x Data..?> "datasetExportJob")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeDatasetExportJob where
+  hashWithSalt _salt DescribeDatasetExportJob' {..} =
+    _salt `Prelude.hashWithSalt` datasetExportJobArn
+
+instance Prelude.NFData DescribeDatasetExportJob where
+  rnf DescribeDatasetExportJob' {..} =
+    Prelude.rnf datasetExportJobArn
+
+instance Data.ToHeaders DescribeDatasetExportJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeDatasetExportJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeDatasetExportJob where
+  toJSON DescribeDatasetExportJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("datasetExportJobArn" Data..= datasetExportJobArn)
+          ]
+      )
+
+instance Data.ToPath DescribeDatasetExportJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeDatasetExportJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeDatasetExportJobResponse' smart constructor.
+data DescribeDatasetExportJobResponse = DescribeDatasetExportJobResponse'
+  { -- | Information about the dataset export job, including the status.
+    --
+    -- The status is one of the following values:
+    --
+    -- -   CREATE PENDING
+    --
+    -- -   CREATE IN_PROGRESS
+    --
+    -- -   ACTIVE
+    --
+    -- -   CREATE FAILED
+    datasetExportJob :: Prelude.Maybe DatasetExportJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDatasetExportJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetExportJob', 'describeDatasetExportJobResponse_datasetExportJob' - Information about the dataset export job, including the status.
+--
+-- The status is one of the following values:
+--
+-- -   CREATE PENDING
+--
+-- -   CREATE IN_PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+--
+-- 'httpStatus', 'describeDatasetExportJobResponse_httpStatus' - The response's http status code.
+newDescribeDatasetExportJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeDatasetExportJobResponse
+newDescribeDatasetExportJobResponse pHttpStatus_ =
+  DescribeDatasetExportJobResponse'
+    { datasetExportJob =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the dataset export job, including the status.
+--
+-- The status is one of the following values:
+--
+-- -   CREATE PENDING
+--
+-- -   CREATE IN_PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+describeDatasetExportJobResponse_datasetExportJob :: Lens.Lens' DescribeDatasetExportJobResponse (Prelude.Maybe DatasetExportJob)
+describeDatasetExportJobResponse_datasetExportJob = Lens.lens (\DescribeDatasetExportJobResponse' {datasetExportJob} -> datasetExportJob) (\s@DescribeDatasetExportJobResponse' {} a -> s {datasetExportJob = a} :: DescribeDatasetExportJobResponse)
+
+-- | The response's http status code.
+describeDatasetExportJobResponse_httpStatus :: Lens.Lens' DescribeDatasetExportJobResponse Prelude.Int
+describeDatasetExportJobResponse_httpStatus = Lens.lens (\DescribeDatasetExportJobResponse' {httpStatus} -> httpStatus) (\s@DescribeDatasetExportJobResponse' {} a -> s {httpStatus = a} :: DescribeDatasetExportJobResponse)
+
+instance
+  Prelude.NFData
+    DescribeDatasetExportJobResponse
+  where
+  rnf DescribeDatasetExportJobResponse' {..} =
+    Prelude.rnf datasetExportJob
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeDatasetGroup.hs b/gen/Amazonka/Personalize/DescribeDatasetGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeDatasetGroup.hs
@@ -0,0 +1,176 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeDatasetGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the given dataset group. For more information on dataset
+-- groups, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetGroup.html CreateDatasetGroup>.
+module Amazonka.Personalize.DescribeDatasetGroup
+  ( -- * Creating a Request
+    DescribeDatasetGroup (..),
+    newDescribeDatasetGroup,
+
+    -- * Request Lenses
+    describeDatasetGroup_datasetGroupArn,
+
+    -- * Destructuring the Response
+    DescribeDatasetGroupResponse (..),
+    newDescribeDatasetGroupResponse,
+
+    -- * Response Lenses
+    describeDatasetGroupResponse_datasetGroup,
+    describeDatasetGroupResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeDatasetGroup' smart constructor.
+data DescribeDatasetGroup = DescribeDatasetGroup'
+  { -- | The Amazon Resource Name (ARN) of the dataset group to describe.
+    datasetGroupArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDatasetGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetGroupArn', 'describeDatasetGroup_datasetGroupArn' - The Amazon Resource Name (ARN) of the dataset group to describe.
+newDescribeDatasetGroup ::
+  -- | 'datasetGroupArn'
+  Prelude.Text ->
+  DescribeDatasetGroup
+newDescribeDatasetGroup pDatasetGroupArn_ =
+  DescribeDatasetGroup'
+    { datasetGroupArn =
+        pDatasetGroupArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the dataset group to describe.
+describeDatasetGroup_datasetGroupArn :: Lens.Lens' DescribeDatasetGroup Prelude.Text
+describeDatasetGroup_datasetGroupArn = Lens.lens (\DescribeDatasetGroup' {datasetGroupArn} -> datasetGroupArn) (\s@DescribeDatasetGroup' {} a -> s {datasetGroupArn = a} :: DescribeDatasetGroup)
+
+instance Core.AWSRequest DescribeDatasetGroup where
+  type
+    AWSResponse DescribeDatasetGroup =
+      DescribeDatasetGroupResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDatasetGroupResponse'
+            Prelude.<$> (x Data..?> "datasetGroup")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeDatasetGroup where
+  hashWithSalt _salt DescribeDatasetGroup' {..} =
+    _salt `Prelude.hashWithSalt` datasetGroupArn
+
+instance Prelude.NFData DescribeDatasetGroup where
+  rnf DescribeDatasetGroup' {..} =
+    Prelude.rnf datasetGroupArn
+
+instance Data.ToHeaders DescribeDatasetGroup where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeDatasetGroup" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeDatasetGroup where
+  toJSON DescribeDatasetGroup' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("datasetGroupArn" Data..= datasetGroupArn)
+          ]
+      )
+
+instance Data.ToPath DescribeDatasetGroup where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeDatasetGroup where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeDatasetGroupResponse' smart constructor.
+data DescribeDatasetGroupResponse = DescribeDatasetGroupResponse'
+  { -- | A listing of the dataset group\'s properties.
+    datasetGroup :: Prelude.Maybe DatasetGroup,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDatasetGroupResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetGroup', 'describeDatasetGroupResponse_datasetGroup' - A listing of the dataset group\'s properties.
+--
+-- 'httpStatus', 'describeDatasetGroupResponse_httpStatus' - The response's http status code.
+newDescribeDatasetGroupResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeDatasetGroupResponse
+newDescribeDatasetGroupResponse pHttpStatus_ =
+  DescribeDatasetGroupResponse'
+    { datasetGroup =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A listing of the dataset group\'s properties.
+describeDatasetGroupResponse_datasetGroup :: Lens.Lens' DescribeDatasetGroupResponse (Prelude.Maybe DatasetGroup)
+describeDatasetGroupResponse_datasetGroup = Lens.lens (\DescribeDatasetGroupResponse' {datasetGroup} -> datasetGroup) (\s@DescribeDatasetGroupResponse' {} a -> s {datasetGroup = a} :: DescribeDatasetGroupResponse)
+
+-- | The response's http status code.
+describeDatasetGroupResponse_httpStatus :: Lens.Lens' DescribeDatasetGroupResponse Prelude.Int
+describeDatasetGroupResponse_httpStatus = Lens.lens (\DescribeDatasetGroupResponse' {httpStatus} -> httpStatus) (\s@DescribeDatasetGroupResponse' {} a -> s {httpStatus = a} :: DescribeDatasetGroupResponse)
+
+instance Prelude.NFData DescribeDatasetGroupResponse where
+  rnf DescribeDatasetGroupResponse' {..} =
+    Prelude.rnf datasetGroup
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeDatasetImportJob.hs b/gen/Amazonka/Personalize/DescribeDatasetImportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeDatasetImportJob.hs
@@ -0,0 +1,209 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeDatasetImportJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the dataset import job created by
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetImportJob.html CreateDatasetImportJob>,
+-- including the import job status.
+module Amazonka.Personalize.DescribeDatasetImportJob
+  ( -- * Creating a Request
+    DescribeDatasetImportJob (..),
+    newDescribeDatasetImportJob,
+
+    -- * Request Lenses
+    describeDatasetImportJob_datasetImportJobArn,
+
+    -- * Destructuring the Response
+    DescribeDatasetImportJobResponse (..),
+    newDescribeDatasetImportJobResponse,
+
+    -- * Response Lenses
+    describeDatasetImportJobResponse_datasetImportJob,
+    describeDatasetImportJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeDatasetImportJob' smart constructor.
+data DescribeDatasetImportJob = DescribeDatasetImportJob'
+  { -- | The Amazon Resource Name (ARN) of the dataset import job to describe.
+    datasetImportJobArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDatasetImportJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetImportJobArn', 'describeDatasetImportJob_datasetImportJobArn' - The Amazon Resource Name (ARN) of the dataset import job to describe.
+newDescribeDatasetImportJob ::
+  -- | 'datasetImportJobArn'
+  Prelude.Text ->
+  DescribeDatasetImportJob
+newDescribeDatasetImportJob pDatasetImportJobArn_ =
+  DescribeDatasetImportJob'
+    { datasetImportJobArn =
+        pDatasetImportJobArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the dataset import job to describe.
+describeDatasetImportJob_datasetImportJobArn :: Lens.Lens' DescribeDatasetImportJob Prelude.Text
+describeDatasetImportJob_datasetImportJobArn = Lens.lens (\DescribeDatasetImportJob' {datasetImportJobArn} -> datasetImportJobArn) (\s@DescribeDatasetImportJob' {} a -> s {datasetImportJobArn = a} :: DescribeDatasetImportJob)
+
+instance Core.AWSRequest DescribeDatasetImportJob where
+  type
+    AWSResponse DescribeDatasetImportJob =
+      DescribeDatasetImportJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDatasetImportJobResponse'
+            Prelude.<$> (x Data..?> "datasetImportJob")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeDatasetImportJob where
+  hashWithSalt _salt DescribeDatasetImportJob' {..} =
+    _salt `Prelude.hashWithSalt` datasetImportJobArn
+
+instance Prelude.NFData DescribeDatasetImportJob where
+  rnf DescribeDatasetImportJob' {..} =
+    Prelude.rnf datasetImportJobArn
+
+instance Data.ToHeaders DescribeDatasetImportJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeDatasetImportJob" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeDatasetImportJob where
+  toJSON DescribeDatasetImportJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("datasetImportJobArn" Data..= datasetImportJobArn)
+          ]
+      )
+
+instance Data.ToPath DescribeDatasetImportJob where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeDatasetImportJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeDatasetImportJobResponse' smart constructor.
+data DescribeDatasetImportJobResponse = DescribeDatasetImportJobResponse'
+  { -- | Information about the dataset import job, including the status.
+    --
+    -- The status is one of the following values:
+    --
+    -- -   CREATE PENDING
+    --
+    -- -   CREATE IN_PROGRESS
+    --
+    -- -   ACTIVE
+    --
+    -- -   CREATE FAILED
+    datasetImportJob :: Prelude.Maybe DatasetImportJob,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeDatasetImportJobResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetImportJob', 'describeDatasetImportJobResponse_datasetImportJob' - Information about the dataset import job, including the status.
+--
+-- The status is one of the following values:
+--
+-- -   CREATE PENDING
+--
+-- -   CREATE IN_PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+--
+-- 'httpStatus', 'describeDatasetImportJobResponse_httpStatus' - The response's http status code.
+newDescribeDatasetImportJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeDatasetImportJobResponse
+newDescribeDatasetImportJobResponse pHttpStatus_ =
+  DescribeDatasetImportJobResponse'
+    { datasetImportJob =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the dataset import job, including the status.
+--
+-- The status is one of the following values:
+--
+-- -   CREATE PENDING
+--
+-- -   CREATE IN_PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+describeDatasetImportJobResponse_datasetImportJob :: Lens.Lens' DescribeDatasetImportJobResponse (Prelude.Maybe DatasetImportJob)
+describeDatasetImportJobResponse_datasetImportJob = Lens.lens (\DescribeDatasetImportJobResponse' {datasetImportJob} -> datasetImportJob) (\s@DescribeDatasetImportJobResponse' {} a -> s {datasetImportJob = a} :: DescribeDatasetImportJobResponse)
+
+-- | The response's http status code.
+describeDatasetImportJobResponse_httpStatus :: Lens.Lens' DescribeDatasetImportJobResponse Prelude.Int
+describeDatasetImportJobResponse_httpStatus = Lens.lens (\DescribeDatasetImportJobResponse' {httpStatus} -> httpStatus) (\s@DescribeDatasetImportJobResponse' {} a -> s {httpStatus = a} :: DescribeDatasetImportJobResponse)
+
+instance
+  Prelude.NFData
+    DescribeDatasetImportJobResponse
+  where
+  rnf DescribeDatasetImportJobResponse' {..} =
+    Prelude.rnf datasetImportJob
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeEventTracker.hs b/gen/Amazonka/Personalize/DescribeEventTracker.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeEventTracker.hs
@@ -0,0 +1,177 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeEventTracker
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes an event tracker. The response includes the @trackingId@ and
+-- @status@ of the event tracker. For more information on event trackers,
+-- see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateEventTracker.html CreateEventTracker>.
+module Amazonka.Personalize.DescribeEventTracker
+  ( -- * Creating a Request
+    DescribeEventTracker (..),
+    newDescribeEventTracker,
+
+    -- * Request Lenses
+    describeEventTracker_eventTrackerArn,
+
+    -- * Destructuring the Response
+    DescribeEventTrackerResponse (..),
+    newDescribeEventTrackerResponse,
+
+    -- * Response Lenses
+    describeEventTrackerResponse_eventTracker,
+    describeEventTrackerResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeEventTracker' smart constructor.
+data DescribeEventTracker = DescribeEventTracker'
+  { -- | The Amazon Resource Name (ARN) of the event tracker to describe.
+    eventTrackerArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeEventTracker' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'eventTrackerArn', 'describeEventTracker_eventTrackerArn' - The Amazon Resource Name (ARN) of the event tracker to describe.
+newDescribeEventTracker ::
+  -- | 'eventTrackerArn'
+  Prelude.Text ->
+  DescribeEventTracker
+newDescribeEventTracker pEventTrackerArn_ =
+  DescribeEventTracker'
+    { eventTrackerArn =
+        pEventTrackerArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the event tracker to describe.
+describeEventTracker_eventTrackerArn :: Lens.Lens' DescribeEventTracker Prelude.Text
+describeEventTracker_eventTrackerArn = Lens.lens (\DescribeEventTracker' {eventTrackerArn} -> eventTrackerArn) (\s@DescribeEventTracker' {} a -> s {eventTrackerArn = a} :: DescribeEventTracker)
+
+instance Core.AWSRequest DescribeEventTracker where
+  type
+    AWSResponse DescribeEventTracker =
+      DescribeEventTrackerResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeEventTrackerResponse'
+            Prelude.<$> (x Data..?> "eventTracker")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeEventTracker where
+  hashWithSalt _salt DescribeEventTracker' {..} =
+    _salt `Prelude.hashWithSalt` eventTrackerArn
+
+instance Prelude.NFData DescribeEventTracker where
+  rnf DescribeEventTracker' {..} =
+    Prelude.rnf eventTrackerArn
+
+instance Data.ToHeaders DescribeEventTracker where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeEventTracker" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeEventTracker where
+  toJSON DescribeEventTracker' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("eventTrackerArn" Data..= eventTrackerArn)
+          ]
+      )
+
+instance Data.ToPath DescribeEventTracker where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeEventTracker where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeEventTrackerResponse' smart constructor.
+data DescribeEventTrackerResponse = DescribeEventTrackerResponse'
+  { -- | An object that describes the event tracker.
+    eventTracker :: Prelude.Maybe EventTracker,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeEventTrackerResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'eventTracker', 'describeEventTrackerResponse_eventTracker' - An object that describes the event tracker.
+--
+-- 'httpStatus', 'describeEventTrackerResponse_httpStatus' - The response's http status code.
+newDescribeEventTrackerResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeEventTrackerResponse
+newDescribeEventTrackerResponse pHttpStatus_ =
+  DescribeEventTrackerResponse'
+    { eventTracker =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An object that describes the event tracker.
+describeEventTrackerResponse_eventTracker :: Lens.Lens' DescribeEventTrackerResponse (Prelude.Maybe EventTracker)
+describeEventTrackerResponse_eventTracker = Lens.lens (\DescribeEventTrackerResponse' {eventTracker} -> eventTracker) (\s@DescribeEventTrackerResponse' {} a -> s {eventTracker = a} :: DescribeEventTrackerResponse)
+
+-- | The response's http status code.
+describeEventTrackerResponse_httpStatus :: Lens.Lens' DescribeEventTrackerResponse Prelude.Int
+describeEventTrackerResponse_httpStatus = Lens.lens (\DescribeEventTrackerResponse' {httpStatus} -> httpStatus) (\s@DescribeEventTrackerResponse' {} a -> s {httpStatus = a} :: DescribeEventTrackerResponse)
+
+instance Prelude.NFData DescribeEventTrackerResponse where
+  rnf DescribeEventTrackerResponse' {..} =
+    Prelude.rnf eventTracker
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeFeatureTransformation.hs b/gen/Amazonka/Personalize/DescribeFeatureTransformation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeFeatureTransformation.hs
@@ -0,0 +1,190 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeFeatureTransformation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the given feature transformation.
+module Amazonka.Personalize.DescribeFeatureTransformation
+  ( -- * Creating a Request
+    DescribeFeatureTransformation (..),
+    newDescribeFeatureTransformation,
+
+    -- * Request Lenses
+    describeFeatureTransformation_featureTransformationArn,
+
+    -- * Destructuring the Response
+    DescribeFeatureTransformationResponse (..),
+    newDescribeFeatureTransformationResponse,
+
+    -- * Response Lenses
+    describeFeatureTransformationResponse_featureTransformation,
+    describeFeatureTransformationResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeFeatureTransformation' smart constructor.
+data DescribeFeatureTransformation = DescribeFeatureTransformation'
+  { -- | The Amazon Resource Name (ARN) of the feature transformation to
+    -- describe.
+    featureTransformationArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeFeatureTransformation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'featureTransformationArn', 'describeFeatureTransformation_featureTransformationArn' - The Amazon Resource Name (ARN) of the feature transformation to
+-- describe.
+newDescribeFeatureTransformation ::
+  -- | 'featureTransformationArn'
+  Prelude.Text ->
+  DescribeFeatureTransformation
+newDescribeFeatureTransformation
+  pFeatureTransformationArn_ =
+    DescribeFeatureTransformation'
+      { featureTransformationArn =
+          pFeatureTransformationArn_
+      }
+
+-- | The Amazon Resource Name (ARN) of the feature transformation to
+-- describe.
+describeFeatureTransformation_featureTransformationArn :: Lens.Lens' DescribeFeatureTransformation Prelude.Text
+describeFeatureTransformation_featureTransformationArn = Lens.lens (\DescribeFeatureTransformation' {featureTransformationArn} -> featureTransformationArn) (\s@DescribeFeatureTransformation' {} a -> s {featureTransformationArn = a} :: DescribeFeatureTransformation)
+
+instance
+  Core.AWSRequest
+    DescribeFeatureTransformation
+  where
+  type
+    AWSResponse DescribeFeatureTransformation =
+      DescribeFeatureTransformationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeFeatureTransformationResponse'
+            Prelude.<$> (x Data..?> "featureTransformation")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    DescribeFeatureTransformation
+  where
+  hashWithSalt _salt DescribeFeatureTransformation' {..} =
+    _salt
+      `Prelude.hashWithSalt` featureTransformationArn
+
+instance Prelude.NFData DescribeFeatureTransformation where
+  rnf DescribeFeatureTransformation' {..} =
+    Prelude.rnf featureTransformationArn
+
+instance Data.ToHeaders DescribeFeatureTransformation where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeFeatureTransformation" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeFeatureTransformation where
+  toJSON DescribeFeatureTransformation' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "featureTransformationArn"
+                  Data..= featureTransformationArn
+              )
+          ]
+      )
+
+instance Data.ToPath DescribeFeatureTransformation where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeFeatureTransformation where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeFeatureTransformationResponse' smart constructor.
+data DescribeFeatureTransformationResponse = DescribeFeatureTransformationResponse'
+  { -- | A listing of the FeatureTransformation properties.
+    featureTransformation :: Prelude.Maybe FeatureTransformation,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeFeatureTransformationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'featureTransformation', 'describeFeatureTransformationResponse_featureTransformation' - A listing of the FeatureTransformation properties.
+--
+-- 'httpStatus', 'describeFeatureTransformationResponse_httpStatus' - The response's http status code.
+newDescribeFeatureTransformationResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeFeatureTransformationResponse
+newDescribeFeatureTransformationResponse pHttpStatus_ =
+  DescribeFeatureTransformationResponse'
+    { featureTransformation =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A listing of the FeatureTransformation properties.
+describeFeatureTransformationResponse_featureTransformation :: Lens.Lens' DescribeFeatureTransformationResponse (Prelude.Maybe FeatureTransformation)
+describeFeatureTransformationResponse_featureTransformation = Lens.lens (\DescribeFeatureTransformationResponse' {featureTransformation} -> featureTransformation) (\s@DescribeFeatureTransformationResponse' {} a -> s {featureTransformation = a} :: DescribeFeatureTransformationResponse)
+
+-- | The response's http status code.
+describeFeatureTransformationResponse_httpStatus :: Lens.Lens' DescribeFeatureTransformationResponse Prelude.Int
+describeFeatureTransformationResponse_httpStatus = Lens.lens (\DescribeFeatureTransformationResponse' {httpStatus} -> httpStatus) (\s@DescribeFeatureTransformationResponse' {} a -> s {httpStatus = a} :: DescribeFeatureTransformationResponse)
+
+instance
+  Prelude.NFData
+    DescribeFeatureTransformationResponse
+  where
+  rnf DescribeFeatureTransformationResponse' {..} =
+    Prelude.rnf featureTransformation
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeFilter.hs b/gen/Amazonka/Personalize/DescribeFilter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeFilter.hs
@@ -0,0 +1,167 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeFilter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes a filter\'s properties.
+module Amazonka.Personalize.DescribeFilter
+  ( -- * Creating a Request
+    DescribeFilter (..),
+    newDescribeFilter,
+
+    -- * Request Lenses
+    describeFilter_filterArn,
+
+    -- * Destructuring the Response
+    DescribeFilterResponse (..),
+    newDescribeFilterResponse,
+
+    -- * Response Lenses
+    describeFilterResponse_filter,
+    describeFilterResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeFilter' smart constructor.
+data DescribeFilter = DescribeFilter'
+  { -- | The ARN of the filter to describe.
+    filterArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeFilter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filterArn', 'describeFilter_filterArn' - The ARN of the filter to describe.
+newDescribeFilter ::
+  -- | 'filterArn'
+  Prelude.Text ->
+  DescribeFilter
+newDescribeFilter pFilterArn_ =
+  DescribeFilter' {filterArn = pFilterArn_}
+
+-- | The ARN of the filter to describe.
+describeFilter_filterArn :: Lens.Lens' DescribeFilter Prelude.Text
+describeFilter_filterArn = Lens.lens (\DescribeFilter' {filterArn} -> filterArn) (\s@DescribeFilter' {} a -> s {filterArn = a} :: DescribeFilter)
+
+instance Core.AWSRequest DescribeFilter where
+  type
+    AWSResponse DescribeFilter =
+      DescribeFilterResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeFilterResponse'
+            Prelude.<$> (x Data..?> "filter")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeFilter where
+  hashWithSalt _salt DescribeFilter' {..} =
+    _salt `Prelude.hashWithSalt` filterArn
+
+instance Prelude.NFData DescribeFilter where
+  rnf DescribeFilter' {..} = Prelude.rnf filterArn
+
+instance Data.ToHeaders DescribeFilter where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeFilter" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeFilter where
+  toJSON DescribeFilter' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("filterArn" Data..= filterArn)]
+      )
+
+instance Data.ToPath DescribeFilter where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeFilter where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeFilterResponse' smart constructor.
+data DescribeFilterResponse = DescribeFilterResponse'
+  { -- | The filter\'s details.
+    filter' :: Prelude.Maybe Filter,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeFilterResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filter'', 'describeFilterResponse_filter' - The filter\'s details.
+--
+-- 'httpStatus', 'describeFilterResponse_httpStatus' - The response's http status code.
+newDescribeFilterResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeFilterResponse
+newDescribeFilterResponse pHttpStatus_ =
+  DescribeFilterResponse'
+    { filter' = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The filter\'s details.
+describeFilterResponse_filter :: Lens.Lens' DescribeFilterResponse (Prelude.Maybe Filter)
+describeFilterResponse_filter = Lens.lens (\DescribeFilterResponse' {filter'} -> filter') (\s@DescribeFilterResponse' {} a -> s {filter' = a} :: DescribeFilterResponse)
+
+-- | The response's http status code.
+describeFilterResponse_httpStatus :: Lens.Lens' DescribeFilterResponse Prelude.Int
+describeFilterResponse_httpStatus = Lens.lens (\DescribeFilterResponse' {httpStatus} -> httpStatus) (\s@DescribeFilterResponse' {} a -> s {httpStatus = a} :: DescribeFilterResponse)
+
+instance Prelude.NFData DescribeFilterResponse where
+  rnf DescribeFilterResponse' {..} =
+    Prelude.rnf filter'
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeMetricAttribution.hs b/gen/Amazonka/Personalize/DescribeMetricAttribution.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeMetricAttribution.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeMetricAttribution
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes a metric attribution.
+module Amazonka.Personalize.DescribeMetricAttribution
+  ( -- * Creating a Request
+    DescribeMetricAttribution (..),
+    newDescribeMetricAttribution,
+
+    -- * Request Lenses
+    describeMetricAttribution_metricAttributionArn,
+
+    -- * Destructuring the Response
+    DescribeMetricAttributionResponse (..),
+    newDescribeMetricAttributionResponse,
+
+    -- * Response Lenses
+    describeMetricAttributionResponse_metricAttribution,
+    describeMetricAttributionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeMetricAttribution' smart constructor.
+data DescribeMetricAttribution = DescribeMetricAttribution'
+  { -- | The metric attribution\'s Amazon Resource Name (ARN).
+    metricAttributionArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeMetricAttribution' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metricAttributionArn', 'describeMetricAttribution_metricAttributionArn' - The metric attribution\'s Amazon Resource Name (ARN).
+newDescribeMetricAttribution ::
+  -- | 'metricAttributionArn'
+  Prelude.Text ->
+  DescribeMetricAttribution
+newDescribeMetricAttribution pMetricAttributionArn_ =
+  DescribeMetricAttribution'
+    { metricAttributionArn =
+        pMetricAttributionArn_
+    }
+
+-- | The metric attribution\'s Amazon Resource Name (ARN).
+describeMetricAttribution_metricAttributionArn :: Lens.Lens' DescribeMetricAttribution Prelude.Text
+describeMetricAttribution_metricAttributionArn = Lens.lens (\DescribeMetricAttribution' {metricAttributionArn} -> metricAttributionArn) (\s@DescribeMetricAttribution' {} a -> s {metricAttributionArn = a} :: DescribeMetricAttribution)
+
+instance Core.AWSRequest DescribeMetricAttribution where
+  type
+    AWSResponse DescribeMetricAttribution =
+      DescribeMetricAttributionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeMetricAttributionResponse'
+            Prelude.<$> (x Data..?> "metricAttribution")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeMetricAttribution where
+  hashWithSalt _salt DescribeMetricAttribution' {..} =
+    _salt `Prelude.hashWithSalt` metricAttributionArn
+
+instance Prelude.NFData DescribeMetricAttribution where
+  rnf DescribeMetricAttribution' {..} =
+    Prelude.rnf metricAttributionArn
+
+instance Data.ToHeaders DescribeMetricAttribution where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeMetricAttribution" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeMetricAttribution where
+  toJSON DescribeMetricAttribution' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ( "metricAttributionArn"
+                  Data..= metricAttributionArn
+              )
+          ]
+      )
+
+instance Data.ToPath DescribeMetricAttribution where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeMetricAttribution where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeMetricAttributionResponse' smart constructor.
+data DescribeMetricAttributionResponse = DescribeMetricAttributionResponse'
+  { -- | The details of the metric attribution.
+    metricAttribution :: Prelude.Maybe MetricAttribution,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeMetricAttributionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metricAttribution', 'describeMetricAttributionResponse_metricAttribution' - The details of the metric attribution.
+--
+-- 'httpStatus', 'describeMetricAttributionResponse_httpStatus' - The response's http status code.
+newDescribeMetricAttributionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeMetricAttributionResponse
+newDescribeMetricAttributionResponse pHttpStatus_ =
+  DescribeMetricAttributionResponse'
+    { metricAttribution =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The details of the metric attribution.
+describeMetricAttributionResponse_metricAttribution :: Lens.Lens' DescribeMetricAttributionResponse (Prelude.Maybe MetricAttribution)
+describeMetricAttributionResponse_metricAttribution = Lens.lens (\DescribeMetricAttributionResponse' {metricAttribution} -> metricAttribution) (\s@DescribeMetricAttributionResponse' {} a -> s {metricAttribution = a} :: DescribeMetricAttributionResponse)
+
+-- | The response's http status code.
+describeMetricAttributionResponse_httpStatus :: Lens.Lens' DescribeMetricAttributionResponse Prelude.Int
+describeMetricAttributionResponse_httpStatus = Lens.lens (\DescribeMetricAttributionResponse' {httpStatus} -> httpStatus) (\s@DescribeMetricAttributionResponse' {} a -> s {httpStatus = a} :: DescribeMetricAttributionResponse)
+
+instance
+  Prelude.NFData
+    DescribeMetricAttributionResponse
+  where
+  rnf DescribeMetricAttributionResponse' {..} =
+    Prelude.rnf metricAttribution
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeRecipe.hs b/gen/Amazonka/Personalize/DescribeRecipe.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeRecipe.hs
@@ -0,0 +1,185 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeRecipe
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes a recipe.
+--
+-- A recipe contains three items:
+--
+-- -   An algorithm that trains a model.
+--
+-- -   Hyperparameters that govern the training.
+--
+-- -   Feature transformation information for modifying the input data
+--     before training.
+--
+-- Amazon Personalize provides a set of predefined recipes. You specify a
+-- recipe when you create a solution with the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolution.html CreateSolution>
+-- API. @CreateSolution@ trains a model by using the algorithm in the
+-- specified recipe and a training dataset. The solution, when deployed as
+-- a campaign, can provide recommendations using the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_RS_GetRecommendations.html GetRecommendations>
+-- API.
+module Amazonka.Personalize.DescribeRecipe
+  ( -- * Creating a Request
+    DescribeRecipe (..),
+    newDescribeRecipe,
+
+    -- * Request Lenses
+    describeRecipe_recipeArn,
+
+    -- * Destructuring the Response
+    DescribeRecipeResponse (..),
+    newDescribeRecipeResponse,
+
+    -- * Response Lenses
+    describeRecipeResponse_recipe,
+    describeRecipeResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeRecipe' smart constructor.
+data DescribeRecipe = DescribeRecipe'
+  { -- | The Amazon Resource Name (ARN) of the recipe to describe.
+    recipeArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRecipe' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recipeArn', 'describeRecipe_recipeArn' - The Amazon Resource Name (ARN) of the recipe to describe.
+newDescribeRecipe ::
+  -- | 'recipeArn'
+  Prelude.Text ->
+  DescribeRecipe
+newDescribeRecipe pRecipeArn_ =
+  DescribeRecipe' {recipeArn = pRecipeArn_}
+
+-- | The Amazon Resource Name (ARN) of the recipe to describe.
+describeRecipe_recipeArn :: Lens.Lens' DescribeRecipe Prelude.Text
+describeRecipe_recipeArn = Lens.lens (\DescribeRecipe' {recipeArn} -> recipeArn) (\s@DescribeRecipe' {} a -> s {recipeArn = a} :: DescribeRecipe)
+
+instance Core.AWSRequest DescribeRecipe where
+  type
+    AWSResponse DescribeRecipe =
+      DescribeRecipeResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeRecipeResponse'
+            Prelude.<$> (x Data..?> "recipe")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeRecipe where
+  hashWithSalt _salt DescribeRecipe' {..} =
+    _salt `Prelude.hashWithSalt` recipeArn
+
+instance Prelude.NFData DescribeRecipe where
+  rnf DescribeRecipe' {..} = Prelude.rnf recipeArn
+
+instance Data.ToHeaders DescribeRecipe where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeRecipe" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeRecipe where
+  toJSON DescribeRecipe' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("recipeArn" Data..= recipeArn)]
+      )
+
+instance Data.ToPath DescribeRecipe where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeRecipe where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeRecipeResponse' smart constructor.
+data DescribeRecipeResponse = DescribeRecipeResponse'
+  { -- | An object that describes the recipe.
+    recipe :: Prelude.Maybe Recipe,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRecipeResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recipe', 'describeRecipeResponse_recipe' - An object that describes the recipe.
+--
+-- 'httpStatus', 'describeRecipeResponse_httpStatus' - The response's http status code.
+newDescribeRecipeResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeRecipeResponse
+newDescribeRecipeResponse pHttpStatus_ =
+  DescribeRecipeResponse'
+    { recipe = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An object that describes the recipe.
+describeRecipeResponse_recipe :: Lens.Lens' DescribeRecipeResponse (Prelude.Maybe Recipe)
+describeRecipeResponse_recipe = Lens.lens (\DescribeRecipeResponse' {recipe} -> recipe) (\s@DescribeRecipeResponse' {} a -> s {recipe = a} :: DescribeRecipeResponse)
+
+-- | The response's http status code.
+describeRecipeResponse_httpStatus :: Lens.Lens' DescribeRecipeResponse Prelude.Int
+describeRecipeResponse_httpStatus = Lens.lens (\DescribeRecipeResponse' {httpStatus} -> httpStatus) (\s@DescribeRecipeResponse' {} a -> s {httpStatus = a} :: DescribeRecipeResponse)
+
+instance Prelude.NFData DescribeRecipeResponse where
+  rnf DescribeRecipeResponse' {..} =
+    Prelude.rnf recipe
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeRecommender.hs b/gen/Amazonka/Personalize/DescribeRecommender.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeRecommender.hs
@@ -0,0 +1,192 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeRecommender
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes the given recommender, including its status.
+--
+-- A recommender can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   STOP PENDING > STOP IN_PROGRESS > INACTIVE > START PENDING > START
+--     IN_PROGRESS > ACTIVE
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+--
+-- When the @status@ is @CREATE FAILED@, the response includes the
+-- @failureReason@ key, which describes why.
+--
+-- The @modelMetrics@ key is null when the recommender is being created or
+-- deleted.
+--
+-- For more information on recommenders, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateRecommender.html CreateRecommender>.
+module Amazonka.Personalize.DescribeRecommender
+  ( -- * Creating a Request
+    DescribeRecommender (..),
+    newDescribeRecommender,
+
+    -- * Request Lenses
+    describeRecommender_recommenderArn,
+
+    -- * Destructuring the Response
+    DescribeRecommenderResponse (..),
+    newDescribeRecommenderResponse,
+
+    -- * Response Lenses
+    describeRecommenderResponse_recommender,
+    describeRecommenderResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeRecommender' smart constructor.
+data DescribeRecommender = DescribeRecommender'
+  { -- | The Amazon Resource Name (ARN) of the recommender to describe.
+    recommenderArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRecommender' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recommenderArn', 'describeRecommender_recommenderArn' - The Amazon Resource Name (ARN) of the recommender to describe.
+newDescribeRecommender ::
+  -- | 'recommenderArn'
+  Prelude.Text ->
+  DescribeRecommender
+newDescribeRecommender pRecommenderArn_ =
+  DescribeRecommender'
+    { recommenderArn =
+        pRecommenderArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the recommender to describe.
+describeRecommender_recommenderArn :: Lens.Lens' DescribeRecommender Prelude.Text
+describeRecommender_recommenderArn = Lens.lens (\DescribeRecommender' {recommenderArn} -> recommenderArn) (\s@DescribeRecommender' {} a -> s {recommenderArn = a} :: DescribeRecommender)
+
+instance Core.AWSRequest DescribeRecommender where
+  type
+    AWSResponse DescribeRecommender =
+      DescribeRecommenderResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeRecommenderResponse'
+            Prelude.<$> (x Data..?> "recommender")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeRecommender where
+  hashWithSalt _salt DescribeRecommender' {..} =
+    _salt `Prelude.hashWithSalt` recommenderArn
+
+instance Prelude.NFData DescribeRecommender where
+  rnf DescribeRecommender' {..} =
+    Prelude.rnf recommenderArn
+
+instance Data.ToHeaders DescribeRecommender where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeRecommender" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeRecommender where
+  toJSON DescribeRecommender' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("recommenderArn" Data..= recommenderArn)
+          ]
+      )
+
+instance Data.ToPath DescribeRecommender where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeRecommender where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeRecommenderResponse' smart constructor.
+data DescribeRecommenderResponse = DescribeRecommenderResponse'
+  { -- | The properties of the recommender.
+    recommender :: Prelude.Maybe Recommender,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeRecommenderResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recommender', 'describeRecommenderResponse_recommender' - The properties of the recommender.
+--
+-- 'httpStatus', 'describeRecommenderResponse_httpStatus' - The response's http status code.
+newDescribeRecommenderResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeRecommenderResponse
+newDescribeRecommenderResponse pHttpStatus_ =
+  DescribeRecommenderResponse'
+    { recommender =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The properties of the recommender.
+describeRecommenderResponse_recommender :: Lens.Lens' DescribeRecommenderResponse (Prelude.Maybe Recommender)
+describeRecommenderResponse_recommender = Lens.lens (\DescribeRecommenderResponse' {recommender} -> recommender) (\s@DescribeRecommenderResponse' {} a -> s {recommender = a} :: DescribeRecommenderResponse)
+
+-- | The response's http status code.
+describeRecommenderResponse_httpStatus :: Lens.Lens' DescribeRecommenderResponse Prelude.Int
+describeRecommenderResponse_httpStatus = Lens.lens (\DescribeRecommenderResponse' {httpStatus} -> httpStatus) (\s@DescribeRecommenderResponse' {} a -> s {httpStatus = a} :: DescribeRecommenderResponse)
+
+instance Prelude.NFData DescribeRecommenderResponse where
+  rnf DescribeRecommenderResponse' {..} =
+    Prelude.rnf recommender
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeSchema.hs b/gen/Amazonka/Personalize/DescribeSchema.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeSchema.hs
@@ -0,0 +1,168 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeSchema
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes a schema. For more information on schemas, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSchema.html CreateSchema>.
+module Amazonka.Personalize.DescribeSchema
+  ( -- * Creating a Request
+    DescribeSchema (..),
+    newDescribeSchema,
+
+    -- * Request Lenses
+    describeSchema_schemaArn,
+
+    -- * Destructuring the Response
+    DescribeSchemaResponse (..),
+    newDescribeSchemaResponse,
+
+    -- * Response Lenses
+    describeSchemaResponse_schema,
+    describeSchemaResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeSchema' smart constructor.
+data DescribeSchema = DescribeSchema'
+  { -- | The Amazon Resource Name (ARN) of the schema to retrieve.
+    schemaArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSchema' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'schemaArn', 'describeSchema_schemaArn' - The Amazon Resource Name (ARN) of the schema to retrieve.
+newDescribeSchema ::
+  -- | 'schemaArn'
+  Prelude.Text ->
+  DescribeSchema
+newDescribeSchema pSchemaArn_ =
+  DescribeSchema' {schemaArn = pSchemaArn_}
+
+-- | The Amazon Resource Name (ARN) of the schema to retrieve.
+describeSchema_schemaArn :: Lens.Lens' DescribeSchema Prelude.Text
+describeSchema_schemaArn = Lens.lens (\DescribeSchema' {schemaArn} -> schemaArn) (\s@DescribeSchema' {} a -> s {schemaArn = a} :: DescribeSchema)
+
+instance Core.AWSRequest DescribeSchema where
+  type
+    AWSResponse DescribeSchema =
+      DescribeSchemaResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeSchemaResponse'
+            Prelude.<$> (x Data..?> "schema")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeSchema where
+  hashWithSalt _salt DescribeSchema' {..} =
+    _salt `Prelude.hashWithSalt` schemaArn
+
+instance Prelude.NFData DescribeSchema where
+  rnf DescribeSchema' {..} = Prelude.rnf schemaArn
+
+instance Data.ToHeaders DescribeSchema where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeSchema" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeSchema where
+  toJSON DescribeSchema' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("schemaArn" Data..= schemaArn)]
+      )
+
+instance Data.ToPath DescribeSchema where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeSchema where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeSchemaResponse' smart constructor.
+data DescribeSchemaResponse = DescribeSchemaResponse'
+  { -- | The requested schema.
+    schema :: Prelude.Maybe DatasetSchema,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSchemaResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'schema', 'describeSchemaResponse_schema' - The requested schema.
+--
+-- 'httpStatus', 'describeSchemaResponse_httpStatus' - The response's http status code.
+newDescribeSchemaResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeSchemaResponse
+newDescribeSchemaResponse pHttpStatus_ =
+  DescribeSchemaResponse'
+    { schema = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The requested schema.
+describeSchemaResponse_schema :: Lens.Lens' DescribeSchemaResponse (Prelude.Maybe DatasetSchema)
+describeSchemaResponse_schema = Lens.lens (\DescribeSchemaResponse' {schema} -> schema) (\s@DescribeSchemaResponse' {} a -> s {schema = a} :: DescribeSchemaResponse)
+
+-- | The response's http status code.
+describeSchemaResponse_httpStatus :: Lens.Lens' DescribeSchemaResponse Prelude.Int
+describeSchemaResponse_httpStatus = Lens.lens (\DescribeSchemaResponse' {httpStatus} -> httpStatus) (\s@DescribeSchemaResponse' {} a -> s {httpStatus = a} :: DescribeSchemaResponse)
+
+instance Prelude.NFData DescribeSchemaResponse where
+  rnf DescribeSchemaResponse' {..} =
+    Prelude.rnf schema
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeSolution.hs b/gen/Amazonka/Personalize/DescribeSolution.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeSolution.hs
@@ -0,0 +1,169 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeSolution
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes a solution. For more information on solutions, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolution.html CreateSolution>.
+module Amazonka.Personalize.DescribeSolution
+  ( -- * Creating a Request
+    DescribeSolution (..),
+    newDescribeSolution,
+
+    -- * Request Lenses
+    describeSolution_solutionArn,
+
+    -- * Destructuring the Response
+    DescribeSolutionResponse (..),
+    newDescribeSolutionResponse,
+
+    -- * Response Lenses
+    describeSolutionResponse_solution,
+    describeSolutionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeSolution' smart constructor.
+data DescribeSolution = DescribeSolution'
+  { -- | The Amazon Resource Name (ARN) of the solution to describe.
+    solutionArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSolution' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'solutionArn', 'describeSolution_solutionArn' - The Amazon Resource Name (ARN) of the solution to describe.
+newDescribeSolution ::
+  -- | 'solutionArn'
+  Prelude.Text ->
+  DescribeSolution
+newDescribeSolution pSolutionArn_ =
+  DescribeSolution' {solutionArn = pSolutionArn_}
+
+-- | The Amazon Resource Name (ARN) of the solution to describe.
+describeSolution_solutionArn :: Lens.Lens' DescribeSolution Prelude.Text
+describeSolution_solutionArn = Lens.lens (\DescribeSolution' {solutionArn} -> solutionArn) (\s@DescribeSolution' {} a -> s {solutionArn = a} :: DescribeSolution)
+
+instance Core.AWSRequest DescribeSolution where
+  type
+    AWSResponse DescribeSolution =
+      DescribeSolutionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeSolutionResponse'
+            Prelude.<$> (x Data..?> "solution")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeSolution where
+  hashWithSalt _salt DescribeSolution' {..} =
+    _salt `Prelude.hashWithSalt` solutionArn
+
+instance Prelude.NFData DescribeSolution where
+  rnf DescribeSolution' {..} = Prelude.rnf solutionArn
+
+instance Data.ToHeaders DescribeSolution where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeSolution" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeSolution where
+  toJSON DescribeSolution' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("solutionArn" Data..= solutionArn)]
+      )
+
+instance Data.ToPath DescribeSolution where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeSolution where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeSolutionResponse' smart constructor.
+data DescribeSolutionResponse = DescribeSolutionResponse'
+  { -- | An object that describes the solution.
+    solution :: Prelude.Maybe Solution,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSolutionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'solution', 'describeSolutionResponse_solution' - An object that describes the solution.
+--
+-- 'httpStatus', 'describeSolutionResponse_httpStatus' - The response's http status code.
+newDescribeSolutionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeSolutionResponse
+newDescribeSolutionResponse pHttpStatus_ =
+  DescribeSolutionResponse'
+    { solution =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An object that describes the solution.
+describeSolutionResponse_solution :: Lens.Lens' DescribeSolutionResponse (Prelude.Maybe Solution)
+describeSolutionResponse_solution = Lens.lens (\DescribeSolutionResponse' {solution} -> solution) (\s@DescribeSolutionResponse' {} a -> s {solution = a} :: DescribeSolutionResponse)
+
+-- | The response's http status code.
+describeSolutionResponse_httpStatus :: Lens.Lens' DescribeSolutionResponse Prelude.Int
+describeSolutionResponse_httpStatus = Lens.lens (\DescribeSolutionResponse' {httpStatus} -> httpStatus) (\s@DescribeSolutionResponse' {} a -> s {httpStatus = a} :: DescribeSolutionResponse)
+
+instance Prelude.NFData DescribeSolutionResponse where
+  rnf DescribeSolutionResponse' {..} =
+    Prelude.rnf solution
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/DescribeSolutionVersion.hs b/gen/Amazonka/Personalize/DescribeSolutionVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/DescribeSolutionVersion.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.DescribeSolutionVersion
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Describes a specific version of a solution. For more information on
+-- solutions, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolution.html CreateSolution>
+module Amazonka.Personalize.DescribeSolutionVersion
+  ( -- * Creating a Request
+    DescribeSolutionVersion (..),
+    newDescribeSolutionVersion,
+
+    -- * Request Lenses
+    describeSolutionVersion_solutionVersionArn,
+
+    -- * Destructuring the Response
+    DescribeSolutionVersionResponse (..),
+    newDescribeSolutionVersionResponse,
+
+    -- * Response Lenses
+    describeSolutionVersionResponse_solutionVersion,
+    describeSolutionVersionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeSolutionVersion' smart constructor.
+data DescribeSolutionVersion = DescribeSolutionVersion'
+  { -- | The Amazon Resource Name (ARN) of the solution version.
+    solutionVersionArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSolutionVersion' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'solutionVersionArn', 'describeSolutionVersion_solutionVersionArn' - The Amazon Resource Name (ARN) of the solution version.
+newDescribeSolutionVersion ::
+  -- | 'solutionVersionArn'
+  Prelude.Text ->
+  DescribeSolutionVersion
+newDescribeSolutionVersion pSolutionVersionArn_ =
+  DescribeSolutionVersion'
+    { solutionVersionArn =
+        pSolutionVersionArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the solution version.
+describeSolutionVersion_solutionVersionArn :: Lens.Lens' DescribeSolutionVersion Prelude.Text
+describeSolutionVersion_solutionVersionArn = Lens.lens (\DescribeSolutionVersion' {solutionVersionArn} -> solutionVersionArn) (\s@DescribeSolutionVersion' {} a -> s {solutionVersionArn = a} :: DescribeSolutionVersion)
+
+instance Core.AWSRequest DescribeSolutionVersion where
+  type
+    AWSResponse DescribeSolutionVersion =
+      DescribeSolutionVersionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeSolutionVersionResponse'
+            Prelude.<$> (x Data..?> "solutionVersion")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeSolutionVersion where
+  hashWithSalt _salt DescribeSolutionVersion' {..} =
+    _salt `Prelude.hashWithSalt` solutionVersionArn
+
+instance Prelude.NFData DescribeSolutionVersion where
+  rnf DescribeSolutionVersion' {..} =
+    Prelude.rnf solutionVersionArn
+
+instance Data.ToHeaders DescribeSolutionVersion where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.DescribeSolutionVersion" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON DescribeSolutionVersion where
+  toJSON DescribeSolutionVersion' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("solutionVersionArn" Data..= solutionVersionArn)
+          ]
+      )
+
+instance Data.ToPath DescribeSolutionVersion where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery DescribeSolutionVersion where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeSolutionVersionResponse' smart constructor.
+data DescribeSolutionVersionResponse = DescribeSolutionVersionResponse'
+  { -- | The solution version.
+    solutionVersion :: Prelude.Maybe SolutionVersion,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeSolutionVersionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'solutionVersion', 'describeSolutionVersionResponse_solutionVersion' - The solution version.
+--
+-- 'httpStatus', 'describeSolutionVersionResponse_httpStatus' - The response's http status code.
+newDescribeSolutionVersionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeSolutionVersionResponse
+newDescribeSolutionVersionResponse pHttpStatus_ =
+  DescribeSolutionVersionResponse'
+    { solutionVersion =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The solution version.
+describeSolutionVersionResponse_solutionVersion :: Lens.Lens' DescribeSolutionVersionResponse (Prelude.Maybe SolutionVersion)
+describeSolutionVersionResponse_solutionVersion = Lens.lens (\DescribeSolutionVersionResponse' {solutionVersion} -> solutionVersion) (\s@DescribeSolutionVersionResponse' {} a -> s {solutionVersion = a} :: DescribeSolutionVersionResponse)
+
+-- | The response's http status code.
+describeSolutionVersionResponse_httpStatus :: Lens.Lens' DescribeSolutionVersionResponse Prelude.Int
+describeSolutionVersionResponse_httpStatus = Lens.lens (\DescribeSolutionVersionResponse' {httpStatus} -> httpStatus) (\s@DescribeSolutionVersionResponse' {} a -> s {httpStatus = a} :: DescribeSolutionVersionResponse)
+
+instance
+  Prelude.NFData
+    DescribeSolutionVersionResponse
+  where
+  rnf DescribeSolutionVersionResponse' {..} =
+    Prelude.rnf solutionVersion
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/GetSolutionMetrics.hs b/gen/Amazonka/Personalize/GetSolutionMetrics.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/GetSolutionMetrics.hs
@@ -0,0 +1,195 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.GetSolutionMetrics
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets the metrics for the specified solution version.
+module Amazonka.Personalize.GetSolutionMetrics
+  ( -- * Creating a Request
+    GetSolutionMetrics (..),
+    newGetSolutionMetrics,
+
+    -- * Request Lenses
+    getSolutionMetrics_solutionVersionArn,
+
+    -- * Destructuring the Response
+    GetSolutionMetricsResponse (..),
+    newGetSolutionMetricsResponse,
+
+    -- * Response Lenses
+    getSolutionMetricsResponse_metrics,
+    getSolutionMetricsResponse_solutionVersionArn,
+    getSolutionMetricsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newGetSolutionMetrics' smart constructor.
+data GetSolutionMetrics = GetSolutionMetrics'
+  { -- | The Amazon Resource Name (ARN) of the solution version for which to get
+    -- metrics.
+    solutionVersionArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetSolutionMetrics' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'solutionVersionArn', 'getSolutionMetrics_solutionVersionArn' - The Amazon Resource Name (ARN) of the solution version for which to get
+-- metrics.
+newGetSolutionMetrics ::
+  -- | 'solutionVersionArn'
+  Prelude.Text ->
+  GetSolutionMetrics
+newGetSolutionMetrics pSolutionVersionArn_ =
+  GetSolutionMetrics'
+    { solutionVersionArn =
+        pSolutionVersionArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the solution version for which to get
+-- metrics.
+getSolutionMetrics_solutionVersionArn :: Lens.Lens' GetSolutionMetrics Prelude.Text
+getSolutionMetrics_solutionVersionArn = Lens.lens (\GetSolutionMetrics' {solutionVersionArn} -> solutionVersionArn) (\s@GetSolutionMetrics' {} a -> s {solutionVersionArn = a} :: GetSolutionMetrics)
+
+instance Core.AWSRequest GetSolutionMetrics where
+  type
+    AWSResponse GetSolutionMetrics =
+      GetSolutionMetricsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          GetSolutionMetricsResponse'
+            Prelude.<$> (x Data..?> "metrics" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "solutionVersionArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable GetSolutionMetrics where
+  hashWithSalt _salt GetSolutionMetrics' {..} =
+    _salt `Prelude.hashWithSalt` solutionVersionArn
+
+instance Prelude.NFData GetSolutionMetrics where
+  rnf GetSolutionMetrics' {..} =
+    Prelude.rnf solutionVersionArn
+
+instance Data.ToHeaders GetSolutionMetrics where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.GetSolutionMetrics" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON GetSolutionMetrics where
+  toJSON GetSolutionMetrics' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("solutionVersionArn" Data..= solutionVersionArn)
+          ]
+      )
+
+instance Data.ToPath GetSolutionMetrics where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery GetSolutionMetrics where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newGetSolutionMetricsResponse' smart constructor.
+data GetSolutionMetricsResponse = GetSolutionMetricsResponse'
+  { -- | The metrics for the solution version. For more information, see
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/working-with-training-metrics.html Evaluating a solution version with metrics>
+    -- .
+    metrics :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Double),
+    -- | The same solution version ARN as specified in the request.
+    solutionVersionArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GetSolutionMetricsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metrics', 'getSolutionMetricsResponse_metrics' - The metrics for the solution version. For more information, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/working-with-training-metrics.html Evaluating a solution version with metrics>
+-- .
+--
+-- 'solutionVersionArn', 'getSolutionMetricsResponse_solutionVersionArn' - The same solution version ARN as specified in the request.
+--
+-- 'httpStatus', 'getSolutionMetricsResponse_httpStatus' - The response's http status code.
+newGetSolutionMetricsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  GetSolutionMetricsResponse
+newGetSolutionMetricsResponse pHttpStatus_ =
+  GetSolutionMetricsResponse'
+    { metrics =
+        Prelude.Nothing,
+      solutionVersionArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The metrics for the solution version. For more information, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/working-with-training-metrics.html Evaluating a solution version with metrics>
+-- .
+getSolutionMetricsResponse_metrics :: Lens.Lens' GetSolutionMetricsResponse (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Double))
+getSolutionMetricsResponse_metrics = Lens.lens (\GetSolutionMetricsResponse' {metrics} -> metrics) (\s@GetSolutionMetricsResponse' {} a -> s {metrics = a} :: GetSolutionMetricsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The same solution version ARN as specified in the request.
+getSolutionMetricsResponse_solutionVersionArn :: Lens.Lens' GetSolutionMetricsResponse (Prelude.Maybe Prelude.Text)
+getSolutionMetricsResponse_solutionVersionArn = Lens.lens (\GetSolutionMetricsResponse' {solutionVersionArn} -> solutionVersionArn) (\s@GetSolutionMetricsResponse' {} a -> s {solutionVersionArn = a} :: GetSolutionMetricsResponse)
+
+-- | The response's http status code.
+getSolutionMetricsResponse_httpStatus :: Lens.Lens' GetSolutionMetricsResponse Prelude.Int
+getSolutionMetricsResponse_httpStatus = Lens.lens (\GetSolutionMetricsResponse' {httpStatus} -> httpStatus) (\s@GetSolutionMetricsResponse' {} a -> s {httpStatus = a} :: GetSolutionMetricsResponse)
+
+instance Prelude.NFData GetSolutionMetricsResponse where
+  rnf GetSolutionMetricsResponse' {..} =
+    Prelude.rnf metrics
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/Lens.hs b/gen/Amazonka/Personalize/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Lens.hs
@@ -0,0 +1,1047 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Lens
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Lens
+  ( -- * Operations
+
+    -- ** CreateBatchInferenceJob
+    createBatchInferenceJob_batchInferenceJobConfig,
+    createBatchInferenceJob_filterArn,
+    createBatchInferenceJob_numResults,
+    createBatchInferenceJob_tags,
+    createBatchInferenceJob_jobName,
+    createBatchInferenceJob_solutionVersionArn,
+    createBatchInferenceJob_jobInput,
+    createBatchInferenceJob_jobOutput,
+    createBatchInferenceJob_roleArn,
+    createBatchInferenceJobResponse_batchInferenceJobArn,
+    createBatchInferenceJobResponse_httpStatus,
+
+    -- ** CreateBatchSegmentJob
+    createBatchSegmentJob_filterArn,
+    createBatchSegmentJob_numResults,
+    createBatchSegmentJob_tags,
+    createBatchSegmentJob_jobName,
+    createBatchSegmentJob_solutionVersionArn,
+    createBatchSegmentJob_jobInput,
+    createBatchSegmentJob_jobOutput,
+    createBatchSegmentJob_roleArn,
+    createBatchSegmentJobResponse_batchSegmentJobArn,
+    createBatchSegmentJobResponse_httpStatus,
+
+    -- ** CreateCampaign
+    createCampaign_campaignConfig,
+    createCampaign_minProvisionedTPS,
+    createCampaign_tags,
+    createCampaign_name,
+    createCampaign_solutionVersionArn,
+    createCampaignResponse_campaignArn,
+    createCampaignResponse_httpStatus,
+
+    -- ** CreateDataset
+    createDataset_tags,
+    createDataset_name,
+    createDataset_schemaArn,
+    createDataset_datasetGroupArn,
+    createDataset_datasetType,
+    createDatasetResponse_datasetArn,
+    createDatasetResponse_httpStatus,
+
+    -- ** CreateDatasetExportJob
+    createDatasetExportJob_ingestionMode,
+    createDatasetExportJob_tags,
+    createDatasetExportJob_jobName,
+    createDatasetExportJob_datasetArn,
+    createDatasetExportJob_roleArn,
+    createDatasetExportJob_jobOutput,
+    createDatasetExportJobResponse_datasetExportJobArn,
+    createDatasetExportJobResponse_httpStatus,
+
+    -- ** CreateDatasetGroup
+    createDatasetGroup_domain,
+    createDatasetGroup_kmsKeyArn,
+    createDatasetGroup_roleArn,
+    createDatasetGroup_tags,
+    createDatasetGroup_name,
+    createDatasetGroupResponse_datasetGroupArn,
+    createDatasetGroupResponse_domain,
+    createDatasetGroupResponse_httpStatus,
+
+    -- ** CreateDatasetImportJob
+    createDatasetImportJob_importMode,
+    createDatasetImportJob_publishAttributionMetricsToS3,
+    createDatasetImportJob_tags,
+    createDatasetImportJob_jobName,
+    createDatasetImportJob_datasetArn,
+    createDatasetImportJob_dataSource,
+    createDatasetImportJob_roleArn,
+    createDatasetImportJobResponse_datasetImportJobArn,
+    createDatasetImportJobResponse_httpStatus,
+
+    -- ** CreateEventTracker
+    createEventTracker_tags,
+    createEventTracker_name,
+    createEventTracker_datasetGroupArn,
+    createEventTrackerResponse_eventTrackerArn,
+    createEventTrackerResponse_trackingId,
+    createEventTrackerResponse_httpStatus,
+
+    -- ** CreateFilter
+    createFilter_tags,
+    createFilter_name,
+    createFilter_datasetGroupArn,
+    createFilter_filterExpression,
+    createFilterResponse_filterArn,
+    createFilterResponse_httpStatus,
+
+    -- ** CreateMetricAttribution
+    createMetricAttribution_name,
+    createMetricAttribution_datasetGroupArn,
+    createMetricAttribution_metrics,
+    createMetricAttribution_metricsOutputConfig,
+    createMetricAttributionResponse_metricAttributionArn,
+    createMetricAttributionResponse_httpStatus,
+
+    -- ** CreateRecommender
+    createRecommender_recommenderConfig,
+    createRecommender_tags,
+    createRecommender_name,
+    createRecommender_datasetGroupArn,
+    createRecommender_recipeArn,
+    createRecommenderResponse_recommenderArn,
+    createRecommenderResponse_httpStatus,
+
+    -- ** CreateSchema
+    createSchema_domain,
+    createSchema_name,
+    createSchema_schema,
+    createSchemaResponse_schemaArn,
+    createSchemaResponse_httpStatus,
+
+    -- ** CreateSolution
+    createSolution_eventType,
+    createSolution_performAutoML,
+    createSolution_performHPO,
+    createSolution_recipeArn,
+    createSolution_solutionConfig,
+    createSolution_tags,
+    createSolution_name,
+    createSolution_datasetGroupArn,
+    createSolutionResponse_solutionArn,
+    createSolutionResponse_httpStatus,
+
+    -- ** CreateSolutionVersion
+    createSolutionVersion_name,
+    createSolutionVersion_tags,
+    createSolutionVersion_trainingMode,
+    createSolutionVersion_solutionArn,
+    createSolutionVersionResponse_solutionVersionArn,
+    createSolutionVersionResponse_httpStatus,
+
+    -- ** DeleteCampaign
+    deleteCampaign_campaignArn,
+
+    -- ** DeleteDataset
+    deleteDataset_datasetArn,
+
+    -- ** DeleteDatasetGroup
+    deleteDatasetGroup_datasetGroupArn,
+
+    -- ** DeleteEventTracker
+    deleteEventTracker_eventTrackerArn,
+
+    -- ** DeleteFilter
+    deleteFilter_filterArn,
+
+    -- ** DeleteMetricAttribution
+    deleteMetricAttribution_metricAttributionArn,
+
+    -- ** DeleteRecommender
+    deleteRecommender_recommenderArn,
+
+    -- ** DeleteSchema
+    deleteSchema_schemaArn,
+
+    -- ** DeleteSolution
+    deleteSolution_solutionArn,
+
+    -- ** DescribeAlgorithm
+    describeAlgorithm_algorithmArn,
+    describeAlgorithmResponse_algorithm,
+    describeAlgorithmResponse_httpStatus,
+
+    -- ** DescribeBatchInferenceJob
+    describeBatchInferenceJob_batchInferenceJobArn,
+    describeBatchInferenceJobResponse_batchInferenceJob,
+    describeBatchInferenceJobResponse_httpStatus,
+
+    -- ** DescribeBatchSegmentJob
+    describeBatchSegmentJob_batchSegmentJobArn,
+    describeBatchSegmentJobResponse_batchSegmentJob,
+    describeBatchSegmentJobResponse_httpStatus,
+
+    -- ** DescribeCampaign
+    describeCampaign_campaignArn,
+    describeCampaignResponse_campaign,
+    describeCampaignResponse_httpStatus,
+
+    -- ** DescribeDataset
+    describeDataset_datasetArn,
+    describeDatasetResponse_dataset,
+    describeDatasetResponse_httpStatus,
+
+    -- ** DescribeDatasetExportJob
+    describeDatasetExportJob_datasetExportJobArn,
+    describeDatasetExportJobResponse_datasetExportJob,
+    describeDatasetExportJobResponse_httpStatus,
+
+    -- ** DescribeDatasetGroup
+    describeDatasetGroup_datasetGroupArn,
+    describeDatasetGroupResponse_datasetGroup,
+    describeDatasetGroupResponse_httpStatus,
+
+    -- ** DescribeDatasetImportJob
+    describeDatasetImportJob_datasetImportJobArn,
+    describeDatasetImportJobResponse_datasetImportJob,
+    describeDatasetImportJobResponse_httpStatus,
+
+    -- ** DescribeEventTracker
+    describeEventTracker_eventTrackerArn,
+    describeEventTrackerResponse_eventTracker,
+    describeEventTrackerResponse_httpStatus,
+
+    -- ** DescribeFeatureTransformation
+    describeFeatureTransformation_featureTransformationArn,
+    describeFeatureTransformationResponse_featureTransformation,
+    describeFeatureTransformationResponse_httpStatus,
+
+    -- ** DescribeFilter
+    describeFilter_filterArn,
+    describeFilterResponse_filter,
+    describeFilterResponse_httpStatus,
+
+    -- ** DescribeMetricAttribution
+    describeMetricAttribution_metricAttributionArn,
+    describeMetricAttributionResponse_metricAttribution,
+    describeMetricAttributionResponse_httpStatus,
+
+    -- ** DescribeRecipe
+    describeRecipe_recipeArn,
+    describeRecipeResponse_recipe,
+    describeRecipeResponse_httpStatus,
+
+    -- ** DescribeRecommender
+    describeRecommender_recommenderArn,
+    describeRecommenderResponse_recommender,
+    describeRecommenderResponse_httpStatus,
+
+    -- ** DescribeSchema
+    describeSchema_schemaArn,
+    describeSchemaResponse_schema,
+    describeSchemaResponse_httpStatus,
+
+    -- ** DescribeSolution
+    describeSolution_solutionArn,
+    describeSolutionResponse_solution,
+    describeSolutionResponse_httpStatus,
+
+    -- ** DescribeSolutionVersion
+    describeSolutionVersion_solutionVersionArn,
+    describeSolutionVersionResponse_solutionVersion,
+    describeSolutionVersionResponse_httpStatus,
+
+    -- ** GetSolutionMetrics
+    getSolutionMetrics_solutionVersionArn,
+    getSolutionMetricsResponse_metrics,
+    getSolutionMetricsResponse_solutionVersionArn,
+    getSolutionMetricsResponse_httpStatus,
+
+    -- ** ListBatchInferenceJobs
+    listBatchInferenceJobs_maxResults,
+    listBatchInferenceJobs_nextToken,
+    listBatchInferenceJobs_solutionVersionArn,
+    listBatchInferenceJobsResponse_batchInferenceJobs,
+    listBatchInferenceJobsResponse_nextToken,
+    listBatchInferenceJobsResponse_httpStatus,
+
+    -- ** ListBatchSegmentJobs
+    listBatchSegmentJobs_maxResults,
+    listBatchSegmentJobs_nextToken,
+    listBatchSegmentJobs_solutionVersionArn,
+    listBatchSegmentJobsResponse_batchSegmentJobs,
+    listBatchSegmentJobsResponse_nextToken,
+    listBatchSegmentJobsResponse_httpStatus,
+
+    -- ** ListCampaigns
+    listCampaigns_maxResults,
+    listCampaigns_nextToken,
+    listCampaigns_solutionArn,
+    listCampaignsResponse_campaigns,
+    listCampaignsResponse_nextToken,
+    listCampaignsResponse_httpStatus,
+
+    -- ** ListDatasetExportJobs
+    listDatasetExportJobs_datasetArn,
+    listDatasetExportJobs_maxResults,
+    listDatasetExportJobs_nextToken,
+    listDatasetExportJobsResponse_datasetExportJobs,
+    listDatasetExportJobsResponse_nextToken,
+    listDatasetExportJobsResponse_httpStatus,
+
+    -- ** ListDatasetGroups
+    listDatasetGroups_maxResults,
+    listDatasetGroups_nextToken,
+    listDatasetGroupsResponse_datasetGroups,
+    listDatasetGroupsResponse_nextToken,
+    listDatasetGroupsResponse_httpStatus,
+
+    -- ** ListDatasetImportJobs
+    listDatasetImportJobs_datasetArn,
+    listDatasetImportJobs_maxResults,
+    listDatasetImportJobs_nextToken,
+    listDatasetImportJobsResponse_datasetImportJobs,
+    listDatasetImportJobsResponse_nextToken,
+    listDatasetImportJobsResponse_httpStatus,
+
+    -- ** ListDatasets
+    listDatasets_datasetGroupArn,
+    listDatasets_maxResults,
+    listDatasets_nextToken,
+    listDatasetsResponse_datasets,
+    listDatasetsResponse_nextToken,
+    listDatasetsResponse_httpStatus,
+
+    -- ** ListEventTrackers
+    listEventTrackers_datasetGroupArn,
+    listEventTrackers_maxResults,
+    listEventTrackers_nextToken,
+    listEventTrackersResponse_eventTrackers,
+    listEventTrackersResponse_nextToken,
+    listEventTrackersResponse_httpStatus,
+
+    -- ** ListFilters
+    listFilters_datasetGroupArn,
+    listFilters_maxResults,
+    listFilters_nextToken,
+    listFiltersResponse_filters,
+    listFiltersResponse_nextToken,
+    listFiltersResponse_httpStatus,
+
+    -- ** ListMetricAttributionMetrics
+    listMetricAttributionMetrics_maxResults,
+    listMetricAttributionMetrics_metricAttributionArn,
+    listMetricAttributionMetrics_nextToken,
+    listMetricAttributionMetricsResponse_metrics,
+    listMetricAttributionMetricsResponse_nextToken,
+    listMetricAttributionMetricsResponse_httpStatus,
+
+    -- ** ListMetricAttributions
+    listMetricAttributions_datasetGroupArn,
+    listMetricAttributions_maxResults,
+    listMetricAttributions_nextToken,
+    listMetricAttributionsResponse_metricAttributions,
+    listMetricAttributionsResponse_nextToken,
+    listMetricAttributionsResponse_httpStatus,
+
+    -- ** ListRecipes
+    listRecipes_domain,
+    listRecipes_maxResults,
+    listRecipes_nextToken,
+    listRecipes_recipeProvider,
+    listRecipesResponse_nextToken,
+    listRecipesResponse_recipes,
+    listRecipesResponse_httpStatus,
+
+    -- ** ListRecommenders
+    listRecommenders_datasetGroupArn,
+    listRecommenders_maxResults,
+    listRecommenders_nextToken,
+    listRecommendersResponse_nextToken,
+    listRecommendersResponse_recommenders,
+    listRecommendersResponse_httpStatus,
+
+    -- ** ListSchemas
+    listSchemas_maxResults,
+    listSchemas_nextToken,
+    listSchemasResponse_nextToken,
+    listSchemasResponse_schemas,
+    listSchemasResponse_httpStatus,
+
+    -- ** ListSolutionVersions
+    listSolutionVersions_maxResults,
+    listSolutionVersions_nextToken,
+    listSolutionVersions_solutionArn,
+    listSolutionVersionsResponse_nextToken,
+    listSolutionVersionsResponse_solutionVersions,
+    listSolutionVersionsResponse_httpStatus,
+
+    -- ** ListSolutions
+    listSolutions_datasetGroupArn,
+    listSolutions_maxResults,
+    listSolutions_nextToken,
+    listSolutionsResponse_nextToken,
+    listSolutionsResponse_solutions,
+    listSolutionsResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** StartRecommender
+    startRecommender_recommenderArn,
+    startRecommenderResponse_recommenderArn,
+    startRecommenderResponse_httpStatus,
+
+    -- ** StopRecommender
+    stopRecommender_recommenderArn,
+    stopRecommenderResponse_recommenderArn,
+    stopRecommenderResponse_httpStatus,
+
+    -- ** StopSolutionVersionCreation
+    stopSolutionVersionCreation_solutionVersionArn,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateCampaign
+    updateCampaign_campaignConfig,
+    updateCampaign_minProvisionedTPS,
+    updateCampaign_solutionVersionArn,
+    updateCampaign_campaignArn,
+    updateCampaignResponse_campaignArn,
+    updateCampaignResponse_httpStatus,
+
+    -- ** UpdateMetricAttribution
+    updateMetricAttribution_addMetrics,
+    updateMetricAttribution_metricAttributionArn,
+    updateMetricAttribution_metricsOutputConfig,
+    updateMetricAttribution_removeMetrics,
+    updateMetricAttributionResponse_metricAttributionArn,
+    updateMetricAttributionResponse_httpStatus,
+
+    -- ** UpdateRecommender
+    updateRecommender_recommenderArn,
+    updateRecommender_recommenderConfig,
+    updateRecommenderResponse_recommenderArn,
+    updateRecommenderResponse_httpStatus,
+
+    -- * Types
+
+    -- ** Algorithm
+    algorithm_algorithmArn,
+    algorithm_algorithmImage,
+    algorithm_creationDateTime,
+    algorithm_defaultHyperParameterRanges,
+    algorithm_defaultHyperParameters,
+    algorithm_defaultResourceConfig,
+    algorithm_lastUpdatedDateTime,
+    algorithm_name,
+    algorithm_roleArn,
+    algorithm_trainingInputMode,
+
+    -- ** AlgorithmImage
+    algorithmImage_name,
+    algorithmImage_dockerURI,
+
+    -- ** AutoMLConfig
+    autoMLConfig_metricName,
+    autoMLConfig_recipeList,
+
+    -- ** AutoMLResult
+    autoMLResult_bestRecipeArn,
+
+    -- ** BatchInferenceJob
+    batchInferenceJob_batchInferenceJobArn,
+    batchInferenceJob_batchInferenceJobConfig,
+    batchInferenceJob_creationDateTime,
+    batchInferenceJob_failureReason,
+    batchInferenceJob_filterArn,
+    batchInferenceJob_jobInput,
+    batchInferenceJob_jobName,
+    batchInferenceJob_jobOutput,
+    batchInferenceJob_lastUpdatedDateTime,
+    batchInferenceJob_numResults,
+    batchInferenceJob_roleArn,
+    batchInferenceJob_solutionVersionArn,
+    batchInferenceJob_status,
+
+    -- ** BatchInferenceJobConfig
+    batchInferenceJobConfig_itemExplorationConfig,
+
+    -- ** BatchInferenceJobInput
+    batchInferenceJobInput_s3DataSource,
+
+    -- ** BatchInferenceJobOutput
+    batchInferenceJobOutput_s3DataDestination,
+
+    -- ** BatchInferenceJobSummary
+    batchInferenceJobSummary_batchInferenceJobArn,
+    batchInferenceJobSummary_creationDateTime,
+    batchInferenceJobSummary_failureReason,
+    batchInferenceJobSummary_jobName,
+    batchInferenceJobSummary_lastUpdatedDateTime,
+    batchInferenceJobSummary_solutionVersionArn,
+    batchInferenceJobSummary_status,
+
+    -- ** BatchSegmentJob
+    batchSegmentJob_batchSegmentJobArn,
+    batchSegmentJob_creationDateTime,
+    batchSegmentJob_failureReason,
+    batchSegmentJob_filterArn,
+    batchSegmentJob_jobInput,
+    batchSegmentJob_jobName,
+    batchSegmentJob_jobOutput,
+    batchSegmentJob_lastUpdatedDateTime,
+    batchSegmentJob_numResults,
+    batchSegmentJob_roleArn,
+    batchSegmentJob_solutionVersionArn,
+    batchSegmentJob_status,
+
+    -- ** BatchSegmentJobInput
+    batchSegmentJobInput_s3DataSource,
+
+    -- ** BatchSegmentJobOutput
+    batchSegmentJobOutput_s3DataDestination,
+
+    -- ** BatchSegmentJobSummary
+    batchSegmentJobSummary_batchSegmentJobArn,
+    batchSegmentJobSummary_creationDateTime,
+    batchSegmentJobSummary_failureReason,
+    batchSegmentJobSummary_jobName,
+    batchSegmentJobSummary_lastUpdatedDateTime,
+    batchSegmentJobSummary_solutionVersionArn,
+    batchSegmentJobSummary_status,
+
+    -- ** Campaign
+    campaign_campaignArn,
+    campaign_campaignConfig,
+    campaign_creationDateTime,
+    campaign_failureReason,
+    campaign_lastUpdatedDateTime,
+    campaign_latestCampaignUpdate,
+    campaign_minProvisionedTPS,
+    campaign_name,
+    campaign_solutionVersionArn,
+    campaign_status,
+
+    -- ** CampaignConfig
+    campaignConfig_itemExplorationConfig,
+
+    -- ** CampaignSummary
+    campaignSummary_campaignArn,
+    campaignSummary_creationDateTime,
+    campaignSummary_failureReason,
+    campaignSummary_lastUpdatedDateTime,
+    campaignSummary_name,
+    campaignSummary_status,
+
+    -- ** CampaignUpdateSummary
+    campaignUpdateSummary_campaignConfig,
+    campaignUpdateSummary_creationDateTime,
+    campaignUpdateSummary_failureReason,
+    campaignUpdateSummary_lastUpdatedDateTime,
+    campaignUpdateSummary_minProvisionedTPS,
+    campaignUpdateSummary_solutionVersionArn,
+    campaignUpdateSummary_status,
+
+    -- ** CategoricalHyperParameterRange
+    categoricalHyperParameterRange_name,
+    categoricalHyperParameterRange_values,
+
+    -- ** ContinuousHyperParameterRange
+    continuousHyperParameterRange_maxValue,
+    continuousHyperParameterRange_minValue,
+    continuousHyperParameterRange_name,
+
+    -- ** DataSource
+    dataSource_dataLocation,
+
+    -- ** Dataset
+    dataset_creationDateTime,
+    dataset_datasetArn,
+    dataset_datasetGroupArn,
+    dataset_datasetType,
+    dataset_lastUpdatedDateTime,
+    dataset_name,
+    dataset_schemaArn,
+    dataset_status,
+
+    -- ** DatasetExportJob
+    datasetExportJob_creationDateTime,
+    datasetExportJob_datasetArn,
+    datasetExportJob_datasetExportJobArn,
+    datasetExportJob_failureReason,
+    datasetExportJob_ingestionMode,
+    datasetExportJob_jobName,
+    datasetExportJob_jobOutput,
+    datasetExportJob_lastUpdatedDateTime,
+    datasetExportJob_roleArn,
+    datasetExportJob_status,
+
+    -- ** DatasetExportJobOutput
+    datasetExportJobOutput_s3DataDestination,
+
+    -- ** DatasetExportJobSummary
+    datasetExportJobSummary_creationDateTime,
+    datasetExportJobSummary_datasetExportJobArn,
+    datasetExportJobSummary_failureReason,
+    datasetExportJobSummary_jobName,
+    datasetExportJobSummary_lastUpdatedDateTime,
+    datasetExportJobSummary_status,
+
+    -- ** DatasetGroup
+    datasetGroup_creationDateTime,
+    datasetGroup_datasetGroupArn,
+    datasetGroup_domain,
+    datasetGroup_failureReason,
+    datasetGroup_kmsKeyArn,
+    datasetGroup_lastUpdatedDateTime,
+    datasetGroup_name,
+    datasetGroup_roleArn,
+    datasetGroup_status,
+
+    -- ** DatasetGroupSummary
+    datasetGroupSummary_creationDateTime,
+    datasetGroupSummary_datasetGroupArn,
+    datasetGroupSummary_domain,
+    datasetGroupSummary_failureReason,
+    datasetGroupSummary_lastUpdatedDateTime,
+    datasetGroupSummary_name,
+    datasetGroupSummary_status,
+
+    -- ** DatasetImportJob
+    datasetImportJob_creationDateTime,
+    datasetImportJob_dataSource,
+    datasetImportJob_datasetArn,
+    datasetImportJob_datasetImportJobArn,
+    datasetImportJob_failureReason,
+    datasetImportJob_importMode,
+    datasetImportJob_jobName,
+    datasetImportJob_lastUpdatedDateTime,
+    datasetImportJob_publishAttributionMetricsToS3,
+    datasetImportJob_roleArn,
+    datasetImportJob_status,
+
+    -- ** DatasetImportJobSummary
+    datasetImportJobSummary_creationDateTime,
+    datasetImportJobSummary_datasetImportJobArn,
+    datasetImportJobSummary_failureReason,
+    datasetImportJobSummary_importMode,
+    datasetImportJobSummary_jobName,
+    datasetImportJobSummary_lastUpdatedDateTime,
+    datasetImportJobSummary_status,
+
+    -- ** DatasetSchema
+    datasetSchema_creationDateTime,
+    datasetSchema_domain,
+    datasetSchema_lastUpdatedDateTime,
+    datasetSchema_name,
+    datasetSchema_schema,
+    datasetSchema_schemaArn,
+
+    -- ** DatasetSchemaSummary
+    datasetSchemaSummary_creationDateTime,
+    datasetSchemaSummary_domain,
+    datasetSchemaSummary_lastUpdatedDateTime,
+    datasetSchemaSummary_name,
+    datasetSchemaSummary_schemaArn,
+
+    -- ** DatasetSummary
+    datasetSummary_creationDateTime,
+    datasetSummary_datasetArn,
+    datasetSummary_datasetType,
+    datasetSummary_lastUpdatedDateTime,
+    datasetSummary_name,
+    datasetSummary_status,
+
+    -- ** DefaultCategoricalHyperParameterRange
+    defaultCategoricalHyperParameterRange_isTunable,
+    defaultCategoricalHyperParameterRange_name,
+    defaultCategoricalHyperParameterRange_values,
+
+    -- ** DefaultContinuousHyperParameterRange
+    defaultContinuousHyperParameterRange_isTunable,
+    defaultContinuousHyperParameterRange_maxValue,
+    defaultContinuousHyperParameterRange_minValue,
+    defaultContinuousHyperParameterRange_name,
+
+    -- ** DefaultHyperParameterRanges
+    defaultHyperParameterRanges_categoricalHyperParameterRanges,
+    defaultHyperParameterRanges_continuousHyperParameterRanges,
+    defaultHyperParameterRanges_integerHyperParameterRanges,
+
+    -- ** DefaultIntegerHyperParameterRange
+    defaultIntegerHyperParameterRange_isTunable,
+    defaultIntegerHyperParameterRange_maxValue,
+    defaultIntegerHyperParameterRange_minValue,
+    defaultIntegerHyperParameterRange_name,
+
+    -- ** EventTracker
+    eventTracker_accountId,
+    eventTracker_creationDateTime,
+    eventTracker_datasetGroupArn,
+    eventTracker_eventTrackerArn,
+    eventTracker_lastUpdatedDateTime,
+    eventTracker_name,
+    eventTracker_status,
+    eventTracker_trackingId,
+
+    -- ** EventTrackerSummary
+    eventTrackerSummary_creationDateTime,
+    eventTrackerSummary_eventTrackerArn,
+    eventTrackerSummary_lastUpdatedDateTime,
+    eventTrackerSummary_name,
+    eventTrackerSummary_status,
+
+    -- ** FeatureTransformation
+    featureTransformation_creationDateTime,
+    featureTransformation_defaultParameters,
+    featureTransformation_featureTransformationArn,
+    featureTransformation_lastUpdatedDateTime,
+    featureTransformation_name,
+    featureTransformation_status,
+
+    -- ** Filter
+    filter_creationDateTime,
+    filter_datasetGroupArn,
+    filter_failureReason,
+    filter_filterArn,
+    filter_filterExpression,
+    filter_lastUpdatedDateTime,
+    filter_name,
+    filter_status,
+
+    -- ** FilterSummary
+    filterSummary_creationDateTime,
+    filterSummary_datasetGroupArn,
+    filterSummary_failureReason,
+    filterSummary_filterArn,
+    filterSummary_lastUpdatedDateTime,
+    filterSummary_name,
+    filterSummary_status,
+
+    -- ** HPOConfig
+    hPOConfig_algorithmHyperParameterRanges,
+    hPOConfig_hpoObjective,
+    hPOConfig_hpoResourceConfig,
+
+    -- ** HPOObjective
+    hPOObjective_metricName,
+    hPOObjective_metricRegex,
+    hPOObjective_type,
+
+    -- ** HPOResourceConfig
+    hPOResourceConfig_maxNumberOfTrainingJobs,
+    hPOResourceConfig_maxParallelTrainingJobs,
+
+    -- ** HyperParameterRanges
+    hyperParameterRanges_categoricalHyperParameterRanges,
+    hyperParameterRanges_continuousHyperParameterRanges,
+    hyperParameterRanges_integerHyperParameterRanges,
+
+    -- ** IntegerHyperParameterRange
+    integerHyperParameterRange_maxValue,
+    integerHyperParameterRange_minValue,
+    integerHyperParameterRange_name,
+
+    -- ** MetricAttribute
+    metricAttribute_eventType,
+    metricAttribute_metricName,
+    metricAttribute_expression,
+
+    -- ** MetricAttribution
+    metricAttribution_creationDateTime,
+    metricAttribution_datasetGroupArn,
+    metricAttribution_failureReason,
+    metricAttribution_lastUpdatedDateTime,
+    metricAttribution_metricAttributionArn,
+    metricAttribution_metricsOutputConfig,
+    metricAttribution_name,
+    metricAttribution_status,
+
+    -- ** MetricAttributionOutput
+    metricAttributionOutput_s3DataDestination,
+    metricAttributionOutput_roleArn,
+
+    -- ** MetricAttributionSummary
+    metricAttributionSummary_creationDateTime,
+    metricAttributionSummary_failureReason,
+    metricAttributionSummary_lastUpdatedDateTime,
+    metricAttributionSummary_metricAttributionArn,
+    metricAttributionSummary_name,
+    metricAttributionSummary_status,
+
+    -- ** OptimizationObjective
+    optimizationObjective_itemAttribute,
+    optimizationObjective_objectiveSensitivity,
+
+    -- ** Recipe
+    recipe_algorithmArn,
+    recipe_creationDateTime,
+    recipe_description,
+    recipe_featureTransformationArn,
+    recipe_lastUpdatedDateTime,
+    recipe_name,
+    recipe_recipeArn,
+    recipe_recipeType,
+    recipe_status,
+
+    -- ** RecipeSummary
+    recipeSummary_creationDateTime,
+    recipeSummary_domain,
+    recipeSummary_lastUpdatedDateTime,
+    recipeSummary_name,
+    recipeSummary_recipeArn,
+    recipeSummary_status,
+
+    -- ** Recommender
+    recommender_creationDateTime,
+    recommender_datasetGroupArn,
+    recommender_failureReason,
+    recommender_lastUpdatedDateTime,
+    recommender_latestRecommenderUpdate,
+    recommender_modelMetrics,
+    recommender_name,
+    recommender_recipeArn,
+    recommender_recommenderArn,
+    recommender_recommenderConfig,
+    recommender_status,
+
+    -- ** RecommenderConfig
+    recommenderConfig_itemExplorationConfig,
+    recommenderConfig_minRecommendationRequestsPerSecond,
+
+    -- ** RecommenderSummary
+    recommenderSummary_creationDateTime,
+    recommenderSummary_datasetGroupArn,
+    recommenderSummary_lastUpdatedDateTime,
+    recommenderSummary_name,
+    recommenderSummary_recipeArn,
+    recommenderSummary_recommenderArn,
+    recommenderSummary_recommenderConfig,
+    recommenderSummary_status,
+
+    -- ** RecommenderUpdateSummary
+    recommenderUpdateSummary_creationDateTime,
+    recommenderUpdateSummary_failureReason,
+    recommenderUpdateSummary_lastUpdatedDateTime,
+    recommenderUpdateSummary_recommenderConfig,
+    recommenderUpdateSummary_status,
+
+    -- ** S3DataConfig
+    s3DataConfig_kmsKeyArn,
+    s3DataConfig_path,
+
+    -- ** Solution
+    solution_autoMLResult,
+    solution_creationDateTime,
+    solution_datasetGroupArn,
+    solution_eventType,
+    solution_lastUpdatedDateTime,
+    solution_latestSolutionVersion,
+    solution_name,
+    solution_performAutoML,
+    solution_performHPO,
+    solution_recipeArn,
+    solution_solutionArn,
+    solution_solutionConfig,
+    solution_status,
+
+    -- ** SolutionConfig
+    solutionConfig_algorithmHyperParameters,
+    solutionConfig_autoMLConfig,
+    solutionConfig_eventValueThreshold,
+    solutionConfig_featureTransformationParameters,
+    solutionConfig_hpoConfig,
+    solutionConfig_optimizationObjective,
+
+    -- ** SolutionSummary
+    solutionSummary_creationDateTime,
+    solutionSummary_lastUpdatedDateTime,
+    solutionSummary_name,
+    solutionSummary_recipeArn,
+    solutionSummary_solutionArn,
+    solutionSummary_status,
+
+    -- ** SolutionVersion
+    solutionVersion_creationDateTime,
+    solutionVersion_datasetGroupArn,
+    solutionVersion_eventType,
+    solutionVersion_failureReason,
+    solutionVersion_lastUpdatedDateTime,
+    solutionVersion_name,
+    solutionVersion_performAutoML,
+    solutionVersion_performHPO,
+    solutionVersion_recipeArn,
+    solutionVersion_solutionArn,
+    solutionVersion_solutionConfig,
+    solutionVersion_solutionVersionArn,
+    solutionVersion_status,
+    solutionVersion_trainingHours,
+    solutionVersion_trainingMode,
+    solutionVersion_tunedHPOParams,
+
+    -- ** SolutionVersionSummary
+    solutionVersionSummary_creationDateTime,
+    solutionVersionSummary_failureReason,
+    solutionVersionSummary_lastUpdatedDateTime,
+    solutionVersionSummary_solutionVersionArn,
+    solutionVersionSummary_status,
+
+    -- ** Tag
+    tag_tagKey,
+    tag_tagValue,
+
+    -- ** TunedHPOParams
+    tunedHPOParams_algorithmHyperParameters,
+  )
+where
+
+import Amazonka.Personalize.CreateBatchInferenceJob
+import Amazonka.Personalize.CreateBatchSegmentJob
+import Amazonka.Personalize.CreateCampaign
+import Amazonka.Personalize.CreateDataset
+import Amazonka.Personalize.CreateDatasetExportJob
+import Amazonka.Personalize.CreateDatasetGroup
+import Amazonka.Personalize.CreateDatasetImportJob
+import Amazonka.Personalize.CreateEventTracker
+import Amazonka.Personalize.CreateFilter
+import Amazonka.Personalize.CreateMetricAttribution
+import Amazonka.Personalize.CreateRecommender
+import Amazonka.Personalize.CreateSchema
+import Amazonka.Personalize.CreateSolution
+import Amazonka.Personalize.CreateSolutionVersion
+import Amazonka.Personalize.DeleteCampaign
+import Amazonka.Personalize.DeleteDataset
+import Amazonka.Personalize.DeleteDatasetGroup
+import Amazonka.Personalize.DeleteEventTracker
+import Amazonka.Personalize.DeleteFilter
+import Amazonka.Personalize.DeleteMetricAttribution
+import Amazonka.Personalize.DeleteRecommender
+import Amazonka.Personalize.DeleteSchema
+import Amazonka.Personalize.DeleteSolution
+import Amazonka.Personalize.DescribeAlgorithm
+import Amazonka.Personalize.DescribeBatchInferenceJob
+import Amazonka.Personalize.DescribeBatchSegmentJob
+import Amazonka.Personalize.DescribeCampaign
+import Amazonka.Personalize.DescribeDataset
+import Amazonka.Personalize.DescribeDatasetExportJob
+import Amazonka.Personalize.DescribeDatasetGroup
+import Amazonka.Personalize.DescribeDatasetImportJob
+import Amazonka.Personalize.DescribeEventTracker
+import Amazonka.Personalize.DescribeFeatureTransformation
+import Amazonka.Personalize.DescribeFilter
+import Amazonka.Personalize.DescribeMetricAttribution
+import Amazonka.Personalize.DescribeRecipe
+import Amazonka.Personalize.DescribeRecommender
+import Amazonka.Personalize.DescribeSchema
+import Amazonka.Personalize.DescribeSolution
+import Amazonka.Personalize.DescribeSolutionVersion
+import Amazonka.Personalize.GetSolutionMetrics
+import Amazonka.Personalize.ListBatchInferenceJobs
+import Amazonka.Personalize.ListBatchSegmentJobs
+import Amazonka.Personalize.ListCampaigns
+import Amazonka.Personalize.ListDatasetExportJobs
+import Amazonka.Personalize.ListDatasetGroups
+import Amazonka.Personalize.ListDatasetImportJobs
+import Amazonka.Personalize.ListDatasets
+import Amazonka.Personalize.ListEventTrackers
+import Amazonka.Personalize.ListFilters
+import Amazonka.Personalize.ListMetricAttributionMetrics
+import Amazonka.Personalize.ListMetricAttributions
+import Amazonka.Personalize.ListRecipes
+import Amazonka.Personalize.ListRecommenders
+import Amazonka.Personalize.ListSchemas
+import Amazonka.Personalize.ListSolutionVersions
+import Amazonka.Personalize.ListSolutions
+import Amazonka.Personalize.ListTagsForResource
+import Amazonka.Personalize.StartRecommender
+import Amazonka.Personalize.StopRecommender
+import Amazonka.Personalize.StopSolutionVersionCreation
+import Amazonka.Personalize.TagResource
+import Amazonka.Personalize.Types.Algorithm
+import Amazonka.Personalize.Types.AlgorithmImage
+import Amazonka.Personalize.Types.AutoMLConfig
+import Amazonka.Personalize.Types.AutoMLResult
+import Amazonka.Personalize.Types.BatchInferenceJob
+import Amazonka.Personalize.Types.BatchInferenceJobConfig
+import Amazonka.Personalize.Types.BatchInferenceJobInput
+import Amazonka.Personalize.Types.BatchInferenceJobOutput
+import Amazonka.Personalize.Types.BatchInferenceJobSummary
+import Amazonka.Personalize.Types.BatchSegmentJob
+import Amazonka.Personalize.Types.BatchSegmentJobInput
+import Amazonka.Personalize.Types.BatchSegmentJobOutput
+import Amazonka.Personalize.Types.BatchSegmentJobSummary
+import Amazonka.Personalize.Types.Campaign
+import Amazonka.Personalize.Types.CampaignConfig
+import Amazonka.Personalize.Types.CampaignSummary
+import Amazonka.Personalize.Types.CampaignUpdateSummary
+import Amazonka.Personalize.Types.CategoricalHyperParameterRange
+import Amazonka.Personalize.Types.ContinuousHyperParameterRange
+import Amazonka.Personalize.Types.DataSource
+import Amazonka.Personalize.Types.Dataset
+import Amazonka.Personalize.Types.DatasetExportJob
+import Amazonka.Personalize.Types.DatasetExportJobOutput
+import Amazonka.Personalize.Types.DatasetExportJobSummary
+import Amazonka.Personalize.Types.DatasetGroup
+import Amazonka.Personalize.Types.DatasetGroupSummary
+import Amazonka.Personalize.Types.DatasetImportJob
+import Amazonka.Personalize.Types.DatasetImportJobSummary
+import Amazonka.Personalize.Types.DatasetSchema
+import Amazonka.Personalize.Types.DatasetSchemaSummary
+import Amazonka.Personalize.Types.DatasetSummary
+import Amazonka.Personalize.Types.DefaultCategoricalHyperParameterRange
+import Amazonka.Personalize.Types.DefaultContinuousHyperParameterRange
+import Amazonka.Personalize.Types.DefaultHyperParameterRanges
+import Amazonka.Personalize.Types.DefaultIntegerHyperParameterRange
+import Amazonka.Personalize.Types.EventTracker
+import Amazonka.Personalize.Types.EventTrackerSummary
+import Amazonka.Personalize.Types.FeatureTransformation
+import Amazonka.Personalize.Types.Filter
+import Amazonka.Personalize.Types.FilterSummary
+import Amazonka.Personalize.Types.HPOConfig
+import Amazonka.Personalize.Types.HPOObjective
+import Amazonka.Personalize.Types.HPOResourceConfig
+import Amazonka.Personalize.Types.HyperParameterRanges
+import Amazonka.Personalize.Types.IntegerHyperParameterRange
+import Amazonka.Personalize.Types.MetricAttribute
+import Amazonka.Personalize.Types.MetricAttribution
+import Amazonka.Personalize.Types.MetricAttributionOutput
+import Amazonka.Personalize.Types.MetricAttributionSummary
+import Amazonka.Personalize.Types.OptimizationObjective
+import Amazonka.Personalize.Types.Recipe
+import Amazonka.Personalize.Types.RecipeSummary
+import Amazonka.Personalize.Types.Recommender
+import Amazonka.Personalize.Types.RecommenderConfig
+import Amazonka.Personalize.Types.RecommenderSummary
+import Amazonka.Personalize.Types.RecommenderUpdateSummary
+import Amazonka.Personalize.Types.S3DataConfig
+import Amazonka.Personalize.Types.Solution
+import Amazonka.Personalize.Types.SolutionConfig
+import Amazonka.Personalize.Types.SolutionSummary
+import Amazonka.Personalize.Types.SolutionVersion
+import Amazonka.Personalize.Types.SolutionVersionSummary
+import Amazonka.Personalize.Types.Tag
+import Amazonka.Personalize.Types.TunedHPOParams
+import Amazonka.Personalize.UntagResource
+import Amazonka.Personalize.UpdateCampaign
+import Amazonka.Personalize.UpdateMetricAttribution
+import Amazonka.Personalize.UpdateRecommender
diff --git a/gen/Amazonka/Personalize/ListBatchInferenceJobs.hs b/gen/Amazonka/Personalize/ListBatchInferenceJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListBatchInferenceJobs.hs
@@ -0,0 +1,251 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListBatchInferenceJobs
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets a list of the batch inference jobs that have been performed off of
+-- a solution version.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListBatchInferenceJobs
+  ( -- * Creating a Request
+    ListBatchInferenceJobs (..),
+    newListBatchInferenceJobs,
+
+    -- * Request Lenses
+    listBatchInferenceJobs_maxResults,
+    listBatchInferenceJobs_nextToken,
+    listBatchInferenceJobs_solutionVersionArn,
+
+    -- * Destructuring the Response
+    ListBatchInferenceJobsResponse (..),
+    newListBatchInferenceJobsResponse,
+
+    -- * Response Lenses
+    listBatchInferenceJobsResponse_batchInferenceJobs,
+    listBatchInferenceJobsResponse_nextToken,
+    listBatchInferenceJobsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListBatchInferenceJobs' smart constructor.
+data ListBatchInferenceJobs = ListBatchInferenceJobs'
+  { -- | The maximum number of batch inference job results to return in each
+    -- page. The default value is 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to request the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the solution version from which the
+    -- batch inference jobs were created.
+    solutionVersionArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListBatchInferenceJobs' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listBatchInferenceJobs_maxResults' - The maximum number of batch inference job results to return in each
+-- page. The default value is 100.
+--
+-- 'nextToken', 'listBatchInferenceJobs_nextToken' - The token to request the next page of results.
+--
+-- 'solutionVersionArn', 'listBatchInferenceJobs_solutionVersionArn' - The Amazon Resource Name (ARN) of the solution version from which the
+-- batch inference jobs were created.
+newListBatchInferenceJobs ::
+  ListBatchInferenceJobs
+newListBatchInferenceJobs =
+  ListBatchInferenceJobs'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      solutionVersionArn = Prelude.Nothing
+    }
+
+-- | The maximum number of batch inference job results to return in each
+-- page. The default value is 100.
+listBatchInferenceJobs_maxResults :: Lens.Lens' ListBatchInferenceJobs (Prelude.Maybe Prelude.Natural)
+listBatchInferenceJobs_maxResults = Lens.lens (\ListBatchInferenceJobs' {maxResults} -> maxResults) (\s@ListBatchInferenceJobs' {} a -> s {maxResults = a} :: ListBatchInferenceJobs)
+
+-- | The token to request the next page of results.
+listBatchInferenceJobs_nextToken :: Lens.Lens' ListBatchInferenceJobs (Prelude.Maybe Prelude.Text)
+listBatchInferenceJobs_nextToken = Lens.lens (\ListBatchInferenceJobs' {nextToken} -> nextToken) (\s@ListBatchInferenceJobs' {} a -> s {nextToken = a} :: ListBatchInferenceJobs)
+
+-- | The Amazon Resource Name (ARN) of the solution version from which the
+-- batch inference jobs were created.
+listBatchInferenceJobs_solutionVersionArn :: Lens.Lens' ListBatchInferenceJobs (Prelude.Maybe Prelude.Text)
+listBatchInferenceJobs_solutionVersionArn = Lens.lens (\ListBatchInferenceJobs' {solutionVersionArn} -> solutionVersionArn) (\s@ListBatchInferenceJobs' {} a -> s {solutionVersionArn = a} :: ListBatchInferenceJobs)
+
+instance Core.AWSPager ListBatchInferenceJobs where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listBatchInferenceJobsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listBatchInferenceJobsResponse_batchInferenceJobs
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listBatchInferenceJobs_nextToken
+          Lens..~ rs
+          Lens.^? listBatchInferenceJobsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListBatchInferenceJobs where
+  type
+    AWSResponse ListBatchInferenceJobs =
+      ListBatchInferenceJobsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListBatchInferenceJobsResponse'
+            Prelude.<$> ( x
+                            Data..?> "batchInferenceJobs"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListBatchInferenceJobs where
+  hashWithSalt _salt ListBatchInferenceJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` solutionVersionArn
+
+instance Prelude.NFData ListBatchInferenceJobs where
+  rnf ListBatchInferenceJobs' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+
+instance Data.ToHeaders ListBatchInferenceJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListBatchInferenceJobs" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListBatchInferenceJobs where
+  toJSON ListBatchInferenceJobs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("solutionVersionArn" Data..=)
+              Prelude.<$> solutionVersionArn
+          ]
+      )
+
+instance Data.ToPath ListBatchInferenceJobs where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListBatchInferenceJobs where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListBatchInferenceJobsResponse' smart constructor.
+data ListBatchInferenceJobsResponse = ListBatchInferenceJobsResponse'
+  { -- | A list containing information on each job that is returned.
+    batchInferenceJobs :: Prelude.Maybe [BatchInferenceJobSummary],
+    -- | The token to use to retrieve the next page of results. The value is
+    -- @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListBatchInferenceJobsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchInferenceJobs', 'listBatchInferenceJobsResponse_batchInferenceJobs' - A list containing information on each job that is returned.
+--
+-- 'nextToken', 'listBatchInferenceJobsResponse_nextToken' - The token to use to retrieve the next page of results. The value is
+-- @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'listBatchInferenceJobsResponse_httpStatus' - The response's http status code.
+newListBatchInferenceJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListBatchInferenceJobsResponse
+newListBatchInferenceJobsResponse pHttpStatus_ =
+  ListBatchInferenceJobsResponse'
+    { batchInferenceJobs =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list containing information on each job that is returned.
+listBatchInferenceJobsResponse_batchInferenceJobs :: Lens.Lens' ListBatchInferenceJobsResponse (Prelude.Maybe [BatchInferenceJobSummary])
+listBatchInferenceJobsResponse_batchInferenceJobs = Lens.lens (\ListBatchInferenceJobsResponse' {batchInferenceJobs} -> batchInferenceJobs) (\s@ListBatchInferenceJobsResponse' {} a -> s {batchInferenceJobs = a} :: ListBatchInferenceJobsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token to use to retrieve the next page of results. The value is
+-- @null@ when there are no more results to return.
+listBatchInferenceJobsResponse_nextToken :: Lens.Lens' ListBatchInferenceJobsResponse (Prelude.Maybe Prelude.Text)
+listBatchInferenceJobsResponse_nextToken = Lens.lens (\ListBatchInferenceJobsResponse' {nextToken} -> nextToken) (\s@ListBatchInferenceJobsResponse' {} a -> s {nextToken = a} :: ListBatchInferenceJobsResponse)
+
+-- | The response's http status code.
+listBatchInferenceJobsResponse_httpStatus :: Lens.Lens' ListBatchInferenceJobsResponse Prelude.Int
+listBatchInferenceJobsResponse_httpStatus = Lens.lens (\ListBatchInferenceJobsResponse' {httpStatus} -> httpStatus) (\s@ListBatchInferenceJobsResponse' {} a -> s {httpStatus = a} :: ListBatchInferenceJobsResponse)
+
+instance
+  Prelude.NFData
+    ListBatchInferenceJobsResponse
+  where
+  rnf ListBatchInferenceJobsResponse' {..} =
+    Prelude.rnf batchInferenceJobs
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListBatchSegmentJobs.hs b/gen/Amazonka/Personalize/ListBatchSegmentJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListBatchSegmentJobs.hs
@@ -0,0 +1,247 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListBatchSegmentJobs
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Gets a list of the batch segment jobs that have been performed off of a
+-- solution version that you specify.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListBatchSegmentJobs
+  ( -- * Creating a Request
+    ListBatchSegmentJobs (..),
+    newListBatchSegmentJobs,
+
+    -- * Request Lenses
+    listBatchSegmentJobs_maxResults,
+    listBatchSegmentJobs_nextToken,
+    listBatchSegmentJobs_solutionVersionArn,
+
+    -- * Destructuring the Response
+    ListBatchSegmentJobsResponse (..),
+    newListBatchSegmentJobsResponse,
+
+    -- * Response Lenses
+    listBatchSegmentJobsResponse_batchSegmentJobs,
+    listBatchSegmentJobsResponse_nextToken,
+    listBatchSegmentJobsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListBatchSegmentJobs' smart constructor.
+data ListBatchSegmentJobs = ListBatchSegmentJobs'
+  { -- | The maximum number of batch segment job results to return in each page.
+    -- The default value is 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The token to request the next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the solution version that the batch
+    -- segment jobs used to generate batch segments.
+    solutionVersionArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListBatchSegmentJobs' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listBatchSegmentJobs_maxResults' - The maximum number of batch segment job results to return in each page.
+-- The default value is 100.
+--
+-- 'nextToken', 'listBatchSegmentJobs_nextToken' - The token to request the next page of results.
+--
+-- 'solutionVersionArn', 'listBatchSegmentJobs_solutionVersionArn' - The Amazon Resource Name (ARN) of the solution version that the batch
+-- segment jobs used to generate batch segments.
+newListBatchSegmentJobs ::
+  ListBatchSegmentJobs
+newListBatchSegmentJobs =
+  ListBatchSegmentJobs'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      solutionVersionArn = Prelude.Nothing
+    }
+
+-- | The maximum number of batch segment job results to return in each page.
+-- The default value is 100.
+listBatchSegmentJobs_maxResults :: Lens.Lens' ListBatchSegmentJobs (Prelude.Maybe Prelude.Natural)
+listBatchSegmentJobs_maxResults = Lens.lens (\ListBatchSegmentJobs' {maxResults} -> maxResults) (\s@ListBatchSegmentJobs' {} a -> s {maxResults = a} :: ListBatchSegmentJobs)
+
+-- | The token to request the next page of results.
+listBatchSegmentJobs_nextToken :: Lens.Lens' ListBatchSegmentJobs (Prelude.Maybe Prelude.Text)
+listBatchSegmentJobs_nextToken = Lens.lens (\ListBatchSegmentJobs' {nextToken} -> nextToken) (\s@ListBatchSegmentJobs' {} a -> s {nextToken = a} :: ListBatchSegmentJobs)
+
+-- | The Amazon Resource Name (ARN) of the solution version that the batch
+-- segment jobs used to generate batch segments.
+listBatchSegmentJobs_solutionVersionArn :: Lens.Lens' ListBatchSegmentJobs (Prelude.Maybe Prelude.Text)
+listBatchSegmentJobs_solutionVersionArn = Lens.lens (\ListBatchSegmentJobs' {solutionVersionArn} -> solutionVersionArn) (\s@ListBatchSegmentJobs' {} a -> s {solutionVersionArn = a} :: ListBatchSegmentJobs)
+
+instance Core.AWSPager ListBatchSegmentJobs where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listBatchSegmentJobsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listBatchSegmentJobsResponse_batchSegmentJobs
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listBatchSegmentJobs_nextToken
+          Lens..~ rs
+          Lens.^? listBatchSegmentJobsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListBatchSegmentJobs where
+  type
+    AWSResponse ListBatchSegmentJobs =
+      ListBatchSegmentJobsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListBatchSegmentJobsResponse'
+            Prelude.<$> ( x
+                            Data..?> "batchSegmentJobs"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListBatchSegmentJobs where
+  hashWithSalt _salt ListBatchSegmentJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` solutionVersionArn
+
+instance Prelude.NFData ListBatchSegmentJobs where
+  rnf ListBatchSegmentJobs' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+
+instance Data.ToHeaders ListBatchSegmentJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListBatchSegmentJobs" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListBatchSegmentJobs where
+  toJSON ListBatchSegmentJobs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("solutionVersionArn" Data..=)
+              Prelude.<$> solutionVersionArn
+          ]
+      )
+
+instance Data.ToPath ListBatchSegmentJobs where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListBatchSegmentJobs where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListBatchSegmentJobsResponse' smart constructor.
+data ListBatchSegmentJobsResponse = ListBatchSegmentJobsResponse'
+  { -- | A list containing information on each job that is returned.
+    batchSegmentJobs :: Prelude.Maybe [BatchSegmentJobSummary],
+    -- | The token to use to retrieve the next page of results. The value is
+    -- @null@ when there are no more results to return.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListBatchSegmentJobsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchSegmentJobs', 'listBatchSegmentJobsResponse_batchSegmentJobs' - A list containing information on each job that is returned.
+--
+-- 'nextToken', 'listBatchSegmentJobsResponse_nextToken' - The token to use to retrieve the next page of results. The value is
+-- @null@ when there are no more results to return.
+--
+-- 'httpStatus', 'listBatchSegmentJobsResponse_httpStatus' - The response's http status code.
+newListBatchSegmentJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListBatchSegmentJobsResponse
+newListBatchSegmentJobsResponse pHttpStatus_ =
+  ListBatchSegmentJobsResponse'
+    { batchSegmentJobs =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list containing information on each job that is returned.
+listBatchSegmentJobsResponse_batchSegmentJobs :: Lens.Lens' ListBatchSegmentJobsResponse (Prelude.Maybe [BatchSegmentJobSummary])
+listBatchSegmentJobsResponse_batchSegmentJobs = Lens.lens (\ListBatchSegmentJobsResponse' {batchSegmentJobs} -> batchSegmentJobs) (\s@ListBatchSegmentJobsResponse' {} a -> s {batchSegmentJobs = a} :: ListBatchSegmentJobsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The token to use to retrieve the next page of results. The value is
+-- @null@ when there are no more results to return.
+listBatchSegmentJobsResponse_nextToken :: Lens.Lens' ListBatchSegmentJobsResponse (Prelude.Maybe Prelude.Text)
+listBatchSegmentJobsResponse_nextToken = Lens.lens (\ListBatchSegmentJobsResponse' {nextToken} -> nextToken) (\s@ListBatchSegmentJobsResponse' {} a -> s {nextToken = a} :: ListBatchSegmentJobsResponse)
+
+-- | The response's http status code.
+listBatchSegmentJobsResponse_httpStatus :: Lens.Lens' ListBatchSegmentJobsResponse Prelude.Int
+listBatchSegmentJobsResponse_httpStatus = Lens.lens (\ListBatchSegmentJobsResponse' {httpStatus} -> httpStatus) (\s@ListBatchSegmentJobsResponse' {} a -> s {httpStatus = a} :: ListBatchSegmentJobsResponse)
+
+instance Prelude.NFData ListBatchSegmentJobsResponse where
+  rnf ListBatchSegmentJobsResponse' {..} =
+    Prelude.rnf batchSegmentJobs
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListCampaigns.hs b/gen/Amazonka/Personalize/ListCampaigns.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListCampaigns.hs
@@ -0,0 +1,249 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListCampaigns
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of campaigns that use the given solution. When a solution
+-- is not specified, all the campaigns associated with the account are
+-- listed. The response provides the properties for each campaign,
+-- including the Amazon Resource Name (ARN). For more information on
+-- campaigns, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateCampaign.html CreateCampaign>.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListCampaigns
+  ( -- * Creating a Request
+    ListCampaigns (..),
+    newListCampaigns,
+
+    -- * Request Lenses
+    listCampaigns_maxResults,
+    listCampaigns_nextToken,
+    listCampaigns_solutionArn,
+
+    -- * Destructuring the Response
+    ListCampaignsResponse (..),
+    newListCampaignsResponse,
+
+    -- * Response Lenses
+    listCampaignsResponse_campaigns,
+    listCampaignsResponse_nextToken,
+    listCampaignsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListCampaigns' smart constructor.
+data ListCampaigns = ListCampaigns'
+  { -- | The maximum number of campaigns to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token returned from the previous call to
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/API_ListCampaigns.html ListCampaigns>
+    -- for getting the next set of campaigns (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the solution to list the campaigns
+    -- for. When a solution is not specified, all the campaigns associated with
+    -- the account are listed.
+    solutionArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListCampaigns' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listCampaigns_maxResults' - The maximum number of campaigns to return.
+--
+-- 'nextToken', 'listCampaigns_nextToken' - A token returned from the previous call to
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_ListCampaigns.html ListCampaigns>
+-- for getting the next set of campaigns (if they exist).
+--
+-- 'solutionArn', 'listCampaigns_solutionArn' - The Amazon Resource Name (ARN) of the solution to list the campaigns
+-- for. When a solution is not specified, all the campaigns associated with
+-- the account are listed.
+newListCampaigns ::
+  ListCampaigns
+newListCampaigns =
+  ListCampaigns'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      solutionArn = Prelude.Nothing
+    }
+
+-- | The maximum number of campaigns to return.
+listCampaigns_maxResults :: Lens.Lens' ListCampaigns (Prelude.Maybe Prelude.Natural)
+listCampaigns_maxResults = Lens.lens (\ListCampaigns' {maxResults} -> maxResults) (\s@ListCampaigns' {} a -> s {maxResults = a} :: ListCampaigns)
+
+-- | A token returned from the previous call to
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_ListCampaigns.html ListCampaigns>
+-- for getting the next set of campaigns (if they exist).
+listCampaigns_nextToken :: Lens.Lens' ListCampaigns (Prelude.Maybe Prelude.Text)
+listCampaigns_nextToken = Lens.lens (\ListCampaigns' {nextToken} -> nextToken) (\s@ListCampaigns' {} a -> s {nextToken = a} :: ListCampaigns)
+
+-- | The Amazon Resource Name (ARN) of the solution to list the campaigns
+-- for. When a solution is not specified, all the campaigns associated with
+-- the account are listed.
+listCampaigns_solutionArn :: Lens.Lens' ListCampaigns (Prelude.Maybe Prelude.Text)
+listCampaigns_solutionArn = Lens.lens (\ListCampaigns' {solutionArn} -> solutionArn) (\s@ListCampaigns' {} a -> s {solutionArn = a} :: ListCampaigns)
+
+instance Core.AWSPager ListCampaigns where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listCampaignsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listCampaignsResponse_campaigns
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listCampaigns_nextToken
+          Lens..~ rs
+          Lens.^? listCampaignsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListCampaigns where
+  type
+    AWSResponse ListCampaigns =
+      ListCampaignsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListCampaignsResponse'
+            Prelude.<$> (x Data..?> "campaigns" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListCampaigns where
+  hashWithSalt _salt ListCampaigns' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` solutionArn
+
+instance Prelude.NFData ListCampaigns where
+  rnf ListCampaigns' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf solutionArn
+
+instance Data.ToHeaders ListCampaigns where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListCampaigns" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListCampaigns where
+  toJSON ListCampaigns' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("solutionArn" Data..=) Prelude.<$> solutionArn
+          ]
+      )
+
+instance Data.ToPath ListCampaigns where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListCampaigns where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListCampaignsResponse' smart constructor.
+data ListCampaignsResponse = ListCampaignsResponse'
+  { -- | A list of the campaigns.
+    campaigns :: Prelude.Maybe [CampaignSummary],
+    -- | A token for getting the next set of campaigns (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListCampaignsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'campaigns', 'listCampaignsResponse_campaigns' - A list of the campaigns.
+--
+-- 'nextToken', 'listCampaignsResponse_nextToken' - A token for getting the next set of campaigns (if they exist).
+--
+-- 'httpStatus', 'listCampaignsResponse_httpStatus' - The response's http status code.
+newListCampaignsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListCampaignsResponse
+newListCampaignsResponse pHttpStatus_ =
+  ListCampaignsResponse'
+    { campaigns = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of the campaigns.
+listCampaignsResponse_campaigns :: Lens.Lens' ListCampaignsResponse (Prelude.Maybe [CampaignSummary])
+listCampaignsResponse_campaigns = Lens.lens (\ListCampaignsResponse' {campaigns} -> campaigns) (\s@ListCampaignsResponse' {} a -> s {campaigns = a} :: ListCampaignsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token for getting the next set of campaigns (if they exist).
+listCampaignsResponse_nextToken :: Lens.Lens' ListCampaignsResponse (Prelude.Maybe Prelude.Text)
+listCampaignsResponse_nextToken = Lens.lens (\ListCampaignsResponse' {nextToken} -> nextToken) (\s@ListCampaignsResponse' {} a -> s {nextToken = a} :: ListCampaignsResponse)
+
+-- | The response's http status code.
+listCampaignsResponse_httpStatus :: Lens.Lens' ListCampaignsResponse Prelude.Int
+listCampaignsResponse_httpStatus = Lens.lens (\ListCampaignsResponse' {httpStatus} -> httpStatus) (\s@ListCampaignsResponse' {} a -> s {httpStatus = a} :: ListCampaignsResponse)
+
+instance Prelude.NFData ListCampaignsResponse where
+  rnf ListCampaignsResponse' {..} =
+    Prelude.rnf campaigns
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListDatasetExportJobs.hs b/gen/Amazonka/Personalize/ListDatasetExportJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListDatasetExportJobs.hs
@@ -0,0 +1,250 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListDatasetExportJobs
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of dataset export jobs that use the given dataset. When a
+-- dataset is not specified, all the dataset export jobs associated with
+-- the account are listed. The response provides the properties for each
+-- dataset export job, including the Amazon Resource Name (ARN). For more
+-- information on dataset export jobs, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetExportJob.html CreateDatasetExportJob>.
+-- For more information on datasets, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDataset.html CreateDataset>.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListDatasetExportJobs
+  ( -- * Creating a Request
+    ListDatasetExportJobs (..),
+    newListDatasetExportJobs,
+
+    -- * Request Lenses
+    listDatasetExportJobs_datasetArn,
+    listDatasetExportJobs_maxResults,
+    listDatasetExportJobs_nextToken,
+
+    -- * Destructuring the Response
+    ListDatasetExportJobsResponse (..),
+    newListDatasetExportJobsResponse,
+
+    -- * Response Lenses
+    listDatasetExportJobsResponse_datasetExportJobs,
+    listDatasetExportJobsResponse_nextToken,
+    listDatasetExportJobsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListDatasetExportJobs' smart constructor.
+data ListDatasetExportJobs = ListDatasetExportJobs'
+  { -- | The Amazon Resource Name (ARN) of the dataset to list the dataset export
+    -- jobs for.
+    datasetArn :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of dataset export jobs to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token returned from the previous call to @ListDatasetExportJobs@ for
+    -- getting the next set of dataset export jobs (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDatasetExportJobs' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetArn', 'listDatasetExportJobs_datasetArn' - The Amazon Resource Name (ARN) of the dataset to list the dataset export
+-- jobs for.
+--
+-- 'maxResults', 'listDatasetExportJobs_maxResults' - The maximum number of dataset export jobs to return.
+--
+-- 'nextToken', 'listDatasetExportJobs_nextToken' - A token returned from the previous call to @ListDatasetExportJobs@ for
+-- getting the next set of dataset export jobs (if they exist).
+newListDatasetExportJobs ::
+  ListDatasetExportJobs
+newListDatasetExportJobs =
+  ListDatasetExportJobs'
+    { datasetArn =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the dataset to list the dataset export
+-- jobs for.
+listDatasetExportJobs_datasetArn :: Lens.Lens' ListDatasetExportJobs (Prelude.Maybe Prelude.Text)
+listDatasetExportJobs_datasetArn = Lens.lens (\ListDatasetExportJobs' {datasetArn} -> datasetArn) (\s@ListDatasetExportJobs' {} a -> s {datasetArn = a} :: ListDatasetExportJobs)
+
+-- | The maximum number of dataset export jobs to return.
+listDatasetExportJobs_maxResults :: Lens.Lens' ListDatasetExportJobs (Prelude.Maybe Prelude.Natural)
+listDatasetExportJobs_maxResults = Lens.lens (\ListDatasetExportJobs' {maxResults} -> maxResults) (\s@ListDatasetExportJobs' {} a -> s {maxResults = a} :: ListDatasetExportJobs)
+
+-- | A token returned from the previous call to @ListDatasetExportJobs@ for
+-- getting the next set of dataset export jobs (if they exist).
+listDatasetExportJobs_nextToken :: Lens.Lens' ListDatasetExportJobs (Prelude.Maybe Prelude.Text)
+listDatasetExportJobs_nextToken = Lens.lens (\ListDatasetExportJobs' {nextToken} -> nextToken) (\s@ListDatasetExportJobs' {} a -> s {nextToken = a} :: ListDatasetExportJobs)
+
+instance Core.AWSPager ListDatasetExportJobs where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listDatasetExportJobsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listDatasetExportJobsResponse_datasetExportJobs
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listDatasetExportJobs_nextToken
+          Lens..~ rs
+          Lens.^? listDatasetExportJobsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListDatasetExportJobs where
+  type
+    AWSResponse ListDatasetExportJobs =
+      ListDatasetExportJobsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDatasetExportJobsResponse'
+            Prelude.<$> ( x
+                            Data..?> "datasetExportJobs"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDatasetExportJobs where
+  hashWithSalt _salt ListDatasetExportJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` datasetArn
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListDatasetExportJobs where
+  rnf ListDatasetExportJobs' {..} =
+    Prelude.rnf datasetArn
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListDatasetExportJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListDatasetExportJobs" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListDatasetExportJobs where
+  toJSON ListDatasetExportJobs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("datasetArn" Data..=) Prelude.<$> datasetArn,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListDatasetExportJobs where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListDatasetExportJobs where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListDatasetExportJobsResponse' smart constructor.
+data ListDatasetExportJobsResponse = ListDatasetExportJobsResponse'
+  { -- | The list of dataset export jobs.
+    datasetExportJobs :: Prelude.Maybe [DatasetExportJobSummary],
+    -- | A token for getting the next set of dataset export jobs (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDatasetExportJobsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetExportJobs', 'listDatasetExportJobsResponse_datasetExportJobs' - The list of dataset export jobs.
+--
+-- 'nextToken', 'listDatasetExportJobsResponse_nextToken' - A token for getting the next set of dataset export jobs (if they exist).
+--
+-- 'httpStatus', 'listDatasetExportJobsResponse_httpStatus' - The response's http status code.
+newListDatasetExportJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDatasetExportJobsResponse
+newListDatasetExportJobsResponse pHttpStatus_ =
+  ListDatasetExportJobsResponse'
+    { datasetExportJobs =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The list of dataset export jobs.
+listDatasetExportJobsResponse_datasetExportJobs :: Lens.Lens' ListDatasetExportJobsResponse (Prelude.Maybe [DatasetExportJobSummary])
+listDatasetExportJobsResponse_datasetExportJobs = Lens.lens (\ListDatasetExportJobsResponse' {datasetExportJobs} -> datasetExportJobs) (\s@ListDatasetExportJobsResponse' {} a -> s {datasetExportJobs = a} :: ListDatasetExportJobsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token for getting the next set of dataset export jobs (if they exist).
+listDatasetExportJobsResponse_nextToken :: Lens.Lens' ListDatasetExportJobsResponse (Prelude.Maybe Prelude.Text)
+listDatasetExportJobsResponse_nextToken = Lens.lens (\ListDatasetExportJobsResponse' {nextToken} -> nextToken) (\s@ListDatasetExportJobsResponse' {} a -> s {nextToken = a} :: ListDatasetExportJobsResponse)
+
+-- | The response's http status code.
+listDatasetExportJobsResponse_httpStatus :: Lens.Lens' ListDatasetExportJobsResponse Prelude.Int
+listDatasetExportJobsResponse_httpStatus = Lens.lens (\ListDatasetExportJobsResponse' {httpStatus} -> httpStatus) (\s@ListDatasetExportJobsResponse' {} a -> s {httpStatus = a} :: ListDatasetExportJobsResponse)
+
+instance Prelude.NFData ListDatasetExportJobsResponse where
+  rnf ListDatasetExportJobsResponse' {..} =
+    Prelude.rnf datasetExportJobs
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListDatasetGroups.hs b/gen/Amazonka/Personalize/ListDatasetGroups.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListDatasetGroups.hs
@@ -0,0 +1,226 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListDatasetGroups
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of dataset groups. The response provides the properties
+-- for each dataset group, including the Amazon Resource Name (ARN). For
+-- more information on dataset groups, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetGroup.html CreateDatasetGroup>.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListDatasetGroups
+  ( -- * Creating a Request
+    ListDatasetGroups (..),
+    newListDatasetGroups,
+
+    -- * Request Lenses
+    listDatasetGroups_maxResults,
+    listDatasetGroups_nextToken,
+
+    -- * Destructuring the Response
+    ListDatasetGroupsResponse (..),
+    newListDatasetGroupsResponse,
+
+    -- * Response Lenses
+    listDatasetGroupsResponse_datasetGroups,
+    listDatasetGroupsResponse_nextToken,
+    listDatasetGroupsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListDatasetGroups' smart constructor.
+data ListDatasetGroups = ListDatasetGroups'
+  { -- | The maximum number of dataset groups to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token returned from the previous call to @ListDatasetGroups@ for
+    -- getting the next set of dataset groups (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDatasetGroups' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listDatasetGroups_maxResults' - The maximum number of dataset groups to return.
+--
+-- 'nextToken', 'listDatasetGroups_nextToken' - A token returned from the previous call to @ListDatasetGroups@ for
+-- getting the next set of dataset groups (if they exist).
+newListDatasetGroups ::
+  ListDatasetGroups
+newListDatasetGroups =
+  ListDatasetGroups'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of dataset groups to return.
+listDatasetGroups_maxResults :: Lens.Lens' ListDatasetGroups (Prelude.Maybe Prelude.Natural)
+listDatasetGroups_maxResults = Lens.lens (\ListDatasetGroups' {maxResults} -> maxResults) (\s@ListDatasetGroups' {} a -> s {maxResults = a} :: ListDatasetGroups)
+
+-- | A token returned from the previous call to @ListDatasetGroups@ for
+-- getting the next set of dataset groups (if they exist).
+listDatasetGroups_nextToken :: Lens.Lens' ListDatasetGroups (Prelude.Maybe Prelude.Text)
+listDatasetGroups_nextToken = Lens.lens (\ListDatasetGroups' {nextToken} -> nextToken) (\s@ListDatasetGroups' {} a -> s {nextToken = a} :: ListDatasetGroups)
+
+instance Core.AWSPager ListDatasetGroups where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listDatasetGroupsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listDatasetGroupsResponse_datasetGroups
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listDatasetGroups_nextToken
+          Lens..~ rs
+          Lens.^? listDatasetGroupsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListDatasetGroups where
+  type
+    AWSResponse ListDatasetGroups =
+      ListDatasetGroupsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDatasetGroupsResponse'
+            Prelude.<$> (x Data..?> "datasetGroups" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDatasetGroups where
+  hashWithSalt _salt ListDatasetGroups' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListDatasetGroups where
+  rnf ListDatasetGroups' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListDatasetGroups where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListDatasetGroups" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListDatasetGroups where
+  toJSON ListDatasetGroups' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListDatasetGroups where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListDatasetGroups where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListDatasetGroupsResponse' smart constructor.
+data ListDatasetGroupsResponse = ListDatasetGroupsResponse'
+  { -- | The list of your dataset groups.
+    datasetGroups :: Prelude.Maybe [DatasetGroupSummary],
+    -- | A token for getting the next set of dataset groups (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDatasetGroupsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetGroups', 'listDatasetGroupsResponse_datasetGroups' - The list of your dataset groups.
+--
+-- 'nextToken', 'listDatasetGroupsResponse_nextToken' - A token for getting the next set of dataset groups (if they exist).
+--
+-- 'httpStatus', 'listDatasetGroupsResponse_httpStatus' - The response's http status code.
+newListDatasetGroupsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDatasetGroupsResponse
+newListDatasetGroupsResponse pHttpStatus_ =
+  ListDatasetGroupsResponse'
+    { datasetGroups =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The list of your dataset groups.
+listDatasetGroupsResponse_datasetGroups :: Lens.Lens' ListDatasetGroupsResponse (Prelude.Maybe [DatasetGroupSummary])
+listDatasetGroupsResponse_datasetGroups = Lens.lens (\ListDatasetGroupsResponse' {datasetGroups} -> datasetGroups) (\s@ListDatasetGroupsResponse' {} a -> s {datasetGroups = a} :: ListDatasetGroupsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token for getting the next set of dataset groups (if they exist).
+listDatasetGroupsResponse_nextToken :: Lens.Lens' ListDatasetGroupsResponse (Prelude.Maybe Prelude.Text)
+listDatasetGroupsResponse_nextToken = Lens.lens (\ListDatasetGroupsResponse' {nextToken} -> nextToken) (\s@ListDatasetGroupsResponse' {} a -> s {nextToken = a} :: ListDatasetGroupsResponse)
+
+-- | The response's http status code.
+listDatasetGroupsResponse_httpStatus :: Lens.Lens' ListDatasetGroupsResponse Prelude.Int
+listDatasetGroupsResponse_httpStatus = Lens.lens (\ListDatasetGroupsResponse' {httpStatus} -> httpStatus) (\s@ListDatasetGroupsResponse' {} a -> s {httpStatus = a} :: ListDatasetGroupsResponse)
+
+instance Prelude.NFData ListDatasetGroupsResponse where
+  rnf ListDatasetGroupsResponse' {..} =
+    Prelude.rnf datasetGroups
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListDatasetImportJobs.hs b/gen/Amazonka/Personalize/ListDatasetImportJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListDatasetImportJobs.hs
@@ -0,0 +1,250 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListDatasetImportJobs
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of dataset import jobs that use the given dataset. When a
+-- dataset is not specified, all the dataset import jobs associated with
+-- the account are listed. The response provides the properties for each
+-- dataset import job, including the Amazon Resource Name (ARN). For more
+-- information on dataset import jobs, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetImportJob.html CreateDatasetImportJob>.
+-- For more information on datasets, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDataset.html CreateDataset>.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListDatasetImportJobs
+  ( -- * Creating a Request
+    ListDatasetImportJobs (..),
+    newListDatasetImportJobs,
+
+    -- * Request Lenses
+    listDatasetImportJobs_datasetArn,
+    listDatasetImportJobs_maxResults,
+    listDatasetImportJobs_nextToken,
+
+    -- * Destructuring the Response
+    ListDatasetImportJobsResponse (..),
+    newListDatasetImportJobsResponse,
+
+    -- * Response Lenses
+    listDatasetImportJobsResponse_datasetImportJobs,
+    listDatasetImportJobsResponse_nextToken,
+    listDatasetImportJobsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListDatasetImportJobs' smart constructor.
+data ListDatasetImportJobs = ListDatasetImportJobs'
+  { -- | The Amazon Resource Name (ARN) of the dataset to list the dataset import
+    -- jobs for.
+    datasetArn :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of dataset import jobs to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token returned from the previous call to @ListDatasetImportJobs@ for
+    -- getting the next set of dataset import jobs (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDatasetImportJobs' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetArn', 'listDatasetImportJobs_datasetArn' - The Amazon Resource Name (ARN) of the dataset to list the dataset import
+-- jobs for.
+--
+-- 'maxResults', 'listDatasetImportJobs_maxResults' - The maximum number of dataset import jobs to return.
+--
+-- 'nextToken', 'listDatasetImportJobs_nextToken' - A token returned from the previous call to @ListDatasetImportJobs@ for
+-- getting the next set of dataset import jobs (if they exist).
+newListDatasetImportJobs ::
+  ListDatasetImportJobs
+newListDatasetImportJobs =
+  ListDatasetImportJobs'
+    { datasetArn =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the dataset to list the dataset import
+-- jobs for.
+listDatasetImportJobs_datasetArn :: Lens.Lens' ListDatasetImportJobs (Prelude.Maybe Prelude.Text)
+listDatasetImportJobs_datasetArn = Lens.lens (\ListDatasetImportJobs' {datasetArn} -> datasetArn) (\s@ListDatasetImportJobs' {} a -> s {datasetArn = a} :: ListDatasetImportJobs)
+
+-- | The maximum number of dataset import jobs to return.
+listDatasetImportJobs_maxResults :: Lens.Lens' ListDatasetImportJobs (Prelude.Maybe Prelude.Natural)
+listDatasetImportJobs_maxResults = Lens.lens (\ListDatasetImportJobs' {maxResults} -> maxResults) (\s@ListDatasetImportJobs' {} a -> s {maxResults = a} :: ListDatasetImportJobs)
+
+-- | A token returned from the previous call to @ListDatasetImportJobs@ for
+-- getting the next set of dataset import jobs (if they exist).
+listDatasetImportJobs_nextToken :: Lens.Lens' ListDatasetImportJobs (Prelude.Maybe Prelude.Text)
+listDatasetImportJobs_nextToken = Lens.lens (\ListDatasetImportJobs' {nextToken} -> nextToken) (\s@ListDatasetImportJobs' {} a -> s {nextToken = a} :: ListDatasetImportJobs)
+
+instance Core.AWSPager ListDatasetImportJobs where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listDatasetImportJobsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listDatasetImportJobsResponse_datasetImportJobs
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listDatasetImportJobs_nextToken
+          Lens..~ rs
+          Lens.^? listDatasetImportJobsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListDatasetImportJobs where
+  type
+    AWSResponse ListDatasetImportJobs =
+      ListDatasetImportJobsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDatasetImportJobsResponse'
+            Prelude.<$> ( x
+                            Data..?> "datasetImportJobs"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDatasetImportJobs where
+  hashWithSalt _salt ListDatasetImportJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` datasetArn
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListDatasetImportJobs where
+  rnf ListDatasetImportJobs' {..} =
+    Prelude.rnf datasetArn
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListDatasetImportJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListDatasetImportJobs" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListDatasetImportJobs where
+  toJSON ListDatasetImportJobs' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("datasetArn" Data..=) Prelude.<$> datasetArn,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListDatasetImportJobs where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListDatasetImportJobs where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListDatasetImportJobsResponse' smart constructor.
+data ListDatasetImportJobsResponse = ListDatasetImportJobsResponse'
+  { -- | The list of dataset import jobs.
+    datasetImportJobs :: Prelude.Maybe [DatasetImportJobSummary],
+    -- | A token for getting the next set of dataset import jobs (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDatasetImportJobsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetImportJobs', 'listDatasetImportJobsResponse_datasetImportJobs' - The list of dataset import jobs.
+--
+-- 'nextToken', 'listDatasetImportJobsResponse_nextToken' - A token for getting the next set of dataset import jobs (if they exist).
+--
+-- 'httpStatus', 'listDatasetImportJobsResponse_httpStatus' - The response's http status code.
+newListDatasetImportJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDatasetImportJobsResponse
+newListDatasetImportJobsResponse pHttpStatus_ =
+  ListDatasetImportJobsResponse'
+    { datasetImportJobs =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The list of dataset import jobs.
+listDatasetImportJobsResponse_datasetImportJobs :: Lens.Lens' ListDatasetImportJobsResponse (Prelude.Maybe [DatasetImportJobSummary])
+listDatasetImportJobsResponse_datasetImportJobs = Lens.lens (\ListDatasetImportJobsResponse' {datasetImportJobs} -> datasetImportJobs) (\s@ListDatasetImportJobsResponse' {} a -> s {datasetImportJobs = a} :: ListDatasetImportJobsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token for getting the next set of dataset import jobs (if they exist).
+listDatasetImportJobsResponse_nextToken :: Lens.Lens' ListDatasetImportJobsResponse (Prelude.Maybe Prelude.Text)
+listDatasetImportJobsResponse_nextToken = Lens.lens (\ListDatasetImportJobsResponse' {nextToken} -> nextToken) (\s@ListDatasetImportJobsResponse' {} a -> s {nextToken = a} :: ListDatasetImportJobsResponse)
+
+-- | The response's http status code.
+listDatasetImportJobsResponse_httpStatus :: Lens.Lens' ListDatasetImportJobsResponse Prelude.Int
+listDatasetImportJobsResponse_httpStatus = Lens.lens (\ListDatasetImportJobsResponse' {httpStatus} -> httpStatus) (\s@ListDatasetImportJobsResponse' {} a -> s {httpStatus = a} :: ListDatasetImportJobsResponse)
+
+instance Prelude.NFData ListDatasetImportJobsResponse where
+  rnf ListDatasetImportJobsResponse' {..} =
+    Prelude.rnf datasetImportJobs
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListDatasets.hs b/gen/Amazonka/Personalize/ListDatasets.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListDatasets.hs
@@ -0,0 +1,243 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListDatasets
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the list of datasets contained in the given dataset group. The
+-- response provides the properties for each dataset, including the Amazon
+-- Resource Name (ARN). For more information on datasets, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDataset.html CreateDataset>.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListDatasets
+  ( -- * Creating a Request
+    ListDatasets (..),
+    newListDatasets,
+
+    -- * Request Lenses
+    listDatasets_datasetGroupArn,
+    listDatasets_maxResults,
+    listDatasets_nextToken,
+
+    -- * Destructuring the Response
+    ListDatasetsResponse (..),
+    newListDatasetsResponse,
+
+    -- * Response Lenses
+    listDatasetsResponse_datasets,
+    listDatasetsResponse_nextToken,
+    listDatasetsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListDatasets' smart constructor.
+data ListDatasets = ListDatasets'
+  { -- | The Amazon Resource Name (ARN) of the dataset group that contains the
+    -- datasets to list.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of datasets to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token returned from the previous call to @ListDatasetImportJobs@ for
+    -- getting the next set of dataset import jobs (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDatasets' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetGroupArn', 'listDatasets_datasetGroupArn' - The Amazon Resource Name (ARN) of the dataset group that contains the
+-- datasets to list.
+--
+-- 'maxResults', 'listDatasets_maxResults' - The maximum number of datasets to return.
+--
+-- 'nextToken', 'listDatasets_nextToken' - A token returned from the previous call to @ListDatasetImportJobs@ for
+-- getting the next set of dataset import jobs (if they exist).
+newListDatasets ::
+  ListDatasets
+newListDatasets =
+  ListDatasets'
+    { datasetGroupArn = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the dataset group that contains the
+-- datasets to list.
+listDatasets_datasetGroupArn :: Lens.Lens' ListDatasets (Prelude.Maybe Prelude.Text)
+listDatasets_datasetGroupArn = Lens.lens (\ListDatasets' {datasetGroupArn} -> datasetGroupArn) (\s@ListDatasets' {} a -> s {datasetGroupArn = a} :: ListDatasets)
+
+-- | The maximum number of datasets to return.
+listDatasets_maxResults :: Lens.Lens' ListDatasets (Prelude.Maybe Prelude.Natural)
+listDatasets_maxResults = Lens.lens (\ListDatasets' {maxResults} -> maxResults) (\s@ListDatasets' {} a -> s {maxResults = a} :: ListDatasets)
+
+-- | A token returned from the previous call to @ListDatasetImportJobs@ for
+-- getting the next set of dataset import jobs (if they exist).
+listDatasets_nextToken :: Lens.Lens' ListDatasets (Prelude.Maybe Prelude.Text)
+listDatasets_nextToken = Lens.lens (\ListDatasets' {nextToken} -> nextToken) (\s@ListDatasets' {} a -> s {nextToken = a} :: ListDatasets)
+
+instance Core.AWSPager ListDatasets where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listDatasetsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listDatasetsResponse_datasets
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listDatasets_nextToken
+          Lens..~ rs
+          Lens.^? listDatasetsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListDatasets where
+  type AWSResponse ListDatasets = ListDatasetsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDatasetsResponse'
+            Prelude.<$> (x Data..?> "datasets" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDatasets where
+  hashWithSalt _salt ListDatasets' {..} =
+    _salt
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListDatasets where
+  rnf ListDatasets' {..} =
+    Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListDatasets where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListDatasets" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListDatasets where
+  toJSON ListDatasets' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("datasetGroupArn" Data..=)
+              Prelude.<$> datasetGroupArn,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListDatasets where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListDatasets where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListDatasetsResponse' smart constructor.
+data ListDatasetsResponse = ListDatasetsResponse'
+  { -- | An array of @Dataset@ objects. Each object provides metadata
+    -- information.
+    datasets :: Prelude.Maybe [DatasetSummary],
+    -- | A token for getting the next set of datasets (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDatasetsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasets', 'listDatasetsResponse_datasets' - An array of @Dataset@ objects. Each object provides metadata
+-- information.
+--
+-- 'nextToken', 'listDatasetsResponse_nextToken' - A token for getting the next set of datasets (if they exist).
+--
+-- 'httpStatus', 'listDatasetsResponse_httpStatus' - The response's http status code.
+newListDatasetsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDatasetsResponse
+newListDatasetsResponse pHttpStatus_ =
+  ListDatasetsResponse'
+    { datasets = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | An array of @Dataset@ objects. Each object provides metadata
+-- information.
+listDatasetsResponse_datasets :: Lens.Lens' ListDatasetsResponse (Prelude.Maybe [DatasetSummary])
+listDatasetsResponse_datasets = Lens.lens (\ListDatasetsResponse' {datasets} -> datasets) (\s@ListDatasetsResponse' {} a -> s {datasets = a} :: ListDatasetsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token for getting the next set of datasets (if they exist).
+listDatasetsResponse_nextToken :: Lens.Lens' ListDatasetsResponse (Prelude.Maybe Prelude.Text)
+listDatasetsResponse_nextToken = Lens.lens (\ListDatasetsResponse' {nextToken} -> nextToken) (\s@ListDatasetsResponse' {} a -> s {nextToken = a} :: ListDatasetsResponse)
+
+-- | The response's http status code.
+listDatasetsResponse_httpStatus :: Lens.Lens' ListDatasetsResponse Prelude.Int
+listDatasetsResponse_httpStatus = Lens.lens (\ListDatasetsResponse' {httpStatus} -> httpStatus) (\s@ListDatasetsResponse' {} a -> s {httpStatus = a} :: ListDatasetsResponse)
+
+instance Prelude.NFData ListDatasetsResponse where
+  rnf ListDatasetsResponse' {..} =
+    Prelude.rnf datasets
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListEventTrackers.hs b/gen/Amazonka/Personalize/ListEventTrackers.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListEventTrackers.hs
@@ -0,0 +1,242 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListEventTrackers
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the list of event trackers associated with the account. The
+-- response provides the properties for each event tracker, including the
+-- Amazon Resource Name (ARN) and tracking ID. For more information on
+-- event trackers, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateEventTracker.html CreateEventTracker>.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListEventTrackers
+  ( -- * Creating a Request
+    ListEventTrackers (..),
+    newListEventTrackers,
+
+    -- * Request Lenses
+    listEventTrackers_datasetGroupArn,
+    listEventTrackers_maxResults,
+    listEventTrackers_nextToken,
+
+    -- * Destructuring the Response
+    ListEventTrackersResponse (..),
+    newListEventTrackersResponse,
+
+    -- * Response Lenses
+    listEventTrackersResponse_eventTrackers,
+    listEventTrackersResponse_nextToken,
+    listEventTrackersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListEventTrackers' smart constructor.
+data ListEventTrackers = ListEventTrackers'
+  { -- | The ARN of a dataset group used to filter the response.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of event trackers to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token returned from the previous call to @ListEventTrackers@ for
+    -- getting the next set of event trackers (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListEventTrackers' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetGroupArn', 'listEventTrackers_datasetGroupArn' - The ARN of a dataset group used to filter the response.
+--
+-- 'maxResults', 'listEventTrackers_maxResults' - The maximum number of event trackers to return.
+--
+-- 'nextToken', 'listEventTrackers_nextToken' - A token returned from the previous call to @ListEventTrackers@ for
+-- getting the next set of event trackers (if they exist).
+newListEventTrackers ::
+  ListEventTrackers
+newListEventTrackers =
+  ListEventTrackers'
+    { datasetGroupArn =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The ARN of a dataset group used to filter the response.
+listEventTrackers_datasetGroupArn :: Lens.Lens' ListEventTrackers (Prelude.Maybe Prelude.Text)
+listEventTrackers_datasetGroupArn = Lens.lens (\ListEventTrackers' {datasetGroupArn} -> datasetGroupArn) (\s@ListEventTrackers' {} a -> s {datasetGroupArn = a} :: ListEventTrackers)
+
+-- | The maximum number of event trackers to return.
+listEventTrackers_maxResults :: Lens.Lens' ListEventTrackers (Prelude.Maybe Prelude.Natural)
+listEventTrackers_maxResults = Lens.lens (\ListEventTrackers' {maxResults} -> maxResults) (\s@ListEventTrackers' {} a -> s {maxResults = a} :: ListEventTrackers)
+
+-- | A token returned from the previous call to @ListEventTrackers@ for
+-- getting the next set of event trackers (if they exist).
+listEventTrackers_nextToken :: Lens.Lens' ListEventTrackers (Prelude.Maybe Prelude.Text)
+listEventTrackers_nextToken = Lens.lens (\ListEventTrackers' {nextToken} -> nextToken) (\s@ListEventTrackers' {} a -> s {nextToken = a} :: ListEventTrackers)
+
+instance Core.AWSPager ListEventTrackers where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listEventTrackersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listEventTrackersResponse_eventTrackers
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listEventTrackers_nextToken
+          Lens..~ rs
+          Lens.^? listEventTrackersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListEventTrackers where
+  type
+    AWSResponse ListEventTrackers =
+      ListEventTrackersResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListEventTrackersResponse'
+            Prelude.<$> (x Data..?> "eventTrackers" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListEventTrackers where
+  hashWithSalt _salt ListEventTrackers' {..} =
+    _salt
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListEventTrackers where
+  rnf ListEventTrackers' {..} =
+    Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListEventTrackers where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListEventTrackers" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListEventTrackers where
+  toJSON ListEventTrackers' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("datasetGroupArn" Data..=)
+              Prelude.<$> datasetGroupArn,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListEventTrackers where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListEventTrackers where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListEventTrackersResponse' smart constructor.
+data ListEventTrackersResponse = ListEventTrackersResponse'
+  { -- | A list of event trackers.
+    eventTrackers :: Prelude.Maybe [EventTrackerSummary],
+    -- | A token for getting the next set of event trackers (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListEventTrackersResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'eventTrackers', 'listEventTrackersResponse_eventTrackers' - A list of event trackers.
+--
+-- 'nextToken', 'listEventTrackersResponse_nextToken' - A token for getting the next set of event trackers (if they exist).
+--
+-- 'httpStatus', 'listEventTrackersResponse_httpStatus' - The response's http status code.
+newListEventTrackersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListEventTrackersResponse
+newListEventTrackersResponse pHttpStatus_ =
+  ListEventTrackersResponse'
+    { eventTrackers =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of event trackers.
+listEventTrackersResponse_eventTrackers :: Lens.Lens' ListEventTrackersResponse (Prelude.Maybe [EventTrackerSummary])
+listEventTrackersResponse_eventTrackers = Lens.lens (\ListEventTrackersResponse' {eventTrackers} -> eventTrackers) (\s@ListEventTrackersResponse' {} a -> s {eventTrackers = a} :: ListEventTrackersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token for getting the next set of event trackers (if they exist).
+listEventTrackersResponse_nextToken :: Lens.Lens' ListEventTrackersResponse (Prelude.Maybe Prelude.Text)
+listEventTrackersResponse_nextToken = Lens.lens (\ListEventTrackersResponse' {nextToken} -> nextToken) (\s@ListEventTrackersResponse' {} a -> s {nextToken = a} :: ListEventTrackersResponse)
+
+-- | The response's http status code.
+listEventTrackersResponse_httpStatus :: Lens.Lens' ListEventTrackersResponse Prelude.Int
+listEventTrackersResponse_httpStatus = Lens.lens (\ListEventTrackersResponse' {httpStatus} -> httpStatus) (\s@ListEventTrackersResponse' {} a -> s {httpStatus = a} :: ListEventTrackersResponse)
+
+instance Prelude.NFData ListEventTrackersResponse where
+  rnf ListEventTrackersResponse' {..} =
+    Prelude.rnf eventTrackers
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListFilters.hs b/gen/Amazonka/Personalize/ListFilters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListFilters.hs
@@ -0,0 +1,234 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListFilters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists all filters that belong to a given dataset group.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListFilters
+  ( -- * Creating a Request
+    ListFilters (..),
+    newListFilters,
+
+    -- * Request Lenses
+    listFilters_datasetGroupArn,
+    listFilters_maxResults,
+    listFilters_nextToken,
+
+    -- * Destructuring the Response
+    ListFiltersResponse (..),
+    newListFiltersResponse,
+
+    -- * Response Lenses
+    listFiltersResponse_filters,
+    listFiltersResponse_nextToken,
+    listFiltersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListFilters' smart constructor.
+data ListFilters = ListFilters'
+  { -- | The ARN of the dataset group that contains the filters.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of filters to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token returned from the previous call to @ListFilters@ for getting the
+    -- next set of filters (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListFilters' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetGroupArn', 'listFilters_datasetGroupArn' - The ARN of the dataset group that contains the filters.
+--
+-- 'maxResults', 'listFilters_maxResults' - The maximum number of filters to return.
+--
+-- 'nextToken', 'listFilters_nextToken' - A token returned from the previous call to @ListFilters@ for getting the
+-- next set of filters (if they exist).
+newListFilters ::
+  ListFilters
+newListFilters =
+  ListFilters'
+    { datasetGroupArn = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The ARN of the dataset group that contains the filters.
+listFilters_datasetGroupArn :: Lens.Lens' ListFilters (Prelude.Maybe Prelude.Text)
+listFilters_datasetGroupArn = Lens.lens (\ListFilters' {datasetGroupArn} -> datasetGroupArn) (\s@ListFilters' {} a -> s {datasetGroupArn = a} :: ListFilters)
+
+-- | The maximum number of filters to return.
+listFilters_maxResults :: Lens.Lens' ListFilters (Prelude.Maybe Prelude.Natural)
+listFilters_maxResults = Lens.lens (\ListFilters' {maxResults} -> maxResults) (\s@ListFilters' {} a -> s {maxResults = a} :: ListFilters)
+
+-- | A token returned from the previous call to @ListFilters@ for getting the
+-- next set of filters (if they exist).
+listFilters_nextToken :: Lens.Lens' ListFilters (Prelude.Maybe Prelude.Text)
+listFilters_nextToken = Lens.lens (\ListFilters' {nextToken} -> nextToken) (\s@ListFilters' {} a -> s {nextToken = a} :: ListFilters)
+
+instance Core.AWSPager ListFilters where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listFiltersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listFiltersResponse_filters
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listFilters_nextToken
+          Lens..~ rs
+          Lens.^? listFiltersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListFilters where
+  type AWSResponse ListFilters = ListFiltersResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListFiltersResponse'
+            Prelude.<$> (x Data..?> "Filters" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListFilters where
+  hashWithSalt _salt ListFilters' {..} =
+    _salt
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListFilters where
+  rnf ListFilters' {..} =
+    Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListFilters where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListFilters" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListFilters where
+  toJSON ListFilters' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("datasetGroupArn" Data..=)
+              Prelude.<$> datasetGroupArn,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListFilters where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListFilters where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListFiltersResponse' smart constructor.
+data ListFiltersResponse = ListFiltersResponse'
+  { -- | A list of returned filters.
+    filters :: Prelude.Maybe [FilterSummary],
+    -- | A token for getting the next set of filters (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListFiltersResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'filters', 'listFiltersResponse_filters' - A list of returned filters.
+--
+-- 'nextToken', 'listFiltersResponse_nextToken' - A token for getting the next set of filters (if they exist).
+--
+-- 'httpStatus', 'listFiltersResponse_httpStatus' - The response's http status code.
+newListFiltersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListFiltersResponse
+newListFiltersResponse pHttpStatus_ =
+  ListFiltersResponse'
+    { filters = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of returned filters.
+listFiltersResponse_filters :: Lens.Lens' ListFiltersResponse (Prelude.Maybe [FilterSummary])
+listFiltersResponse_filters = Lens.lens (\ListFiltersResponse' {filters} -> filters) (\s@ListFiltersResponse' {} a -> s {filters = a} :: ListFiltersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | A token for getting the next set of filters (if they exist).
+listFiltersResponse_nextToken :: Lens.Lens' ListFiltersResponse (Prelude.Maybe Prelude.Text)
+listFiltersResponse_nextToken = Lens.lens (\ListFiltersResponse' {nextToken} -> nextToken) (\s@ListFiltersResponse' {} a -> s {nextToken = a} :: ListFiltersResponse)
+
+-- | The response's http status code.
+listFiltersResponse_httpStatus :: Lens.Lens' ListFiltersResponse Prelude.Int
+listFiltersResponse_httpStatus = Lens.lens (\ListFiltersResponse' {httpStatus} -> httpStatus) (\s@ListFiltersResponse' {} a -> s {httpStatus = a} :: ListFiltersResponse)
+
+instance Prelude.NFData ListFiltersResponse where
+  rnf ListFiltersResponse' {..} =
+    Prelude.rnf filters
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListMetricAttributionMetrics.hs b/gen/Amazonka/Personalize/ListMetricAttributionMetrics.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListMetricAttributionMetrics.hs
@@ -0,0 +1,253 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListMetricAttributionMetrics
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists the metrics for the metric attribution.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListMetricAttributionMetrics
+  ( -- * Creating a Request
+    ListMetricAttributionMetrics (..),
+    newListMetricAttributionMetrics,
+
+    -- * Request Lenses
+    listMetricAttributionMetrics_maxResults,
+    listMetricAttributionMetrics_metricAttributionArn,
+    listMetricAttributionMetrics_nextToken,
+
+    -- * Destructuring the Response
+    ListMetricAttributionMetricsResponse (..),
+    newListMetricAttributionMetricsResponse,
+
+    -- * Response Lenses
+    listMetricAttributionMetricsResponse_metrics,
+    listMetricAttributionMetricsResponse_nextToken,
+    listMetricAttributionMetricsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListMetricAttributionMetrics' smart constructor.
+data ListMetricAttributionMetrics = ListMetricAttributionMetrics'
+  { -- | The maximum number of metrics to return in one page of results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | The Amazon Resource Name (ARN) of the metric attribution to retrieve
+    -- attributes for.
+    metricAttributionArn :: Prelude.Maybe Prelude.Text,
+    -- | Specify the pagination token from a previous request to retrieve the
+    -- next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListMetricAttributionMetrics' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listMetricAttributionMetrics_maxResults' - The maximum number of metrics to return in one page of results.
+--
+-- 'metricAttributionArn', 'listMetricAttributionMetrics_metricAttributionArn' - The Amazon Resource Name (ARN) of the metric attribution to retrieve
+-- attributes for.
+--
+-- 'nextToken', 'listMetricAttributionMetrics_nextToken' - Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+newListMetricAttributionMetrics ::
+  ListMetricAttributionMetrics
+newListMetricAttributionMetrics =
+  ListMetricAttributionMetrics'
+    { maxResults =
+        Prelude.Nothing,
+      metricAttributionArn = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of metrics to return in one page of results.
+listMetricAttributionMetrics_maxResults :: Lens.Lens' ListMetricAttributionMetrics (Prelude.Maybe Prelude.Natural)
+listMetricAttributionMetrics_maxResults = Lens.lens (\ListMetricAttributionMetrics' {maxResults} -> maxResults) (\s@ListMetricAttributionMetrics' {} a -> s {maxResults = a} :: ListMetricAttributionMetrics)
+
+-- | The Amazon Resource Name (ARN) of the metric attribution to retrieve
+-- attributes for.
+listMetricAttributionMetrics_metricAttributionArn :: Lens.Lens' ListMetricAttributionMetrics (Prelude.Maybe Prelude.Text)
+listMetricAttributionMetrics_metricAttributionArn = Lens.lens (\ListMetricAttributionMetrics' {metricAttributionArn} -> metricAttributionArn) (\s@ListMetricAttributionMetrics' {} a -> s {metricAttributionArn = a} :: ListMetricAttributionMetrics)
+
+-- | Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+listMetricAttributionMetrics_nextToken :: Lens.Lens' ListMetricAttributionMetrics (Prelude.Maybe Prelude.Text)
+listMetricAttributionMetrics_nextToken = Lens.lens (\ListMetricAttributionMetrics' {nextToken} -> nextToken) (\s@ListMetricAttributionMetrics' {} a -> s {nextToken = a} :: ListMetricAttributionMetrics)
+
+instance Core.AWSPager ListMetricAttributionMetrics where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listMetricAttributionMetricsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listMetricAttributionMetricsResponse_metrics
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listMetricAttributionMetrics_nextToken
+          Lens..~ rs
+          Lens.^? listMetricAttributionMetricsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListMetricAttributionMetrics where
+  type
+    AWSResponse ListMetricAttributionMetrics =
+      ListMetricAttributionMetricsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListMetricAttributionMetricsResponse'
+            Prelude.<$> (x Data..?> "metrics" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance
+  Prelude.Hashable
+    ListMetricAttributionMetrics
+  where
+  hashWithSalt _salt ListMetricAttributionMetrics' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` metricAttributionArn
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListMetricAttributionMetrics where
+  rnf ListMetricAttributionMetrics' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf metricAttributionArn
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListMetricAttributionMetrics where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListMetricAttributionMetrics" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListMetricAttributionMetrics where
+  toJSON ListMetricAttributionMetrics' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("metricAttributionArn" Data..=)
+              Prelude.<$> metricAttributionArn,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListMetricAttributionMetrics where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListMetricAttributionMetrics where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListMetricAttributionMetricsResponse' smart constructor.
+data ListMetricAttributionMetricsResponse = ListMetricAttributionMetricsResponse'
+  { -- | The metrics for the specified metric attribution.
+    metrics :: Prelude.Maybe [MetricAttribute],
+    -- | Specify the pagination token from a previous
+    -- @ListMetricAttributionMetricsResponse@ request to retrieve the next page
+    -- of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListMetricAttributionMetricsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metrics', 'listMetricAttributionMetricsResponse_metrics' - The metrics for the specified metric attribution.
+--
+-- 'nextToken', 'listMetricAttributionMetricsResponse_nextToken' - Specify the pagination token from a previous
+-- @ListMetricAttributionMetricsResponse@ request to retrieve the next page
+-- of results.
+--
+-- 'httpStatus', 'listMetricAttributionMetricsResponse_httpStatus' - The response's http status code.
+newListMetricAttributionMetricsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListMetricAttributionMetricsResponse
+newListMetricAttributionMetricsResponse pHttpStatus_ =
+  ListMetricAttributionMetricsResponse'
+    { metrics =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The metrics for the specified metric attribution.
+listMetricAttributionMetricsResponse_metrics :: Lens.Lens' ListMetricAttributionMetricsResponse (Prelude.Maybe [MetricAttribute])
+listMetricAttributionMetricsResponse_metrics = Lens.lens (\ListMetricAttributionMetricsResponse' {metrics} -> metrics) (\s@ListMetricAttributionMetricsResponse' {} a -> s {metrics = a} :: ListMetricAttributionMetricsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specify the pagination token from a previous
+-- @ListMetricAttributionMetricsResponse@ request to retrieve the next page
+-- of results.
+listMetricAttributionMetricsResponse_nextToken :: Lens.Lens' ListMetricAttributionMetricsResponse (Prelude.Maybe Prelude.Text)
+listMetricAttributionMetricsResponse_nextToken = Lens.lens (\ListMetricAttributionMetricsResponse' {nextToken} -> nextToken) (\s@ListMetricAttributionMetricsResponse' {} a -> s {nextToken = a} :: ListMetricAttributionMetricsResponse)
+
+-- | The response's http status code.
+listMetricAttributionMetricsResponse_httpStatus :: Lens.Lens' ListMetricAttributionMetricsResponse Prelude.Int
+listMetricAttributionMetricsResponse_httpStatus = Lens.lens (\ListMetricAttributionMetricsResponse' {httpStatus} -> httpStatus) (\s@ListMetricAttributionMetricsResponse' {} a -> s {httpStatus = a} :: ListMetricAttributionMetricsResponse)
+
+instance
+  Prelude.NFData
+    ListMetricAttributionMetricsResponse
+  where
+  rnf ListMetricAttributionMetricsResponse' {..} =
+    Prelude.rnf metrics
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListMetricAttributions.hs b/gen/Amazonka/Personalize/ListMetricAttributions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListMetricAttributions.hs
@@ -0,0 +1,250 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListMetricAttributions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Lists metric attributions.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListMetricAttributions
+  ( -- * Creating a Request
+    ListMetricAttributions (..),
+    newListMetricAttributions,
+
+    -- * Request Lenses
+    listMetricAttributions_datasetGroupArn,
+    listMetricAttributions_maxResults,
+    listMetricAttributions_nextToken,
+
+    -- * Destructuring the Response
+    ListMetricAttributionsResponse (..),
+    newListMetricAttributionsResponse,
+
+    -- * Response Lenses
+    listMetricAttributionsResponse_metricAttributions,
+    listMetricAttributionsResponse_nextToken,
+    listMetricAttributionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListMetricAttributions' smart constructor.
+data ListMetricAttributions = ListMetricAttributions'
+  { -- | The metric attributions\' dataset group Amazon Resource Name (ARN).
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of metric attributions to return in one page of
+    -- results.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | Specify the pagination token from a previous request to retrieve the
+    -- next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListMetricAttributions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetGroupArn', 'listMetricAttributions_datasetGroupArn' - The metric attributions\' dataset group Amazon Resource Name (ARN).
+--
+-- 'maxResults', 'listMetricAttributions_maxResults' - The maximum number of metric attributions to return in one page of
+-- results.
+--
+-- 'nextToken', 'listMetricAttributions_nextToken' - Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+newListMetricAttributions ::
+  ListMetricAttributions
+newListMetricAttributions =
+  ListMetricAttributions'
+    { datasetGroupArn =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The metric attributions\' dataset group Amazon Resource Name (ARN).
+listMetricAttributions_datasetGroupArn :: Lens.Lens' ListMetricAttributions (Prelude.Maybe Prelude.Text)
+listMetricAttributions_datasetGroupArn = Lens.lens (\ListMetricAttributions' {datasetGroupArn} -> datasetGroupArn) (\s@ListMetricAttributions' {} a -> s {datasetGroupArn = a} :: ListMetricAttributions)
+
+-- | The maximum number of metric attributions to return in one page of
+-- results.
+listMetricAttributions_maxResults :: Lens.Lens' ListMetricAttributions (Prelude.Maybe Prelude.Natural)
+listMetricAttributions_maxResults = Lens.lens (\ListMetricAttributions' {maxResults} -> maxResults) (\s@ListMetricAttributions' {} a -> s {maxResults = a} :: ListMetricAttributions)
+
+-- | Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+listMetricAttributions_nextToken :: Lens.Lens' ListMetricAttributions (Prelude.Maybe Prelude.Text)
+listMetricAttributions_nextToken = Lens.lens (\ListMetricAttributions' {nextToken} -> nextToken) (\s@ListMetricAttributions' {} a -> s {nextToken = a} :: ListMetricAttributions)
+
+instance Core.AWSPager ListMetricAttributions where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listMetricAttributionsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listMetricAttributionsResponse_metricAttributions
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listMetricAttributions_nextToken
+          Lens..~ rs
+          Lens.^? listMetricAttributionsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListMetricAttributions where
+  type
+    AWSResponse ListMetricAttributions =
+      ListMetricAttributionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListMetricAttributionsResponse'
+            Prelude.<$> ( x
+                            Data..?> "metricAttributions"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "nextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListMetricAttributions where
+  hashWithSalt _salt ListMetricAttributions' {..} =
+    _salt
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListMetricAttributions where
+  rnf ListMetricAttributions' {..} =
+    Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListMetricAttributions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListMetricAttributions" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListMetricAttributions where
+  toJSON ListMetricAttributions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("datasetGroupArn" Data..=)
+              Prelude.<$> datasetGroupArn,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListMetricAttributions where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListMetricAttributions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListMetricAttributionsResponse' smart constructor.
+data ListMetricAttributionsResponse = ListMetricAttributionsResponse'
+  { -- | The list of metric attributions.
+    metricAttributions :: Prelude.Maybe [MetricAttributionSummary],
+    -- | Specify the pagination token from a previous request to retrieve the
+    -- next page of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListMetricAttributionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metricAttributions', 'listMetricAttributionsResponse_metricAttributions' - The list of metric attributions.
+--
+-- 'nextToken', 'listMetricAttributionsResponse_nextToken' - Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+--
+-- 'httpStatus', 'listMetricAttributionsResponse_httpStatus' - The response's http status code.
+newListMetricAttributionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListMetricAttributionsResponse
+newListMetricAttributionsResponse pHttpStatus_ =
+  ListMetricAttributionsResponse'
+    { metricAttributions =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The list of metric attributions.
+listMetricAttributionsResponse_metricAttributions :: Lens.Lens' ListMetricAttributionsResponse (Prelude.Maybe [MetricAttributionSummary])
+listMetricAttributionsResponse_metricAttributions = Lens.lens (\ListMetricAttributionsResponse' {metricAttributions} -> metricAttributions) (\s@ListMetricAttributionsResponse' {} a -> s {metricAttributions = a} :: ListMetricAttributionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specify the pagination token from a previous request to retrieve the
+-- next page of results.
+listMetricAttributionsResponse_nextToken :: Lens.Lens' ListMetricAttributionsResponse (Prelude.Maybe Prelude.Text)
+listMetricAttributionsResponse_nextToken = Lens.lens (\ListMetricAttributionsResponse' {nextToken} -> nextToken) (\s@ListMetricAttributionsResponse' {} a -> s {nextToken = a} :: ListMetricAttributionsResponse)
+
+-- | The response's http status code.
+listMetricAttributionsResponse_httpStatus :: Lens.Lens' ListMetricAttributionsResponse Prelude.Int
+listMetricAttributionsResponse_httpStatus = Lens.lens (\ListMetricAttributionsResponse' {httpStatus} -> httpStatus) (\s@ListMetricAttributionsResponse' {} a -> s {httpStatus = a} :: ListMetricAttributionsResponse)
+
+instance
+  Prelude.NFData
+    ListMetricAttributionsResponse
+  where
+  rnf ListMetricAttributionsResponse' {..} =
+    Prelude.rnf metricAttributions
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListRecipes.hs b/gen/Amazonka/Personalize/ListRecipes.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListRecipes.hs
@@ -0,0 +1,255 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListRecipes
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of available recipes. The response provides the
+-- properties for each recipe, including the recipe\'s Amazon Resource Name
+-- (ARN).
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListRecipes
+  ( -- * Creating a Request
+    ListRecipes (..),
+    newListRecipes,
+
+    -- * Request Lenses
+    listRecipes_domain,
+    listRecipes_maxResults,
+    listRecipes_nextToken,
+    listRecipes_recipeProvider,
+
+    -- * Destructuring the Response
+    ListRecipesResponse (..),
+    newListRecipesResponse,
+
+    -- * Response Lenses
+    listRecipesResponse_nextToken,
+    listRecipesResponse_recipes,
+    listRecipesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListRecipes' smart constructor.
+data ListRecipes = ListRecipes'
+  { -- | Filters returned recipes by domain for a Domain dataset group. Only
+    -- recipes (Domain dataset group use cases) for this domain are included in
+    -- the response. If you don\'t specify a domain, all recipes are returned.
+    domain :: Prelude.Maybe Domain,
+    -- | The maximum number of recipes to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token returned from the previous call to @ListRecipes@ for getting the
+    -- next set of recipes (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The default is @SERVICE@.
+    recipeProvider :: Prelude.Maybe RecipeProvider
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRecipes' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'domain', 'listRecipes_domain' - Filters returned recipes by domain for a Domain dataset group. Only
+-- recipes (Domain dataset group use cases) for this domain are included in
+-- the response. If you don\'t specify a domain, all recipes are returned.
+--
+-- 'maxResults', 'listRecipes_maxResults' - The maximum number of recipes to return.
+--
+-- 'nextToken', 'listRecipes_nextToken' - A token returned from the previous call to @ListRecipes@ for getting the
+-- next set of recipes (if they exist).
+--
+-- 'recipeProvider', 'listRecipes_recipeProvider' - The default is @SERVICE@.
+newListRecipes ::
+  ListRecipes
+newListRecipes =
+  ListRecipes'
+    { domain = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      recipeProvider = Prelude.Nothing
+    }
+
+-- | Filters returned recipes by domain for a Domain dataset group. Only
+-- recipes (Domain dataset group use cases) for this domain are included in
+-- the response. If you don\'t specify a domain, all recipes are returned.
+listRecipes_domain :: Lens.Lens' ListRecipes (Prelude.Maybe Domain)
+listRecipes_domain = Lens.lens (\ListRecipes' {domain} -> domain) (\s@ListRecipes' {} a -> s {domain = a} :: ListRecipes)
+
+-- | The maximum number of recipes to return.
+listRecipes_maxResults :: Lens.Lens' ListRecipes (Prelude.Maybe Prelude.Natural)
+listRecipes_maxResults = Lens.lens (\ListRecipes' {maxResults} -> maxResults) (\s@ListRecipes' {} a -> s {maxResults = a} :: ListRecipes)
+
+-- | A token returned from the previous call to @ListRecipes@ for getting the
+-- next set of recipes (if they exist).
+listRecipes_nextToken :: Lens.Lens' ListRecipes (Prelude.Maybe Prelude.Text)
+listRecipes_nextToken = Lens.lens (\ListRecipes' {nextToken} -> nextToken) (\s@ListRecipes' {} a -> s {nextToken = a} :: ListRecipes)
+
+-- | The default is @SERVICE@.
+listRecipes_recipeProvider :: Lens.Lens' ListRecipes (Prelude.Maybe RecipeProvider)
+listRecipes_recipeProvider = Lens.lens (\ListRecipes' {recipeProvider} -> recipeProvider) (\s@ListRecipes' {} a -> s {recipeProvider = a} :: ListRecipes)
+
+instance Core.AWSPager ListRecipes where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listRecipesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listRecipesResponse_recipes
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listRecipes_nextToken
+          Lens..~ rs
+          Lens.^? listRecipesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListRecipes where
+  type AWSResponse ListRecipes = ListRecipesResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListRecipesResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "recipes" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListRecipes where
+  hashWithSalt _salt ListRecipes' {..} =
+    _salt
+      `Prelude.hashWithSalt` domain
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` recipeProvider
+
+instance Prelude.NFData ListRecipes where
+  rnf ListRecipes' {..} =
+    Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf recipeProvider
+
+instance Data.ToHeaders ListRecipes where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListRecipes" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListRecipes where
+  toJSON ListRecipes' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("domain" Data..=) Prelude.<$> domain,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("recipeProvider" Data..=)
+              Prelude.<$> recipeProvider
+          ]
+      )
+
+instance Data.ToPath ListRecipes where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListRecipes where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListRecipesResponse' smart constructor.
+data ListRecipesResponse = ListRecipesResponse'
+  { -- | A token for getting the next set of recipes.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The list of available recipes.
+    recipes :: Prelude.Maybe [RecipeSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRecipesResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listRecipesResponse_nextToken' - A token for getting the next set of recipes.
+--
+-- 'recipes', 'listRecipesResponse_recipes' - The list of available recipes.
+--
+-- 'httpStatus', 'listRecipesResponse_httpStatus' - The response's http status code.
+newListRecipesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListRecipesResponse
+newListRecipesResponse pHttpStatus_ =
+  ListRecipesResponse'
+    { nextToken = Prelude.Nothing,
+      recipes = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A token for getting the next set of recipes.
+listRecipesResponse_nextToken :: Lens.Lens' ListRecipesResponse (Prelude.Maybe Prelude.Text)
+listRecipesResponse_nextToken = Lens.lens (\ListRecipesResponse' {nextToken} -> nextToken) (\s@ListRecipesResponse' {} a -> s {nextToken = a} :: ListRecipesResponse)
+
+-- | The list of available recipes.
+listRecipesResponse_recipes :: Lens.Lens' ListRecipesResponse (Prelude.Maybe [RecipeSummary])
+listRecipesResponse_recipes = Lens.lens (\ListRecipesResponse' {recipes} -> recipes) (\s@ListRecipesResponse' {} a -> s {recipes = a} :: ListRecipesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listRecipesResponse_httpStatus :: Lens.Lens' ListRecipesResponse Prelude.Int
+listRecipesResponse_httpStatus = Lens.lens (\ListRecipesResponse' {httpStatus} -> httpStatus) (\s@ListRecipesResponse' {} a -> s {httpStatus = a} :: ListRecipesResponse)
+
+instance Prelude.NFData ListRecipesResponse where
+  rnf ListRecipesResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf recipes
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListRecommenders.hs b/gen/Amazonka/Personalize/ListRecommenders.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListRecommenders.hs
@@ -0,0 +1,249 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListRecommenders
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of recommenders in a given Domain dataset group. When a
+-- Domain dataset group is not specified, all the recommenders associated
+-- with the account are listed. The response provides the properties for
+-- each recommender, including the Amazon Resource Name (ARN). For more
+-- information on recommenders, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateRecommender.html CreateRecommender>.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListRecommenders
+  ( -- * Creating a Request
+    ListRecommenders (..),
+    newListRecommenders,
+
+    -- * Request Lenses
+    listRecommenders_datasetGroupArn,
+    listRecommenders_maxResults,
+    listRecommenders_nextToken,
+
+    -- * Destructuring the Response
+    ListRecommendersResponse (..),
+    newListRecommendersResponse,
+
+    -- * Response Lenses
+    listRecommendersResponse_nextToken,
+    listRecommendersResponse_recommenders,
+    listRecommendersResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListRecommenders' smart constructor.
+data ListRecommenders = ListRecommenders'
+  { -- | The Amazon Resource Name (ARN) of the Domain dataset group to list the
+    -- recommenders for. When a Domain dataset group is not specified, all the
+    -- recommenders associated with the account are listed.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of recommenders to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token returned from the previous call to @ListRecommenders@ for
+    -- getting the next set of recommenders (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRecommenders' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetGroupArn', 'listRecommenders_datasetGroupArn' - The Amazon Resource Name (ARN) of the Domain dataset group to list the
+-- recommenders for. When a Domain dataset group is not specified, all the
+-- recommenders associated with the account are listed.
+--
+-- 'maxResults', 'listRecommenders_maxResults' - The maximum number of recommenders to return.
+--
+-- 'nextToken', 'listRecommenders_nextToken' - A token returned from the previous call to @ListRecommenders@ for
+-- getting the next set of recommenders (if they exist).
+newListRecommenders ::
+  ListRecommenders
+newListRecommenders =
+  ListRecommenders'
+    { datasetGroupArn =
+        Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the Domain dataset group to list the
+-- recommenders for. When a Domain dataset group is not specified, all the
+-- recommenders associated with the account are listed.
+listRecommenders_datasetGroupArn :: Lens.Lens' ListRecommenders (Prelude.Maybe Prelude.Text)
+listRecommenders_datasetGroupArn = Lens.lens (\ListRecommenders' {datasetGroupArn} -> datasetGroupArn) (\s@ListRecommenders' {} a -> s {datasetGroupArn = a} :: ListRecommenders)
+
+-- | The maximum number of recommenders to return.
+listRecommenders_maxResults :: Lens.Lens' ListRecommenders (Prelude.Maybe Prelude.Natural)
+listRecommenders_maxResults = Lens.lens (\ListRecommenders' {maxResults} -> maxResults) (\s@ListRecommenders' {} a -> s {maxResults = a} :: ListRecommenders)
+
+-- | A token returned from the previous call to @ListRecommenders@ for
+-- getting the next set of recommenders (if they exist).
+listRecommenders_nextToken :: Lens.Lens' ListRecommenders (Prelude.Maybe Prelude.Text)
+listRecommenders_nextToken = Lens.lens (\ListRecommenders' {nextToken} -> nextToken) (\s@ListRecommenders' {} a -> s {nextToken = a} :: ListRecommenders)
+
+instance Core.AWSPager ListRecommenders where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listRecommendersResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listRecommendersResponse_recommenders
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listRecommenders_nextToken
+          Lens..~ rs
+          Lens.^? listRecommendersResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListRecommenders where
+  type
+    AWSResponse ListRecommenders =
+      ListRecommendersResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListRecommendersResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "recommenders" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListRecommenders where
+  hashWithSalt _salt ListRecommenders' {..} =
+    _salt
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListRecommenders where
+  rnf ListRecommenders' {..} =
+    Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListRecommenders where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListRecommenders" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListRecommenders where
+  toJSON ListRecommenders' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("datasetGroupArn" Data..=)
+              Prelude.<$> datasetGroupArn,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListRecommenders where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListRecommenders where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListRecommendersResponse' smart constructor.
+data ListRecommendersResponse = ListRecommendersResponse'
+  { -- | A token for getting the next set of recommenders (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of the recommenders.
+    recommenders :: Prelude.Maybe [RecommenderSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListRecommendersResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listRecommendersResponse_nextToken' - A token for getting the next set of recommenders (if they exist).
+--
+-- 'recommenders', 'listRecommendersResponse_recommenders' - A list of the recommenders.
+--
+-- 'httpStatus', 'listRecommendersResponse_httpStatus' - The response's http status code.
+newListRecommendersResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListRecommendersResponse
+newListRecommendersResponse pHttpStatus_ =
+  ListRecommendersResponse'
+    { nextToken =
+        Prelude.Nothing,
+      recommenders = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A token for getting the next set of recommenders (if they exist).
+listRecommendersResponse_nextToken :: Lens.Lens' ListRecommendersResponse (Prelude.Maybe Prelude.Text)
+listRecommendersResponse_nextToken = Lens.lens (\ListRecommendersResponse' {nextToken} -> nextToken) (\s@ListRecommendersResponse' {} a -> s {nextToken = a} :: ListRecommendersResponse)
+
+-- | A list of the recommenders.
+listRecommendersResponse_recommenders :: Lens.Lens' ListRecommendersResponse (Prelude.Maybe [RecommenderSummary])
+listRecommendersResponse_recommenders = Lens.lens (\ListRecommendersResponse' {recommenders} -> recommenders) (\s@ListRecommendersResponse' {} a -> s {recommenders = a} :: ListRecommendersResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listRecommendersResponse_httpStatus :: Lens.Lens' ListRecommendersResponse Prelude.Int
+listRecommendersResponse_httpStatus = Lens.lens (\ListRecommendersResponse' {httpStatus} -> httpStatus) (\s@ListRecommendersResponse' {} a -> s {httpStatus = a} :: ListRecommendersResponse)
+
+instance Prelude.NFData ListRecommendersResponse where
+  rnf ListRecommendersResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf recommenders
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListSchemas.hs b/gen/Amazonka/Personalize/ListSchemas.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListSchemas.hs
@@ -0,0 +1,223 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListSchemas
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns the list of schemas associated with the account. The response
+-- provides the properties for each schema, including the Amazon Resource
+-- Name (ARN). For more information on schemas, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSchema.html CreateSchema>.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListSchemas
+  ( -- * Creating a Request
+    ListSchemas (..),
+    newListSchemas,
+
+    -- * Request Lenses
+    listSchemas_maxResults,
+    listSchemas_nextToken,
+
+    -- * Destructuring the Response
+    ListSchemasResponse (..),
+    newListSchemasResponse,
+
+    -- * Response Lenses
+    listSchemasResponse_nextToken,
+    listSchemasResponse_schemas,
+    listSchemasResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListSchemas' smart constructor.
+data ListSchemas = ListSchemas'
+  { -- | The maximum number of schemas to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token returned from the previous call to @ListSchemas@ for getting the
+    -- next set of schemas (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSchemas' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listSchemas_maxResults' - The maximum number of schemas to return.
+--
+-- 'nextToken', 'listSchemas_nextToken' - A token returned from the previous call to @ListSchemas@ for getting the
+-- next set of schemas (if they exist).
+newListSchemas ::
+  ListSchemas
+newListSchemas =
+  ListSchemas'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of schemas to return.
+listSchemas_maxResults :: Lens.Lens' ListSchemas (Prelude.Maybe Prelude.Natural)
+listSchemas_maxResults = Lens.lens (\ListSchemas' {maxResults} -> maxResults) (\s@ListSchemas' {} a -> s {maxResults = a} :: ListSchemas)
+
+-- | A token returned from the previous call to @ListSchemas@ for getting the
+-- next set of schemas (if they exist).
+listSchemas_nextToken :: Lens.Lens' ListSchemas (Prelude.Maybe Prelude.Text)
+listSchemas_nextToken = Lens.lens (\ListSchemas' {nextToken} -> nextToken) (\s@ListSchemas' {} a -> s {nextToken = a} :: ListSchemas)
+
+instance Core.AWSPager ListSchemas where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listSchemasResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listSchemasResponse_schemas
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listSchemas_nextToken
+          Lens..~ rs
+          Lens.^? listSchemasResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListSchemas where
+  type AWSResponse ListSchemas = ListSchemasResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListSchemasResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "schemas" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListSchemas where
+  hashWithSalt _salt ListSchemas' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListSchemas where
+  rnf ListSchemas' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListSchemas where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListSchemas" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListSchemas where
+  toJSON ListSchemas' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListSchemas where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListSchemas where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListSchemasResponse' smart constructor.
+data ListSchemasResponse = ListSchemasResponse'
+  { -- | A token used to get the next set of schemas (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of schemas.
+    schemas :: Prelude.Maybe [DatasetSchemaSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSchemasResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listSchemasResponse_nextToken' - A token used to get the next set of schemas (if they exist).
+--
+-- 'schemas', 'listSchemasResponse_schemas' - A list of schemas.
+--
+-- 'httpStatus', 'listSchemasResponse_httpStatus' - The response's http status code.
+newListSchemasResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListSchemasResponse
+newListSchemasResponse pHttpStatus_ =
+  ListSchemasResponse'
+    { nextToken = Prelude.Nothing,
+      schemas = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A token used to get the next set of schemas (if they exist).
+listSchemasResponse_nextToken :: Lens.Lens' ListSchemasResponse (Prelude.Maybe Prelude.Text)
+listSchemasResponse_nextToken = Lens.lens (\ListSchemasResponse' {nextToken} -> nextToken) (\s@ListSchemasResponse' {} a -> s {nextToken = a} :: ListSchemasResponse)
+
+-- | A list of schemas.
+listSchemasResponse_schemas :: Lens.Lens' ListSchemasResponse (Prelude.Maybe [DatasetSchemaSummary])
+listSchemasResponse_schemas = Lens.lens (\ListSchemasResponse' {schemas} -> schemas) (\s@ListSchemasResponse' {} a -> s {schemas = a} :: ListSchemasResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listSchemasResponse_httpStatus :: Lens.Lens' ListSchemasResponse Prelude.Int
+listSchemasResponse_httpStatus = Lens.lens (\ListSchemasResponse' {httpStatus} -> httpStatus) (\s@ListSchemasResponse' {} a -> s {httpStatus = a} :: ListSchemasResponse)
+
+instance Prelude.NFData ListSchemasResponse where
+  rnf ListSchemasResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf schemas
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListSolutionVersions.hs b/gen/Amazonka/Personalize/ListSolutionVersions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListSolutionVersions.hs
@@ -0,0 +1,242 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListSolutionVersions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of solution versions for the given solution. When a
+-- solution is not specified, all the solution versions associated with the
+-- account are listed. The response provides the properties for each
+-- solution version, including the Amazon Resource Name (ARN).
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListSolutionVersions
+  ( -- * Creating a Request
+    ListSolutionVersions (..),
+    newListSolutionVersions,
+
+    -- * Request Lenses
+    listSolutionVersions_maxResults,
+    listSolutionVersions_nextToken,
+    listSolutionVersions_solutionArn,
+
+    -- * Destructuring the Response
+    ListSolutionVersionsResponse (..),
+    newListSolutionVersionsResponse,
+
+    -- * Response Lenses
+    listSolutionVersionsResponse_nextToken,
+    listSolutionVersionsResponse_solutionVersions,
+    listSolutionVersionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListSolutionVersions' smart constructor.
+data ListSolutionVersions = ListSolutionVersions'
+  { -- | The maximum number of solution versions to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token returned from the previous call to @ListSolutionVersions@ for
+    -- getting the next set of solution versions (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the solution.
+    solutionArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSolutionVersions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxResults', 'listSolutionVersions_maxResults' - The maximum number of solution versions to return.
+--
+-- 'nextToken', 'listSolutionVersions_nextToken' - A token returned from the previous call to @ListSolutionVersions@ for
+-- getting the next set of solution versions (if they exist).
+--
+-- 'solutionArn', 'listSolutionVersions_solutionArn' - The Amazon Resource Name (ARN) of the solution.
+newListSolutionVersions ::
+  ListSolutionVersions
+newListSolutionVersions =
+  ListSolutionVersions'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      solutionArn = Prelude.Nothing
+    }
+
+-- | The maximum number of solution versions to return.
+listSolutionVersions_maxResults :: Lens.Lens' ListSolutionVersions (Prelude.Maybe Prelude.Natural)
+listSolutionVersions_maxResults = Lens.lens (\ListSolutionVersions' {maxResults} -> maxResults) (\s@ListSolutionVersions' {} a -> s {maxResults = a} :: ListSolutionVersions)
+
+-- | A token returned from the previous call to @ListSolutionVersions@ for
+-- getting the next set of solution versions (if they exist).
+listSolutionVersions_nextToken :: Lens.Lens' ListSolutionVersions (Prelude.Maybe Prelude.Text)
+listSolutionVersions_nextToken = Lens.lens (\ListSolutionVersions' {nextToken} -> nextToken) (\s@ListSolutionVersions' {} a -> s {nextToken = a} :: ListSolutionVersions)
+
+-- | The Amazon Resource Name (ARN) of the solution.
+listSolutionVersions_solutionArn :: Lens.Lens' ListSolutionVersions (Prelude.Maybe Prelude.Text)
+listSolutionVersions_solutionArn = Lens.lens (\ListSolutionVersions' {solutionArn} -> solutionArn) (\s@ListSolutionVersions' {} a -> s {solutionArn = a} :: ListSolutionVersions)
+
+instance Core.AWSPager ListSolutionVersions where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listSolutionVersionsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listSolutionVersionsResponse_solutionVersions
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listSolutionVersions_nextToken
+          Lens..~ rs
+          Lens.^? listSolutionVersionsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListSolutionVersions where
+  type
+    AWSResponse ListSolutionVersions =
+      ListSolutionVersionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListSolutionVersionsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> ( x
+                            Data..?> "solutionVersions"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListSolutionVersions where
+  hashWithSalt _salt ListSolutionVersions' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` solutionArn
+
+instance Prelude.NFData ListSolutionVersions where
+  rnf ListSolutionVersions' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf solutionArn
+
+instance Data.ToHeaders ListSolutionVersions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListSolutionVersions" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListSolutionVersions where
+  toJSON ListSolutionVersions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken,
+            ("solutionArn" Data..=) Prelude.<$> solutionArn
+          ]
+      )
+
+instance Data.ToPath ListSolutionVersions where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListSolutionVersions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListSolutionVersionsResponse' smart constructor.
+data ListSolutionVersionsResponse = ListSolutionVersionsResponse'
+  { -- | A token for getting the next set of solution versions (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of solution versions describing the version properties.
+    solutionVersions :: Prelude.Maybe [SolutionVersionSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSolutionVersionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listSolutionVersionsResponse_nextToken' - A token for getting the next set of solution versions (if they exist).
+--
+-- 'solutionVersions', 'listSolutionVersionsResponse_solutionVersions' - A list of solution versions describing the version properties.
+--
+-- 'httpStatus', 'listSolutionVersionsResponse_httpStatus' - The response's http status code.
+newListSolutionVersionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListSolutionVersionsResponse
+newListSolutionVersionsResponse pHttpStatus_ =
+  ListSolutionVersionsResponse'
+    { nextToken =
+        Prelude.Nothing,
+      solutionVersions = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A token for getting the next set of solution versions (if they exist).
+listSolutionVersionsResponse_nextToken :: Lens.Lens' ListSolutionVersionsResponse (Prelude.Maybe Prelude.Text)
+listSolutionVersionsResponse_nextToken = Lens.lens (\ListSolutionVersionsResponse' {nextToken} -> nextToken) (\s@ListSolutionVersionsResponse' {} a -> s {nextToken = a} :: ListSolutionVersionsResponse)
+
+-- | A list of solution versions describing the version properties.
+listSolutionVersionsResponse_solutionVersions :: Lens.Lens' ListSolutionVersionsResponse (Prelude.Maybe [SolutionVersionSummary])
+listSolutionVersionsResponse_solutionVersions = Lens.lens (\ListSolutionVersionsResponse' {solutionVersions} -> solutionVersions) (\s@ListSolutionVersionsResponse' {} a -> s {solutionVersions = a} :: ListSolutionVersionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listSolutionVersionsResponse_httpStatus :: Lens.Lens' ListSolutionVersionsResponse Prelude.Int
+listSolutionVersionsResponse_httpStatus = Lens.lens (\ListSolutionVersionsResponse' {httpStatus} -> httpStatus) (\s@ListSolutionVersionsResponse' {} a -> s {httpStatus = a} :: ListSolutionVersionsResponse)
+
+instance Prelude.NFData ListSolutionVersionsResponse where
+  rnf ListSolutionVersionsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf solutionVersions
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListSolutions.hs b/gen/Amazonka/Personalize/ListSolutions.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListSolutions.hs
@@ -0,0 +1,241 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListSolutions
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Returns a list of solutions that use the given dataset group. When a
+-- dataset group is not specified, all the solutions associated with the
+-- account are listed. The response provides the properties for each
+-- solution, including the Amazon Resource Name (ARN). For more information
+-- on solutions, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolution.html CreateSolution>.
+--
+-- This operation returns paginated results.
+module Amazonka.Personalize.ListSolutions
+  ( -- * Creating a Request
+    ListSolutions (..),
+    newListSolutions,
+
+    -- * Request Lenses
+    listSolutions_datasetGroupArn,
+    listSolutions_maxResults,
+    listSolutions_nextToken,
+
+    -- * Destructuring the Response
+    ListSolutionsResponse (..),
+    newListSolutionsResponse,
+
+    -- * Response Lenses
+    listSolutionsResponse_nextToken,
+    listSolutionsResponse_solutions,
+    listSolutionsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListSolutions' smart constructor.
+data ListSolutions = ListSolutions'
+  { -- | The Amazon Resource Name (ARN) of the dataset group.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of solutions to return.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | A token returned from the previous call to @ListSolutions@ for getting
+    -- the next set of solutions (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSolutions' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'datasetGroupArn', 'listSolutions_datasetGroupArn' - The Amazon Resource Name (ARN) of the dataset group.
+--
+-- 'maxResults', 'listSolutions_maxResults' - The maximum number of solutions to return.
+--
+-- 'nextToken', 'listSolutions_nextToken' - A token returned from the previous call to @ListSolutions@ for getting
+-- the next set of solutions (if they exist).
+newListSolutions ::
+  ListSolutions
+newListSolutions =
+  ListSolutions'
+    { datasetGroupArn = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the dataset group.
+listSolutions_datasetGroupArn :: Lens.Lens' ListSolutions (Prelude.Maybe Prelude.Text)
+listSolutions_datasetGroupArn = Lens.lens (\ListSolutions' {datasetGroupArn} -> datasetGroupArn) (\s@ListSolutions' {} a -> s {datasetGroupArn = a} :: ListSolutions)
+
+-- | The maximum number of solutions to return.
+listSolutions_maxResults :: Lens.Lens' ListSolutions (Prelude.Maybe Prelude.Natural)
+listSolutions_maxResults = Lens.lens (\ListSolutions' {maxResults} -> maxResults) (\s@ListSolutions' {} a -> s {maxResults = a} :: ListSolutions)
+
+-- | A token returned from the previous call to @ListSolutions@ for getting
+-- the next set of solutions (if they exist).
+listSolutions_nextToken :: Lens.Lens' ListSolutions (Prelude.Maybe Prelude.Text)
+listSolutions_nextToken = Lens.lens (\ListSolutions' {nextToken} -> nextToken) (\s@ListSolutions' {} a -> s {nextToken = a} :: ListSolutions)
+
+instance Core.AWSPager ListSolutions where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listSolutionsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listSolutionsResponse_solutions
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listSolutions_nextToken
+          Lens..~ rs
+          Lens.^? listSolutionsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListSolutions where
+  type
+    AWSResponse ListSolutions =
+      ListSolutionsResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListSolutionsResponse'
+            Prelude.<$> (x Data..?> "nextToken")
+            Prelude.<*> (x Data..?> "solutions" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListSolutions where
+  hashWithSalt _salt ListSolutions' {..} =
+    _salt
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListSolutions where
+  rnf ListSolutions' {..} =
+    Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListSolutions where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListSolutions" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListSolutions where
+  toJSON ListSolutions' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("datasetGroupArn" Data..=)
+              Prelude.<$> datasetGroupArn,
+            ("maxResults" Data..=) Prelude.<$> maxResults,
+            ("nextToken" Data..=) Prelude.<$> nextToken
+          ]
+      )
+
+instance Data.ToPath ListSolutions where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListSolutions where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListSolutionsResponse' smart constructor.
+data ListSolutionsResponse = ListSolutionsResponse'
+  { -- | A token for getting the next set of solutions (if they exist).
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of the current solutions.
+    solutions :: Prelude.Maybe [SolutionSummary],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListSolutionsResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'nextToken', 'listSolutionsResponse_nextToken' - A token for getting the next set of solutions (if they exist).
+--
+-- 'solutions', 'listSolutionsResponse_solutions' - A list of the current solutions.
+--
+-- 'httpStatus', 'listSolutionsResponse_httpStatus' - The response's http status code.
+newListSolutionsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListSolutionsResponse
+newListSolutionsResponse pHttpStatus_ =
+  ListSolutionsResponse'
+    { nextToken = Prelude.Nothing,
+      solutions = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A token for getting the next set of solutions (if they exist).
+listSolutionsResponse_nextToken :: Lens.Lens' ListSolutionsResponse (Prelude.Maybe Prelude.Text)
+listSolutionsResponse_nextToken = Lens.lens (\ListSolutionsResponse' {nextToken} -> nextToken) (\s@ListSolutionsResponse' {} a -> s {nextToken = a} :: ListSolutionsResponse)
+
+-- | A list of the current solutions.
+listSolutionsResponse_solutions :: Lens.Lens' ListSolutionsResponse (Prelude.Maybe [SolutionSummary])
+listSolutionsResponse_solutions = Lens.lens (\ListSolutionsResponse' {solutions} -> solutions) (\s@ListSolutionsResponse' {} a -> s {solutions = a} :: ListSolutionsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listSolutionsResponse_httpStatus :: Lens.Lens' ListSolutionsResponse Prelude.Int
+listSolutionsResponse_httpStatus = Lens.lens (\ListSolutionsResponse' {httpStatus} -> httpStatus) (\s@ListSolutionsResponse' {} a -> s {httpStatus = a} :: ListSolutionsResponse)
+
+instance Prelude.NFData ListSolutionsResponse where
+  rnf ListSolutionsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf solutions
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/ListTagsForResource.hs b/gen/Amazonka/Personalize/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/ListTagsForResource.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.ListTagsForResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Get a list of
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- attached to a resource.
+module Amazonka.Personalize.ListTagsForResource
+  ( -- * Creating a Request
+    ListTagsForResource (..),
+    newListTagsForResource,
+
+    -- * Request Lenses
+    listTagsForResource_resourceArn,
+
+    -- * Destructuring the Response
+    ListTagsForResourceResponse (..),
+    newListTagsForResourceResponse,
+
+    -- * Response Lenses
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListTagsForResource' smart constructor.
+data ListTagsForResource = ListTagsForResource'
+  { -- | The resource\'s Amazon Resource Name.
+    resourceArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'listTagsForResource_resourceArn' - The resource\'s Amazon Resource Name.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The resource\'s Amazon Resource Name.
+listTagsForResource_resourceArn :: Lens.Lens' ListTagsForResource Prelude.Text
+listTagsForResource_resourceArn = Lens.lens (\ListTagsForResource' {resourceArn} -> resourceArn) (\s@ListTagsForResource' {} a -> s {resourceArn = a} :: ListTagsForResource)
+
+instance Core.AWSRequest ListTagsForResource where
+  type
+    AWSResponse ListTagsForResource =
+      ListTagsForResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListTagsForResourceResponse'
+            Prelude.<$> (x Data..?> "tags" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListTagsForResource where
+  hashWithSalt _salt ListTagsForResource' {..} =
+    _salt `Prelude.hashWithSalt` resourceArn
+
+instance Prelude.NFData ListTagsForResource where
+  rnf ListTagsForResource' {..} =
+    Prelude.rnf resourceArn
+
+instance Data.ToHeaders ListTagsForResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.ListTagsForResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON ListTagsForResource where
+  toJSON ListTagsForResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("resourceArn" Data..= resourceArn)]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | The resource\'s tags.
+    tags :: Prelude.Maybe [Tag],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListTagsForResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tags', 'listTagsForResourceResponse_tags' - The resource\'s tags.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The resource\'s tags.
+listTagsForResourceResponse_tags :: Lens.Lens' ListTagsForResourceResponse (Prelude.Maybe [Tag])
+listTagsForResourceResponse_tags = Lens.lens (\ListTagsForResourceResponse' {tags} -> tags) (\s@ListTagsForResourceResponse' {} a -> s {tags = a} :: ListTagsForResourceResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listTagsForResourceResponse_httpStatus :: Lens.Lens' ListTagsForResourceResponse Prelude.Int
+listTagsForResourceResponse_httpStatus = Lens.lens (\ListTagsForResourceResponse' {httpStatus} -> httpStatus) (\s@ListTagsForResourceResponse' {} a -> s {httpStatus = a} :: ListTagsForResourceResponse)
+
+instance Prelude.NFData ListTagsForResourceResponse where
+  rnf ListTagsForResourceResponse' {..} =
+    Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/StartRecommender.hs b/gen/Amazonka/Personalize/StartRecommender.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/StartRecommender.hs
@@ -0,0 +1,176 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.StartRecommender
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Starts a recommender that is INACTIVE. Starting a recommender does not
+-- create any new models, but resumes billing and automatic retraining for
+-- the recommender.
+module Amazonka.Personalize.StartRecommender
+  ( -- * Creating a Request
+    StartRecommender (..),
+    newStartRecommender,
+
+    -- * Request Lenses
+    startRecommender_recommenderArn,
+
+    -- * Destructuring the Response
+    StartRecommenderResponse (..),
+    newStartRecommenderResponse,
+
+    -- * Response Lenses
+    startRecommenderResponse_recommenderArn,
+    startRecommenderResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStartRecommender' smart constructor.
+data StartRecommender = StartRecommender'
+  { -- | The Amazon Resource Name (ARN) of the recommender to start.
+    recommenderArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartRecommender' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recommenderArn', 'startRecommender_recommenderArn' - The Amazon Resource Name (ARN) of the recommender to start.
+newStartRecommender ::
+  -- | 'recommenderArn'
+  Prelude.Text ->
+  StartRecommender
+newStartRecommender pRecommenderArn_ =
+  StartRecommender'
+    { recommenderArn =
+        pRecommenderArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the recommender to start.
+startRecommender_recommenderArn :: Lens.Lens' StartRecommender Prelude.Text
+startRecommender_recommenderArn = Lens.lens (\StartRecommender' {recommenderArn} -> recommenderArn) (\s@StartRecommender' {} a -> s {recommenderArn = a} :: StartRecommender)
+
+instance Core.AWSRequest StartRecommender where
+  type
+    AWSResponse StartRecommender =
+      StartRecommenderResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartRecommenderResponse'
+            Prelude.<$> (x Data..?> "recommenderArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartRecommender where
+  hashWithSalt _salt StartRecommender' {..} =
+    _salt `Prelude.hashWithSalt` recommenderArn
+
+instance Prelude.NFData StartRecommender where
+  rnf StartRecommender' {..} =
+    Prelude.rnf recommenderArn
+
+instance Data.ToHeaders StartRecommender where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.StartRecommender" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StartRecommender where
+  toJSON StartRecommender' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("recommenderArn" Data..= recommenderArn)
+          ]
+      )
+
+instance Data.ToPath StartRecommender where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StartRecommender where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartRecommenderResponse' smart constructor.
+data StartRecommenderResponse = StartRecommenderResponse'
+  { -- | The Amazon Resource Name (ARN) of the recommender you started.
+    recommenderArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartRecommenderResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recommenderArn', 'startRecommenderResponse_recommenderArn' - The Amazon Resource Name (ARN) of the recommender you started.
+--
+-- 'httpStatus', 'startRecommenderResponse_httpStatus' - The response's http status code.
+newStartRecommenderResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartRecommenderResponse
+newStartRecommenderResponse pHttpStatus_ =
+  StartRecommenderResponse'
+    { recommenderArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the recommender you started.
+startRecommenderResponse_recommenderArn :: Lens.Lens' StartRecommenderResponse (Prelude.Maybe Prelude.Text)
+startRecommenderResponse_recommenderArn = Lens.lens (\StartRecommenderResponse' {recommenderArn} -> recommenderArn) (\s@StartRecommenderResponse' {} a -> s {recommenderArn = a} :: StartRecommenderResponse)
+
+-- | The response's http status code.
+startRecommenderResponse_httpStatus :: Lens.Lens' StartRecommenderResponse Prelude.Int
+startRecommenderResponse_httpStatus = Lens.lens (\StartRecommenderResponse' {httpStatus} -> httpStatus) (\s@StartRecommenderResponse' {} a -> s {httpStatus = a} :: StartRecommenderResponse)
+
+instance Prelude.NFData StartRecommenderResponse where
+  rnf StartRecommenderResponse' {..} =
+    Prelude.rnf recommenderArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/StopRecommender.hs b/gen/Amazonka/Personalize/StopRecommender.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/StopRecommender.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.StopRecommender
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Stops a recommender that is ACTIVE. Stopping a recommender halts billing
+-- and automatic retraining for the recommender.
+module Amazonka.Personalize.StopRecommender
+  ( -- * Creating a Request
+    StopRecommender (..),
+    newStopRecommender,
+
+    -- * Request Lenses
+    stopRecommender_recommenderArn,
+
+    -- * Destructuring the Response
+    StopRecommenderResponse (..),
+    newStopRecommenderResponse,
+
+    -- * Response Lenses
+    stopRecommenderResponse_recommenderArn,
+    stopRecommenderResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStopRecommender' smart constructor.
+data StopRecommender = StopRecommender'
+  { -- | The Amazon Resource Name (ARN) of the recommender to stop.
+    recommenderArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StopRecommender' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recommenderArn', 'stopRecommender_recommenderArn' - The Amazon Resource Name (ARN) of the recommender to stop.
+newStopRecommender ::
+  -- | 'recommenderArn'
+  Prelude.Text ->
+  StopRecommender
+newStopRecommender pRecommenderArn_ =
+  StopRecommender' {recommenderArn = pRecommenderArn_}
+
+-- | The Amazon Resource Name (ARN) of the recommender to stop.
+stopRecommender_recommenderArn :: Lens.Lens' StopRecommender Prelude.Text
+stopRecommender_recommenderArn = Lens.lens (\StopRecommender' {recommenderArn} -> recommenderArn) (\s@StopRecommender' {} a -> s {recommenderArn = a} :: StopRecommender)
+
+instance Core.AWSRequest StopRecommender where
+  type
+    AWSResponse StopRecommender =
+      StopRecommenderResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StopRecommenderResponse'
+            Prelude.<$> (x Data..?> "recommenderArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StopRecommender where
+  hashWithSalt _salt StopRecommender' {..} =
+    _salt `Prelude.hashWithSalt` recommenderArn
+
+instance Prelude.NFData StopRecommender where
+  rnf StopRecommender' {..} = Prelude.rnf recommenderArn
+
+instance Data.ToHeaders StopRecommender where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.StopRecommender" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StopRecommender where
+  toJSON StopRecommender' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("recommenderArn" Data..= recommenderArn)
+          ]
+      )
+
+instance Data.ToPath StopRecommender where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StopRecommender where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStopRecommenderResponse' smart constructor.
+data StopRecommenderResponse = StopRecommenderResponse'
+  { -- | The Amazon Resource Name (ARN) of the recommender you stopped.
+    recommenderArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StopRecommenderResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recommenderArn', 'stopRecommenderResponse_recommenderArn' - The Amazon Resource Name (ARN) of the recommender you stopped.
+--
+-- 'httpStatus', 'stopRecommenderResponse_httpStatus' - The response's http status code.
+newStopRecommenderResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StopRecommenderResponse
+newStopRecommenderResponse pHttpStatus_ =
+  StopRecommenderResponse'
+    { recommenderArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the recommender you stopped.
+stopRecommenderResponse_recommenderArn :: Lens.Lens' StopRecommenderResponse (Prelude.Maybe Prelude.Text)
+stopRecommenderResponse_recommenderArn = Lens.lens (\StopRecommenderResponse' {recommenderArn} -> recommenderArn) (\s@StopRecommenderResponse' {} a -> s {recommenderArn = a} :: StopRecommenderResponse)
+
+-- | The response's http status code.
+stopRecommenderResponse_httpStatus :: Lens.Lens' StopRecommenderResponse Prelude.Int
+stopRecommenderResponse_httpStatus = Lens.lens (\StopRecommenderResponse' {httpStatus} -> httpStatus) (\s@StopRecommenderResponse' {} a -> s {httpStatus = a} :: StopRecommenderResponse)
+
+instance Prelude.NFData StopRecommenderResponse where
+  rnf StopRecommenderResponse' {..} =
+    Prelude.rnf recommenderArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/StopSolutionVersionCreation.hs b/gen/Amazonka/Personalize/StopSolutionVersionCreation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/StopSolutionVersionCreation.hs
@@ -0,0 +1,160 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.StopSolutionVersionCreation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Stops creating a solution version that is in a state of CREATE_PENDING
+-- or CREATE IN_PROGRESS.
+--
+-- Depending on the current state of the solution version, the solution
+-- version state changes as follows:
+--
+-- -   CREATE_PENDING > CREATE_STOPPED
+--
+--     or
+--
+-- -   CREATE_IN_PROGRESS > CREATE_STOPPING > CREATE_STOPPED
+--
+-- You are billed for all of the training completed up until you stop the
+-- solution version creation. You cannot resume creating a solution version
+-- once it has been stopped.
+module Amazonka.Personalize.StopSolutionVersionCreation
+  ( -- * Creating a Request
+    StopSolutionVersionCreation (..),
+    newStopSolutionVersionCreation,
+
+    -- * Request Lenses
+    stopSolutionVersionCreation_solutionVersionArn,
+
+    -- * Destructuring the Response
+    StopSolutionVersionCreationResponse (..),
+    newStopSolutionVersionCreationResponse,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStopSolutionVersionCreation' smart constructor.
+data StopSolutionVersionCreation = StopSolutionVersionCreation'
+  { -- | The Amazon Resource Name (ARN) of the solution version you want to stop
+    -- creating.
+    solutionVersionArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StopSolutionVersionCreation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'solutionVersionArn', 'stopSolutionVersionCreation_solutionVersionArn' - The Amazon Resource Name (ARN) of the solution version you want to stop
+-- creating.
+newStopSolutionVersionCreation ::
+  -- | 'solutionVersionArn'
+  Prelude.Text ->
+  StopSolutionVersionCreation
+newStopSolutionVersionCreation pSolutionVersionArn_ =
+  StopSolutionVersionCreation'
+    { solutionVersionArn =
+        pSolutionVersionArn_
+    }
+
+-- | The Amazon Resource Name (ARN) of the solution version you want to stop
+-- creating.
+stopSolutionVersionCreation_solutionVersionArn :: Lens.Lens' StopSolutionVersionCreation Prelude.Text
+stopSolutionVersionCreation_solutionVersionArn = Lens.lens (\StopSolutionVersionCreation' {solutionVersionArn} -> solutionVersionArn) (\s@StopSolutionVersionCreation' {} a -> s {solutionVersionArn = a} :: StopSolutionVersionCreation)
+
+instance Core.AWSRequest StopSolutionVersionCreation where
+  type
+    AWSResponse StopSolutionVersionCreation =
+      StopSolutionVersionCreationResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveNull
+      StopSolutionVersionCreationResponse'
+
+instance Prelude.Hashable StopSolutionVersionCreation where
+  hashWithSalt _salt StopSolutionVersionCreation' {..} =
+    _salt `Prelude.hashWithSalt` solutionVersionArn
+
+instance Prelude.NFData StopSolutionVersionCreation where
+  rnf StopSolutionVersionCreation' {..} =
+    Prelude.rnf solutionVersionArn
+
+instance Data.ToHeaders StopSolutionVersionCreation where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.StopSolutionVersionCreation" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON StopSolutionVersionCreation where
+  toJSON StopSolutionVersionCreation' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("solutionVersionArn" Data..= solutionVersionArn)
+          ]
+      )
+
+instance Data.ToPath StopSolutionVersionCreation where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery StopSolutionVersionCreation where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStopSolutionVersionCreationResponse' smart constructor.
+data StopSolutionVersionCreationResponse = StopSolutionVersionCreationResponse'
+  {
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StopSolutionVersionCreationResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+newStopSolutionVersionCreationResponse ::
+  StopSolutionVersionCreationResponse
+newStopSolutionVersionCreationResponse =
+  StopSolutionVersionCreationResponse'
+
+instance
+  Prelude.NFData
+    StopSolutionVersionCreationResponse
+  where
+  rnf _ = ()
diff --git a/gen/Amazonka/Personalize/TagResource.hs b/gen/Amazonka/Personalize/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/TagResource.hs
@@ -0,0 +1,171 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.TagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Add a list of tags to a resource.
+module Amazonka.Personalize.TagResource
+  ( -- * Creating a Request
+    TagResource (..),
+    newTagResource,
+
+    -- * Request Lenses
+    tagResource_resourceArn,
+    tagResource_tags,
+
+    -- * Destructuring the Response
+    TagResourceResponse (..),
+    newTagResourceResponse,
+
+    -- * Response Lenses
+    tagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newTagResource' smart constructor.
+data TagResource = TagResource'
+  { -- | The resource\'s Amazon Resource Name (ARN).
+    resourceArn :: Prelude.Text,
+    -- | Tags to apply to the resource. For more information see
+    -- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html Tagging Personalize resources>.
+    tags :: [Tag]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'tagResource_resourceArn' - The resource\'s Amazon Resource Name (ARN).
+--
+-- 'tags', 'tagResource_tags' - Tags to apply to the resource. For more information see
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html Tagging Personalize resources>.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The resource\'s Amazon Resource Name (ARN).
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | Tags to apply to the resource. For more information see
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html Tagging Personalize resources>.
+tagResource_tags :: Lens.Lens' TagResource [Tag]
+tagResource_tags = Lens.lens (\TagResource' {tags} -> tags) (\s@TagResource' {} a -> s {tags = a} :: TagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest TagResource where
+  type AWSResponse TagResource = TagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          TagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable TagResource where
+  hashWithSalt _salt TagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tags
+
+instance Prelude.NFData TagResource where
+  rnf TagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tags
+
+instance Data.ToHeaders TagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.TagResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("resourceArn" Data..= resourceArn),
+            Prelude.Just ("tags" Data..= tags)
+          ]
+      )
+
+instance Data.ToPath TagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery TagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newTagResourceResponse' smart constructor.
+data TagResourceResponse = TagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'tagResourceResponse_httpStatus' - The response's http status code.
+newTagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  TagResourceResponse
+newTagResourceResponse pHttpStatus_ =
+  TagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+tagResourceResponse_httpStatus :: Lens.Lens' TagResourceResponse Prelude.Int
+tagResourceResponse_httpStatus = Lens.lens (\TagResourceResponse' {httpStatus} -> httpStatus) (\s@TagResourceResponse' {} a -> s {httpStatus = a} :: TagResourceResponse)
+
+instance Prelude.NFData TagResourceResponse where
+  rnf TagResourceResponse' {..} = Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/Types.hs b/gen/Amazonka/Personalize/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types.hs
@@ -0,0 +1,847 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _InvalidInputException,
+    _InvalidNextTokenException,
+    _LimitExceededException,
+    _ResourceAlreadyExistsException,
+    _ResourceInUseException,
+    _ResourceNotFoundException,
+    _TooManyTagKeysException,
+    _TooManyTagsException,
+
+    -- * Domain
+    Domain (..),
+
+    -- * ImportMode
+    ImportMode (..),
+
+    -- * IngestionMode
+    IngestionMode (..),
+
+    -- * ObjectiveSensitivity
+    ObjectiveSensitivity (..),
+
+    -- * RecipeProvider
+    RecipeProvider (..),
+
+    -- * TrainingMode
+    TrainingMode (..),
+
+    -- * Algorithm
+    Algorithm (..),
+    newAlgorithm,
+    algorithm_algorithmArn,
+    algorithm_algorithmImage,
+    algorithm_creationDateTime,
+    algorithm_defaultHyperParameterRanges,
+    algorithm_defaultHyperParameters,
+    algorithm_defaultResourceConfig,
+    algorithm_lastUpdatedDateTime,
+    algorithm_name,
+    algorithm_roleArn,
+    algorithm_trainingInputMode,
+
+    -- * AlgorithmImage
+    AlgorithmImage (..),
+    newAlgorithmImage,
+    algorithmImage_name,
+    algorithmImage_dockerURI,
+
+    -- * AutoMLConfig
+    AutoMLConfig (..),
+    newAutoMLConfig,
+    autoMLConfig_metricName,
+    autoMLConfig_recipeList,
+
+    -- * AutoMLResult
+    AutoMLResult (..),
+    newAutoMLResult,
+    autoMLResult_bestRecipeArn,
+
+    -- * BatchInferenceJob
+    BatchInferenceJob (..),
+    newBatchInferenceJob,
+    batchInferenceJob_batchInferenceJobArn,
+    batchInferenceJob_batchInferenceJobConfig,
+    batchInferenceJob_creationDateTime,
+    batchInferenceJob_failureReason,
+    batchInferenceJob_filterArn,
+    batchInferenceJob_jobInput,
+    batchInferenceJob_jobName,
+    batchInferenceJob_jobOutput,
+    batchInferenceJob_lastUpdatedDateTime,
+    batchInferenceJob_numResults,
+    batchInferenceJob_roleArn,
+    batchInferenceJob_solutionVersionArn,
+    batchInferenceJob_status,
+
+    -- * BatchInferenceJobConfig
+    BatchInferenceJobConfig (..),
+    newBatchInferenceJobConfig,
+    batchInferenceJobConfig_itemExplorationConfig,
+
+    -- * BatchInferenceJobInput
+    BatchInferenceJobInput (..),
+    newBatchInferenceJobInput,
+    batchInferenceJobInput_s3DataSource,
+
+    -- * BatchInferenceJobOutput
+    BatchInferenceJobOutput (..),
+    newBatchInferenceJobOutput,
+    batchInferenceJobOutput_s3DataDestination,
+
+    -- * BatchInferenceJobSummary
+    BatchInferenceJobSummary (..),
+    newBatchInferenceJobSummary,
+    batchInferenceJobSummary_batchInferenceJobArn,
+    batchInferenceJobSummary_creationDateTime,
+    batchInferenceJobSummary_failureReason,
+    batchInferenceJobSummary_jobName,
+    batchInferenceJobSummary_lastUpdatedDateTime,
+    batchInferenceJobSummary_solutionVersionArn,
+    batchInferenceJobSummary_status,
+
+    -- * BatchSegmentJob
+    BatchSegmentJob (..),
+    newBatchSegmentJob,
+    batchSegmentJob_batchSegmentJobArn,
+    batchSegmentJob_creationDateTime,
+    batchSegmentJob_failureReason,
+    batchSegmentJob_filterArn,
+    batchSegmentJob_jobInput,
+    batchSegmentJob_jobName,
+    batchSegmentJob_jobOutput,
+    batchSegmentJob_lastUpdatedDateTime,
+    batchSegmentJob_numResults,
+    batchSegmentJob_roleArn,
+    batchSegmentJob_solutionVersionArn,
+    batchSegmentJob_status,
+
+    -- * BatchSegmentJobInput
+    BatchSegmentJobInput (..),
+    newBatchSegmentJobInput,
+    batchSegmentJobInput_s3DataSource,
+
+    -- * BatchSegmentJobOutput
+    BatchSegmentJobOutput (..),
+    newBatchSegmentJobOutput,
+    batchSegmentJobOutput_s3DataDestination,
+
+    -- * BatchSegmentJobSummary
+    BatchSegmentJobSummary (..),
+    newBatchSegmentJobSummary,
+    batchSegmentJobSummary_batchSegmentJobArn,
+    batchSegmentJobSummary_creationDateTime,
+    batchSegmentJobSummary_failureReason,
+    batchSegmentJobSummary_jobName,
+    batchSegmentJobSummary_lastUpdatedDateTime,
+    batchSegmentJobSummary_solutionVersionArn,
+    batchSegmentJobSummary_status,
+
+    -- * Campaign
+    Campaign (..),
+    newCampaign,
+    campaign_campaignArn,
+    campaign_campaignConfig,
+    campaign_creationDateTime,
+    campaign_failureReason,
+    campaign_lastUpdatedDateTime,
+    campaign_latestCampaignUpdate,
+    campaign_minProvisionedTPS,
+    campaign_name,
+    campaign_solutionVersionArn,
+    campaign_status,
+
+    -- * CampaignConfig
+    CampaignConfig (..),
+    newCampaignConfig,
+    campaignConfig_itemExplorationConfig,
+
+    -- * CampaignSummary
+    CampaignSummary (..),
+    newCampaignSummary,
+    campaignSummary_campaignArn,
+    campaignSummary_creationDateTime,
+    campaignSummary_failureReason,
+    campaignSummary_lastUpdatedDateTime,
+    campaignSummary_name,
+    campaignSummary_status,
+
+    -- * CampaignUpdateSummary
+    CampaignUpdateSummary (..),
+    newCampaignUpdateSummary,
+    campaignUpdateSummary_campaignConfig,
+    campaignUpdateSummary_creationDateTime,
+    campaignUpdateSummary_failureReason,
+    campaignUpdateSummary_lastUpdatedDateTime,
+    campaignUpdateSummary_minProvisionedTPS,
+    campaignUpdateSummary_solutionVersionArn,
+    campaignUpdateSummary_status,
+
+    -- * CategoricalHyperParameterRange
+    CategoricalHyperParameterRange (..),
+    newCategoricalHyperParameterRange,
+    categoricalHyperParameterRange_name,
+    categoricalHyperParameterRange_values,
+
+    -- * ContinuousHyperParameterRange
+    ContinuousHyperParameterRange (..),
+    newContinuousHyperParameterRange,
+    continuousHyperParameterRange_maxValue,
+    continuousHyperParameterRange_minValue,
+    continuousHyperParameterRange_name,
+
+    -- * DataSource
+    DataSource (..),
+    newDataSource,
+    dataSource_dataLocation,
+
+    -- * Dataset
+    Dataset (..),
+    newDataset,
+    dataset_creationDateTime,
+    dataset_datasetArn,
+    dataset_datasetGroupArn,
+    dataset_datasetType,
+    dataset_lastUpdatedDateTime,
+    dataset_name,
+    dataset_schemaArn,
+    dataset_status,
+
+    -- * DatasetExportJob
+    DatasetExportJob (..),
+    newDatasetExportJob,
+    datasetExportJob_creationDateTime,
+    datasetExportJob_datasetArn,
+    datasetExportJob_datasetExportJobArn,
+    datasetExportJob_failureReason,
+    datasetExportJob_ingestionMode,
+    datasetExportJob_jobName,
+    datasetExportJob_jobOutput,
+    datasetExportJob_lastUpdatedDateTime,
+    datasetExportJob_roleArn,
+    datasetExportJob_status,
+
+    -- * DatasetExportJobOutput
+    DatasetExportJobOutput (..),
+    newDatasetExportJobOutput,
+    datasetExportJobOutput_s3DataDestination,
+
+    -- * DatasetExportJobSummary
+    DatasetExportJobSummary (..),
+    newDatasetExportJobSummary,
+    datasetExportJobSummary_creationDateTime,
+    datasetExportJobSummary_datasetExportJobArn,
+    datasetExportJobSummary_failureReason,
+    datasetExportJobSummary_jobName,
+    datasetExportJobSummary_lastUpdatedDateTime,
+    datasetExportJobSummary_status,
+
+    -- * DatasetGroup
+    DatasetGroup (..),
+    newDatasetGroup,
+    datasetGroup_creationDateTime,
+    datasetGroup_datasetGroupArn,
+    datasetGroup_domain,
+    datasetGroup_failureReason,
+    datasetGroup_kmsKeyArn,
+    datasetGroup_lastUpdatedDateTime,
+    datasetGroup_name,
+    datasetGroup_roleArn,
+    datasetGroup_status,
+
+    -- * DatasetGroupSummary
+    DatasetGroupSummary (..),
+    newDatasetGroupSummary,
+    datasetGroupSummary_creationDateTime,
+    datasetGroupSummary_datasetGroupArn,
+    datasetGroupSummary_domain,
+    datasetGroupSummary_failureReason,
+    datasetGroupSummary_lastUpdatedDateTime,
+    datasetGroupSummary_name,
+    datasetGroupSummary_status,
+
+    -- * DatasetImportJob
+    DatasetImportJob (..),
+    newDatasetImportJob,
+    datasetImportJob_creationDateTime,
+    datasetImportJob_dataSource,
+    datasetImportJob_datasetArn,
+    datasetImportJob_datasetImportJobArn,
+    datasetImportJob_failureReason,
+    datasetImportJob_importMode,
+    datasetImportJob_jobName,
+    datasetImportJob_lastUpdatedDateTime,
+    datasetImportJob_publishAttributionMetricsToS3,
+    datasetImportJob_roleArn,
+    datasetImportJob_status,
+
+    -- * DatasetImportJobSummary
+    DatasetImportJobSummary (..),
+    newDatasetImportJobSummary,
+    datasetImportJobSummary_creationDateTime,
+    datasetImportJobSummary_datasetImportJobArn,
+    datasetImportJobSummary_failureReason,
+    datasetImportJobSummary_importMode,
+    datasetImportJobSummary_jobName,
+    datasetImportJobSummary_lastUpdatedDateTime,
+    datasetImportJobSummary_status,
+
+    -- * DatasetSchema
+    DatasetSchema (..),
+    newDatasetSchema,
+    datasetSchema_creationDateTime,
+    datasetSchema_domain,
+    datasetSchema_lastUpdatedDateTime,
+    datasetSchema_name,
+    datasetSchema_schema,
+    datasetSchema_schemaArn,
+
+    -- * DatasetSchemaSummary
+    DatasetSchemaSummary (..),
+    newDatasetSchemaSummary,
+    datasetSchemaSummary_creationDateTime,
+    datasetSchemaSummary_domain,
+    datasetSchemaSummary_lastUpdatedDateTime,
+    datasetSchemaSummary_name,
+    datasetSchemaSummary_schemaArn,
+
+    -- * DatasetSummary
+    DatasetSummary (..),
+    newDatasetSummary,
+    datasetSummary_creationDateTime,
+    datasetSummary_datasetArn,
+    datasetSummary_datasetType,
+    datasetSummary_lastUpdatedDateTime,
+    datasetSummary_name,
+    datasetSummary_status,
+
+    -- * DefaultCategoricalHyperParameterRange
+    DefaultCategoricalHyperParameterRange (..),
+    newDefaultCategoricalHyperParameterRange,
+    defaultCategoricalHyperParameterRange_isTunable,
+    defaultCategoricalHyperParameterRange_name,
+    defaultCategoricalHyperParameterRange_values,
+
+    -- * DefaultContinuousHyperParameterRange
+    DefaultContinuousHyperParameterRange (..),
+    newDefaultContinuousHyperParameterRange,
+    defaultContinuousHyperParameterRange_isTunable,
+    defaultContinuousHyperParameterRange_maxValue,
+    defaultContinuousHyperParameterRange_minValue,
+    defaultContinuousHyperParameterRange_name,
+
+    -- * DefaultHyperParameterRanges
+    DefaultHyperParameterRanges (..),
+    newDefaultHyperParameterRanges,
+    defaultHyperParameterRanges_categoricalHyperParameterRanges,
+    defaultHyperParameterRanges_continuousHyperParameterRanges,
+    defaultHyperParameterRanges_integerHyperParameterRanges,
+
+    -- * DefaultIntegerHyperParameterRange
+    DefaultIntegerHyperParameterRange (..),
+    newDefaultIntegerHyperParameterRange,
+    defaultIntegerHyperParameterRange_isTunable,
+    defaultIntegerHyperParameterRange_maxValue,
+    defaultIntegerHyperParameterRange_minValue,
+    defaultIntegerHyperParameterRange_name,
+
+    -- * EventTracker
+    EventTracker (..),
+    newEventTracker,
+    eventTracker_accountId,
+    eventTracker_creationDateTime,
+    eventTracker_datasetGroupArn,
+    eventTracker_eventTrackerArn,
+    eventTracker_lastUpdatedDateTime,
+    eventTracker_name,
+    eventTracker_status,
+    eventTracker_trackingId,
+
+    -- * EventTrackerSummary
+    EventTrackerSummary (..),
+    newEventTrackerSummary,
+    eventTrackerSummary_creationDateTime,
+    eventTrackerSummary_eventTrackerArn,
+    eventTrackerSummary_lastUpdatedDateTime,
+    eventTrackerSummary_name,
+    eventTrackerSummary_status,
+
+    -- * FeatureTransformation
+    FeatureTransformation (..),
+    newFeatureTransformation,
+    featureTransformation_creationDateTime,
+    featureTransformation_defaultParameters,
+    featureTransformation_featureTransformationArn,
+    featureTransformation_lastUpdatedDateTime,
+    featureTransformation_name,
+    featureTransformation_status,
+
+    -- * Filter
+    Filter (..),
+    newFilter,
+    filter_creationDateTime,
+    filter_datasetGroupArn,
+    filter_failureReason,
+    filter_filterArn,
+    filter_filterExpression,
+    filter_lastUpdatedDateTime,
+    filter_name,
+    filter_status,
+
+    -- * FilterSummary
+    FilterSummary (..),
+    newFilterSummary,
+    filterSummary_creationDateTime,
+    filterSummary_datasetGroupArn,
+    filterSummary_failureReason,
+    filterSummary_filterArn,
+    filterSummary_lastUpdatedDateTime,
+    filterSummary_name,
+    filterSummary_status,
+
+    -- * HPOConfig
+    HPOConfig (..),
+    newHPOConfig,
+    hPOConfig_algorithmHyperParameterRanges,
+    hPOConfig_hpoObjective,
+    hPOConfig_hpoResourceConfig,
+
+    -- * HPOObjective
+    HPOObjective (..),
+    newHPOObjective,
+    hPOObjective_metricName,
+    hPOObjective_metricRegex,
+    hPOObjective_type,
+
+    -- * HPOResourceConfig
+    HPOResourceConfig (..),
+    newHPOResourceConfig,
+    hPOResourceConfig_maxNumberOfTrainingJobs,
+    hPOResourceConfig_maxParallelTrainingJobs,
+
+    -- * HyperParameterRanges
+    HyperParameterRanges (..),
+    newHyperParameterRanges,
+    hyperParameterRanges_categoricalHyperParameterRanges,
+    hyperParameterRanges_continuousHyperParameterRanges,
+    hyperParameterRanges_integerHyperParameterRanges,
+
+    -- * IntegerHyperParameterRange
+    IntegerHyperParameterRange (..),
+    newIntegerHyperParameterRange,
+    integerHyperParameterRange_maxValue,
+    integerHyperParameterRange_minValue,
+    integerHyperParameterRange_name,
+
+    -- * MetricAttribute
+    MetricAttribute (..),
+    newMetricAttribute,
+    metricAttribute_eventType,
+    metricAttribute_metricName,
+    metricAttribute_expression,
+
+    -- * MetricAttribution
+    MetricAttribution (..),
+    newMetricAttribution,
+    metricAttribution_creationDateTime,
+    metricAttribution_datasetGroupArn,
+    metricAttribution_failureReason,
+    metricAttribution_lastUpdatedDateTime,
+    metricAttribution_metricAttributionArn,
+    metricAttribution_metricsOutputConfig,
+    metricAttribution_name,
+    metricAttribution_status,
+
+    -- * MetricAttributionOutput
+    MetricAttributionOutput (..),
+    newMetricAttributionOutput,
+    metricAttributionOutput_s3DataDestination,
+    metricAttributionOutput_roleArn,
+
+    -- * MetricAttributionSummary
+    MetricAttributionSummary (..),
+    newMetricAttributionSummary,
+    metricAttributionSummary_creationDateTime,
+    metricAttributionSummary_failureReason,
+    metricAttributionSummary_lastUpdatedDateTime,
+    metricAttributionSummary_metricAttributionArn,
+    metricAttributionSummary_name,
+    metricAttributionSummary_status,
+
+    -- * OptimizationObjective
+    OptimizationObjective (..),
+    newOptimizationObjective,
+    optimizationObjective_itemAttribute,
+    optimizationObjective_objectiveSensitivity,
+
+    -- * Recipe
+    Recipe (..),
+    newRecipe,
+    recipe_algorithmArn,
+    recipe_creationDateTime,
+    recipe_description,
+    recipe_featureTransformationArn,
+    recipe_lastUpdatedDateTime,
+    recipe_name,
+    recipe_recipeArn,
+    recipe_recipeType,
+    recipe_status,
+
+    -- * RecipeSummary
+    RecipeSummary (..),
+    newRecipeSummary,
+    recipeSummary_creationDateTime,
+    recipeSummary_domain,
+    recipeSummary_lastUpdatedDateTime,
+    recipeSummary_name,
+    recipeSummary_recipeArn,
+    recipeSummary_status,
+
+    -- * Recommender
+    Recommender (..),
+    newRecommender,
+    recommender_creationDateTime,
+    recommender_datasetGroupArn,
+    recommender_failureReason,
+    recommender_lastUpdatedDateTime,
+    recommender_latestRecommenderUpdate,
+    recommender_modelMetrics,
+    recommender_name,
+    recommender_recipeArn,
+    recommender_recommenderArn,
+    recommender_recommenderConfig,
+    recommender_status,
+
+    -- * RecommenderConfig
+    RecommenderConfig (..),
+    newRecommenderConfig,
+    recommenderConfig_itemExplorationConfig,
+    recommenderConfig_minRecommendationRequestsPerSecond,
+
+    -- * RecommenderSummary
+    RecommenderSummary (..),
+    newRecommenderSummary,
+    recommenderSummary_creationDateTime,
+    recommenderSummary_datasetGroupArn,
+    recommenderSummary_lastUpdatedDateTime,
+    recommenderSummary_name,
+    recommenderSummary_recipeArn,
+    recommenderSummary_recommenderArn,
+    recommenderSummary_recommenderConfig,
+    recommenderSummary_status,
+
+    -- * RecommenderUpdateSummary
+    RecommenderUpdateSummary (..),
+    newRecommenderUpdateSummary,
+    recommenderUpdateSummary_creationDateTime,
+    recommenderUpdateSummary_failureReason,
+    recommenderUpdateSummary_lastUpdatedDateTime,
+    recommenderUpdateSummary_recommenderConfig,
+    recommenderUpdateSummary_status,
+
+    -- * S3DataConfig
+    S3DataConfig (..),
+    newS3DataConfig,
+    s3DataConfig_kmsKeyArn,
+    s3DataConfig_path,
+
+    -- * Solution
+    Solution (..),
+    newSolution,
+    solution_autoMLResult,
+    solution_creationDateTime,
+    solution_datasetGroupArn,
+    solution_eventType,
+    solution_lastUpdatedDateTime,
+    solution_latestSolutionVersion,
+    solution_name,
+    solution_performAutoML,
+    solution_performHPO,
+    solution_recipeArn,
+    solution_solutionArn,
+    solution_solutionConfig,
+    solution_status,
+
+    -- * SolutionConfig
+    SolutionConfig (..),
+    newSolutionConfig,
+    solutionConfig_algorithmHyperParameters,
+    solutionConfig_autoMLConfig,
+    solutionConfig_eventValueThreshold,
+    solutionConfig_featureTransformationParameters,
+    solutionConfig_hpoConfig,
+    solutionConfig_optimizationObjective,
+
+    -- * SolutionSummary
+    SolutionSummary (..),
+    newSolutionSummary,
+    solutionSummary_creationDateTime,
+    solutionSummary_lastUpdatedDateTime,
+    solutionSummary_name,
+    solutionSummary_recipeArn,
+    solutionSummary_solutionArn,
+    solutionSummary_status,
+
+    -- * SolutionVersion
+    SolutionVersion (..),
+    newSolutionVersion,
+    solutionVersion_creationDateTime,
+    solutionVersion_datasetGroupArn,
+    solutionVersion_eventType,
+    solutionVersion_failureReason,
+    solutionVersion_lastUpdatedDateTime,
+    solutionVersion_name,
+    solutionVersion_performAutoML,
+    solutionVersion_performHPO,
+    solutionVersion_recipeArn,
+    solutionVersion_solutionArn,
+    solutionVersion_solutionConfig,
+    solutionVersion_solutionVersionArn,
+    solutionVersion_status,
+    solutionVersion_trainingHours,
+    solutionVersion_trainingMode,
+    solutionVersion_tunedHPOParams,
+
+    -- * SolutionVersionSummary
+    SolutionVersionSummary (..),
+    newSolutionVersionSummary,
+    solutionVersionSummary_creationDateTime,
+    solutionVersionSummary_failureReason,
+    solutionVersionSummary_lastUpdatedDateTime,
+    solutionVersionSummary_solutionVersionArn,
+    solutionVersionSummary_status,
+
+    -- * Tag
+    Tag (..),
+    newTag,
+    tag_tagKey,
+    tag_tagValue,
+
+    -- * TunedHPOParams
+    TunedHPOParams (..),
+    newTunedHPOParams,
+    tunedHPOParams_algorithmHyperParameters,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.Personalize.Types.Algorithm
+import Amazonka.Personalize.Types.AlgorithmImage
+import Amazonka.Personalize.Types.AutoMLConfig
+import Amazonka.Personalize.Types.AutoMLResult
+import Amazonka.Personalize.Types.BatchInferenceJob
+import Amazonka.Personalize.Types.BatchInferenceJobConfig
+import Amazonka.Personalize.Types.BatchInferenceJobInput
+import Amazonka.Personalize.Types.BatchInferenceJobOutput
+import Amazonka.Personalize.Types.BatchInferenceJobSummary
+import Amazonka.Personalize.Types.BatchSegmentJob
+import Amazonka.Personalize.Types.BatchSegmentJobInput
+import Amazonka.Personalize.Types.BatchSegmentJobOutput
+import Amazonka.Personalize.Types.BatchSegmentJobSummary
+import Amazonka.Personalize.Types.Campaign
+import Amazonka.Personalize.Types.CampaignConfig
+import Amazonka.Personalize.Types.CampaignSummary
+import Amazonka.Personalize.Types.CampaignUpdateSummary
+import Amazonka.Personalize.Types.CategoricalHyperParameterRange
+import Amazonka.Personalize.Types.ContinuousHyperParameterRange
+import Amazonka.Personalize.Types.DataSource
+import Amazonka.Personalize.Types.Dataset
+import Amazonka.Personalize.Types.DatasetExportJob
+import Amazonka.Personalize.Types.DatasetExportJobOutput
+import Amazonka.Personalize.Types.DatasetExportJobSummary
+import Amazonka.Personalize.Types.DatasetGroup
+import Amazonka.Personalize.Types.DatasetGroupSummary
+import Amazonka.Personalize.Types.DatasetImportJob
+import Amazonka.Personalize.Types.DatasetImportJobSummary
+import Amazonka.Personalize.Types.DatasetSchema
+import Amazonka.Personalize.Types.DatasetSchemaSummary
+import Amazonka.Personalize.Types.DatasetSummary
+import Amazonka.Personalize.Types.DefaultCategoricalHyperParameterRange
+import Amazonka.Personalize.Types.DefaultContinuousHyperParameterRange
+import Amazonka.Personalize.Types.DefaultHyperParameterRanges
+import Amazonka.Personalize.Types.DefaultIntegerHyperParameterRange
+import Amazonka.Personalize.Types.Domain
+import Amazonka.Personalize.Types.EventTracker
+import Amazonka.Personalize.Types.EventTrackerSummary
+import Amazonka.Personalize.Types.FeatureTransformation
+import Amazonka.Personalize.Types.Filter
+import Amazonka.Personalize.Types.FilterSummary
+import Amazonka.Personalize.Types.HPOConfig
+import Amazonka.Personalize.Types.HPOObjective
+import Amazonka.Personalize.Types.HPOResourceConfig
+import Amazonka.Personalize.Types.HyperParameterRanges
+import Amazonka.Personalize.Types.ImportMode
+import Amazonka.Personalize.Types.IngestionMode
+import Amazonka.Personalize.Types.IntegerHyperParameterRange
+import Amazonka.Personalize.Types.MetricAttribute
+import Amazonka.Personalize.Types.MetricAttribution
+import Amazonka.Personalize.Types.MetricAttributionOutput
+import Amazonka.Personalize.Types.MetricAttributionSummary
+import Amazonka.Personalize.Types.ObjectiveSensitivity
+import Amazonka.Personalize.Types.OptimizationObjective
+import Amazonka.Personalize.Types.Recipe
+import Amazonka.Personalize.Types.RecipeProvider
+import Amazonka.Personalize.Types.RecipeSummary
+import Amazonka.Personalize.Types.Recommender
+import Amazonka.Personalize.Types.RecommenderConfig
+import Amazonka.Personalize.Types.RecommenderSummary
+import Amazonka.Personalize.Types.RecommenderUpdateSummary
+import Amazonka.Personalize.Types.S3DataConfig
+import Amazonka.Personalize.Types.Solution
+import Amazonka.Personalize.Types.SolutionConfig
+import Amazonka.Personalize.Types.SolutionSummary
+import Amazonka.Personalize.Types.SolutionVersion
+import Amazonka.Personalize.Types.SolutionVersionSummary
+import Amazonka.Personalize.Types.Tag
+import Amazonka.Personalize.Types.TrainingMode
+import Amazonka.Personalize.Types.TunedHPOParams
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2018-05-22@ of the Amazon Personalize SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "Personalize",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "personalize",
+      Core.signingName = "personalize",
+      Core.version = "2018-05-22",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "Personalize",
+      Core.retry = retry
+    }
+  where
+    retry =
+      Core.Exponential
+        { Core.base = 5.0e-2,
+          Core.growth = 2,
+          Core.attempts = 5,
+          Core.check = check
+        }
+    check e
+      | Lens.has (Core.hasStatus 502) e =
+          Prelude.Just "bad_gateway"
+      | Lens.has (Core.hasStatus 504) e =
+          Prelude.Just "gateway_timeout"
+      | Lens.has (Core.hasStatus 500) e =
+          Prelude.Just "general_server_error"
+      | Lens.has (Core.hasStatus 509) e =
+          Prelude.Just "limit_exceeded"
+      | Lens.has
+          ( Core.hasCode "RequestThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "request_throttled_exception"
+      | Lens.has (Core.hasStatus 503) e =
+          Prelude.Just "service_unavailable"
+      | Lens.has
+          ( Core.hasCode "ThrottledException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttled_exception"
+      | Lens.has
+          ( Core.hasCode "Throttling"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling"
+      | Lens.has
+          ( Core.hasCode "ThrottlingException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throttling_exception"
+      | Lens.has
+          ( Core.hasCode
+              "ProvisionedThroughputExceededException"
+              Prelude.. Core.hasStatus 400
+          )
+          e =
+          Prelude.Just "throughput_exceeded"
+      | Lens.has (Core.hasStatus 429) e =
+          Prelude.Just "too_many_requests"
+      | Prelude.otherwise = Prelude.Nothing
+
+-- | Provide a valid value for the field or parameter.
+_InvalidInputException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidInputException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidInputException"
+
+-- | The token is not valid.
+_InvalidNextTokenException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InvalidNextTokenException =
+  Core._MatchServiceError
+    defaultService
+    "InvalidNextTokenException"
+
+-- | The limit on the number of requests per second has been exceeded.
+_LimitExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_LimitExceededException =
+  Core._MatchServiceError
+    defaultService
+    "LimitExceededException"
+
+-- | The specified resource already exists.
+_ResourceAlreadyExistsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceAlreadyExistsException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceAlreadyExistsException"
+
+-- | The specified resource is in use.
+_ResourceInUseException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceInUseException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceInUseException"
+
+-- | Could not find the specified resource.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+
+-- | The request contains more tag keys than can be associated with a
+-- resource (50 tag keys per resource).
+_TooManyTagKeysException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TooManyTagKeysException =
+  Core._MatchServiceError
+    defaultService
+    "TooManyTagKeysException"
+
+-- | You have exceeded the maximum number of tags you can apply to this
+-- resource.
+_TooManyTagsException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_TooManyTagsException =
+  Core._MatchServiceError
+    defaultService
+    "TooManyTagsException"
diff --git a/gen/Amazonka/Personalize/Types/Algorithm.hs b/gen/Amazonka/Personalize/Types/Algorithm.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/Algorithm.hs
@@ -0,0 +1,197 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.Algorithm
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.Algorithm where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.AlgorithmImage
+import Amazonka.Personalize.Types.DefaultHyperParameterRanges
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a custom algorithm.
+--
+-- /See:/ 'newAlgorithm' smart constructor.
+data Algorithm = Algorithm'
+  { -- | The Amazon Resource Name (ARN) of the algorithm.
+    algorithmArn :: Prelude.Maybe Prelude.Text,
+    -- | The URI of the Docker container for the algorithm image.
+    algorithmImage :: Prelude.Maybe AlgorithmImage,
+    -- | The date and time (in Unix time) that the algorithm was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | Specifies the default hyperparameters, their ranges, and whether they
+    -- are tunable. A tunable hyperparameter can have its value determined
+    -- during hyperparameter optimization (HPO).
+    defaultHyperParameterRanges :: Prelude.Maybe DefaultHyperParameterRanges,
+    -- | Specifies the default hyperparameters.
+    defaultHyperParameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Specifies the default maximum number of training jobs and parallel
+    -- training jobs.
+    defaultResourceConfig :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The date and time (in Unix time) that the algorithm was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the algorithm.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the role.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | The training input mode.
+    trainingInputMode :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Algorithm' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'algorithmArn', 'algorithm_algorithmArn' - The Amazon Resource Name (ARN) of the algorithm.
+--
+-- 'algorithmImage', 'algorithm_algorithmImage' - The URI of the Docker container for the algorithm image.
+--
+-- 'creationDateTime', 'algorithm_creationDateTime' - The date and time (in Unix time) that the algorithm was created.
+--
+-- 'defaultHyperParameterRanges', 'algorithm_defaultHyperParameterRanges' - Specifies the default hyperparameters, their ranges, and whether they
+-- are tunable. A tunable hyperparameter can have its value determined
+-- during hyperparameter optimization (HPO).
+--
+-- 'defaultHyperParameters', 'algorithm_defaultHyperParameters' - Specifies the default hyperparameters.
+--
+-- 'defaultResourceConfig', 'algorithm_defaultResourceConfig' - Specifies the default maximum number of training jobs and parallel
+-- training jobs.
+--
+-- 'lastUpdatedDateTime', 'algorithm_lastUpdatedDateTime' - The date and time (in Unix time) that the algorithm was last updated.
+--
+-- 'name', 'algorithm_name' - The name of the algorithm.
+--
+-- 'roleArn', 'algorithm_roleArn' - The Amazon Resource Name (ARN) of the role.
+--
+-- 'trainingInputMode', 'algorithm_trainingInputMode' - The training input mode.
+newAlgorithm ::
+  Algorithm
+newAlgorithm =
+  Algorithm'
+    { algorithmArn = Prelude.Nothing,
+      algorithmImage = Prelude.Nothing,
+      creationDateTime = Prelude.Nothing,
+      defaultHyperParameterRanges = Prelude.Nothing,
+      defaultHyperParameters = Prelude.Nothing,
+      defaultResourceConfig = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      roleArn = Prelude.Nothing,
+      trainingInputMode = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the algorithm.
+algorithm_algorithmArn :: Lens.Lens' Algorithm (Prelude.Maybe Prelude.Text)
+algorithm_algorithmArn = Lens.lens (\Algorithm' {algorithmArn} -> algorithmArn) (\s@Algorithm' {} a -> s {algorithmArn = a} :: Algorithm)
+
+-- | The URI of the Docker container for the algorithm image.
+algorithm_algorithmImage :: Lens.Lens' Algorithm (Prelude.Maybe AlgorithmImage)
+algorithm_algorithmImage = Lens.lens (\Algorithm' {algorithmImage} -> algorithmImage) (\s@Algorithm' {} a -> s {algorithmImage = a} :: Algorithm)
+
+-- | The date and time (in Unix time) that the algorithm was created.
+algorithm_creationDateTime :: Lens.Lens' Algorithm (Prelude.Maybe Prelude.UTCTime)
+algorithm_creationDateTime = Lens.lens (\Algorithm' {creationDateTime} -> creationDateTime) (\s@Algorithm' {} a -> s {creationDateTime = a} :: Algorithm) Prelude.. Lens.mapping Data._Time
+
+-- | Specifies the default hyperparameters, their ranges, and whether they
+-- are tunable. A tunable hyperparameter can have its value determined
+-- during hyperparameter optimization (HPO).
+algorithm_defaultHyperParameterRanges :: Lens.Lens' Algorithm (Prelude.Maybe DefaultHyperParameterRanges)
+algorithm_defaultHyperParameterRanges = Lens.lens (\Algorithm' {defaultHyperParameterRanges} -> defaultHyperParameterRanges) (\s@Algorithm' {} a -> s {defaultHyperParameterRanges = a} :: Algorithm)
+
+-- | Specifies the default hyperparameters.
+algorithm_defaultHyperParameters :: Lens.Lens' Algorithm (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+algorithm_defaultHyperParameters = Lens.lens (\Algorithm' {defaultHyperParameters} -> defaultHyperParameters) (\s@Algorithm' {} a -> s {defaultHyperParameters = a} :: Algorithm) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specifies the default maximum number of training jobs and parallel
+-- training jobs.
+algorithm_defaultResourceConfig :: Lens.Lens' Algorithm (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+algorithm_defaultResourceConfig = Lens.lens (\Algorithm' {defaultResourceConfig} -> defaultResourceConfig) (\s@Algorithm' {} a -> s {defaultResourceConfig = a} :: Algorithm) Prelude.. Lens.mapping Lens.coerced
+
+-- | The date and time (in Unix time) that the algorithm was last updated.
+algorithm_lastUpdatedDateTime :: Lens.Lens' Algorithm (Prelude.Maybe Prelude.UTCTime)
+algorithm_lastUpdatedDateTime = Lens.lens (\Algorithm' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@Algorithm' {} a -> s {lastUpdatedDateTime = a} :: Algorithm) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the algorithm.
+algorithm_name :: Lens.Lens' Algorithm (Prelude.Maybe Prelude.Text)
+algorithm_name = Lens.lens (\Algorithm' {name} -> name) (\s@Algorithm' {} a -> s {name = a} :: Algorithm)
+
+-- | The Amazon Resource Name (ARN) of the role.
+algorithm_roleArn :: Lens.Lens' Algorithm (Prelude.Maybe Prelude.Text)
+algorithm_roleArn = Lens.lens (\Algorithm' {roleArn} -> roleArn) (\s@Algorithm' {} a -> s {roleArn = a} :: Algorithm)
+
+-- | The training input mode.
+algorithm_trainingInputMode :: Lens.Lens' Algorithm (Prelude.Maybe Prelude.Text)
+algorithm_trainingInputMode = Lens.lens (\Algorithm' {trainingInputMode} -> trainingInputMode) (\s@Algorithm' {} a -> s {trainingInputMode = a} :: Algorithm)
+
+instance Data.FromJSON Algorithm where
+  parseJSON =
+    Data.withObject
+      "Algorithm"
+      ( \x ->
+          Algorithm'
+            Prelude.<$> (x Data..:? "algorithmArn")
+            Prelude.<*> (x Data..:? "algorithmImage")
+            Prelude.<*> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "defaultHyperParameterRanges")
+            Prelude.<*> ( x
+                            Data..:? "defaultHyperParameters"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..:? "defaultResourceConfig"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "roleArn")
+            Prelude.<*> (x Data..:? "trainingInputMode")
+      )
+
+instance Prelude.Hashable Algorithm where
+  hashWithSalt _salt Algorithm' {..} =
+    _salt
+      `Prelude.hashWithSalt` algorithmArn
+      `Prelude.hashWithSalt` algorithmImage
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` defaultHyperParameterRanges
+      `Prelude.hashWithSalt` defaultHyperParameters
+      `Prelude.hashWithSalt` defaultResourceConfig
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` trainingInputMode
+
+instance Prelude.NFData Algorithm where
+  rnf Algorithm' {..} =
+    Prelude.rnf algorithmArn
+      `Prelude.seq` Prelude.rnf algorithmImage
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf defaultHyperParameterRanges
+      `Prelude.seq` Prelude.rnf defaultHyperParameters
+      `Prelude.seq` Prelude.rnf defaultResourceConfig
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf trainingInputMode
diff --git a/gen/Amazonka/Personalize/Types/AlgorithmImage.hs b/gen/Amazonka/Personalize/Types/AlgorithmImage.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/AlgorithmImage.hs
@@ -0,0 +1,86 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.AlgorithmImage
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.AlgorithmImage where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes an algorithm image.
+--
+-- /See:/ 'newAlgorithmImage' smart constructor.
+data AlgorithmImage = AlgorithmImage'
+  { -- | The name of the algorithm image.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The URI of the Docker container for the algorithm image.
+    dockerURI :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AlgorithmImage' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'algorithmImage_name' - The name of the algorithm image.
+--
+-- 'dockerURI', 'algorithmImage_dockerURI' - The URI of the Docker container for the algorithm image.
+newAlgorithmImage ::
+  -- | 'dockerURI'
+  Prelude.Text ->
+  AlgorithmImage
+newAlgorithmImage pDockerURI_ =
+  AlgorithmImage'
+    { name = Prelude.Nothing,
+      dockerURI = pDockerURI_
+    }
+
+-- | The name of the algorithm image.
+algorithmImage_name :: Lens.Lens' AlgorithmImage (Prelude.Maybe Prelude.Text)
+algorithmImage_name = Lens.lens (\AlgorithmImage' {name} -> name) (\s@AlgorithmImage' {} a -> s {name = a} :: AlgorithmImage)
+
+-- | The URI of the Docker container for the algorithm image.
+algorithmImage_dockerURI :: Lens.Lens' AlgorithmImage Prelude.Text
+algorithmImage_dockerURI = Lens.lens (\AlgorithmImage' {dockerURI} -> dockerURI) (\s@AlgorithmImage' {} a -> s {dockerURI = a} :: AlgorithmImage)
+
+instance Data.FromJSON AlgorithmImage where
+  parseJSON =
+    Data.withObject
+      "AlgorithmImage"
+      ( \x ->
+          AlgorithmImage'
+            Prelude.<$> (x Data..:? "name")
+            Prelude.<*> (x Data..: "dockerURI")
+      )
+
+instance Prelude.Hashable AlgorithmImage where
+  hashWithSalt _salt AlgorithmImage' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` dockerURI
+
+instance Prelude.NFData AlgorithmImage where
+  rnf AlgorithmImage' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf dockerURI
diff --git a/gen/Amazonka/Personalize/Types/AutoMLConfig.hs b/gen/Amazonka/Personalize/Types/AutoMLConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/AutoMLConfig.hs
@@ -0,0 +1,97 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.AutoMLConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.AutoMLConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | When the solution performs AutoML (@performAutoML@ is true in
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolution.html CreateSolution>),
+-- Amazon Personalize determines which recipe, from the specified list,
+-- optimizes the given metric. Amazon Personalize then uses that recipe for
+-- the solution.
+--
+-- /See:/ 'newAutoMLConfig' smart constructor.
+data AutoMLConfig = AutoMLConfig'
+  { -- | The metric to optimize.
+    metricName :: Prelude.Maybe Prelude.Text,
+    -- | The list of candidate recipes.
+    recipeList :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AutoMLConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metricName', 'autoMLConfig_metricName' - The metric to optimize.
+--
+-- 'recipeList', 'autoMLConfig_recipeList' - The list of candidate recipes.
+newAutoMLConfig ::
+  AutoMLConfig
+newAutoMLConfig =
+  AutoMLConfig'
+    { metricName = Prelude.Nothing,
+      recipeList = Prelude.Nothing
+    }
+
+-- | The metric to optimize.
+autoMLConfig_metricName :: Lens.Lens' AutoMLConfig (Prelude.Maybe Prelude.Text)
+autoMLConfig_metricName = Lens.lens (\AutoMLConfig' {metricName} -> metricName) (\s@AutoMLConfig' {} a -> s {metricName = a} :: AutoMLConfig)
+
+-- | The list of candidate recipes.
+autoMLConfig_recipeList :: Lens.Lens' AutoMLConfig (Prelude.Maybe [Prelude.Text])
+autoMLConfig_recipeList = Lens.lens (\AutoMLConfig' {recipeList} -> recipeList) (\s@AutoMLConfig' {} a -> s {recipeList = a} :: AutoMLConfig) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON AutoMLConfig where
+  parseJSON =
+    Data.withObject
+      "AutoMLConfig"
+      ( \x ->
+          AutoMLConfig'
+            Prelude.<$> (x Data..:? "metricName")
+            Prelude.<*> (x Data..:? "recipeList" Data..!= Prelude.mempty)
+      )
+
+instance Prelude.Hashable AutoMLConfig where
+  hashWithSalt _salt AutoMLConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` metricName
+      `Prelude.hashWithSalt` recipeList
+
+instance Prelude.NFData AutoMLConfig where
+  rnf AutoMLConfig' {..} =
+    Prelude.rnf metricName
+      `Prelude.seq` Prelude.rnf recipeList
+
+instance Data.ToJSON AutoMLConfig where
+  toJSON AutoMLConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("metricName" Data..=) Prelude.<$> metricName,
+            ("recipeList" Data..=) Prelude.<$> recipeList
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/AutoMLResult.hs b/gen/Amazonka/Personalize/Types/AutoMLResult.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/AutoMLResult.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.AutoMLResult
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.AutoMLResult where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | When the solution performs AutoML (@performAutoML@ is true in
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolution.html CreateSolution>),
+-- specifies the recipe that best optimized the specified metric.
+--
+-- /See:/ 'newAutoMLResult' smart constructor.
+data AutoMLResult = AutoMLResult'
+  { -- | The Amazon Resource Name (ARN) of the best recipe.
+    bestRecipeArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'AutoMLResult' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'bestRecipeArn', 'autoMLResult_bestRecipeArn' - The Amazon Resource Name (ARN) of the best recipe.
+newAutoMLResult ::
+  AutoMLResult
+newAutoMLResult =
+  AutoMLResult' {bestRecipeArn = Prelude.Nothing}
+
+-- | The Amazon Resource Name (ARN) of the best recipe.
+autoMLResult_bestRecipeArn :: Lens.Lens' AutoMLResult (Prelude.Maybe Prelude.Text)
+autoMLResult_bestRecipeArn = Lens.lens (\AutoMLResult' {bestRecipeArn} -> bestRecipeArn) (\s@AutoMLResult' {} a -> s {bestRecipeArn = a} :: AutoMLResult)
+
+instance Data.FromJSON AutoMLResult where
+  parseJSON =
+    Data.withObject
+      "AutoMLResult"
+      ( \x ->
+          AutoMLResult'
+            Prelude.<$> (x Data..:? "bestRecipeArn")
+      )
+
+instance Prelude.Hashable AutoMLResult where
+  hashWithSalt _salt AutoMLResult' {..} =
+    _salt `Prelude.hashWithSalt` bestRecipeArn
+
+instance Prelude.NFData AutoMLResult where
+  rnf AutoMLResult' {..} = Prelude.rnf bestRecipeArn
diff --git a/gen/Amazonka/Personalize/Types/BatchInferenceJob.hs b/gen/Amazonka/Personalize/Types/BatchInferenceJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/BatchInferenceJob.hs
@@ -0,0 +1,265 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.BatchInferenceJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.BatchInferenceJob where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.BatchInferenceJobConfig
+import Amazonka.Personalize.Types.BatchInferenceJobInput
+import Amazonka.Personalize.Types.BatchInferenceJobOutput
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information on a batch inference job.
+--
+-- /See:/ 'newBatchInferenceJob' smart constructor.
+data BatchInferenceJob = BatchInferenceJob'
+  { -- | The Amazon Resource Name (ARN) of the batch inference job.
+    batchInferenceJobArn :: Prelude.Maybe Prelude.Text,
+    -- | A string to string map of the configuration details of a batch inference
+    -- job.
+    batchInferenceJobConfig :: Prelude.Maybe BatchInferenceJobConfig,
+    -- | The time at which the batch inference job was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | If the batch inference job failed, the reason for the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the filter used on the batch inference job.
+    filterArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon S3 path that leads to the input data used to generate the
+    -- batch inference job.
+    jobInput :: Prelude.Maybe BatchInferenceJobInput,
+    -- | The name of the batch inference job.
+    jobName :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon S3 bucket that contains the output data generated by the
+    -- batch inference job.
+    jobOutput :: Prelude.Maybe BatchInferenceJobOutput,
+    -- | The time at which the batch inference job was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The number of recommendations generated by the batch inference job. This
+    -- number includes the error messages generated for failed input records.
+    numResults :: Prelude.Maybe Prelude.Int,
+    -- | The ARN of the Amazon Identity and Access Management (IAM) role that
+    -- requested the batch inference job.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the solution version from which the
+    -- batch inference job was created.
+    solutionVersionArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the batch inference job. The status is one of the
+    -- following values:
+    --
+    -- -   PENDING
+    --
+    -- -   IN PROGRESS
+    --
+    -- -   ACTIVE
+    --
+    -- -   CREATE FAILED
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchInferenceJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchInferenceJobArn', 'batchInferenceJob_batchInferenceJobArn' - The Amazon Resource Name (ARN) of the batch inference job.
+--
+-- 'batchInferenceJobConfig', 'batchInferenceJob_batchInferenceJobConfig' - A string to string map of the configuration details of a batch inference
+-- job.
+--
+-- 'creationDateTime', 'batchInferenceJob_creationDateTime' - The time at which the batch inference job was created.
+--
+-- 'failureReason', 'batchInferenceJob_failureReason' - If the batch inference job failed, the reason for the failure.
+--
+-- 'filterArn', 'batchInferenceJob_filterArn' - The ARN of the filter used on the batch inference job.
+--
+-- 'jobInput', 'batchInferenceJob_jobInput' - The Amazon S3 path that leads to the input data used to generate the
+-- batch inference job.
+--
+-- 'jobName', 'batchInferenceJob_jobName' - The name of the batch inference job.
+--
+-- 'jobOutput', 'batchInferenceJob_jobOutput' - The Amazon S3 bucket that contains the output data generated by the
+-- batch inference job.
+--
+-- 'lastUpdatedDateTime', 'batchInferenceJob_lastUpdatedDateTime' - The time at which the batch inference job was last updated.
+--
+-- 'numResults', 'batchInferenceJob_numResults' - The number of recommendations generated by the batch inference job. This
+-- number includes the error messages generated for failed input records.
+--
+-- 'roleArn', 'batchInferenceJob_roleArn' - The ARN of the Amazon Identity and Access Management (IAM) role that
+-- requested the batch inference job.
+--
+-- 'solutionVersionArn', 'batchInferenceJob_solutionVersionArn' - The Amazon Resource Name (ARN) of the solution version from which the
+-- batch inference job was created.
+--
+-- 'status', 'batchInferenceJob_status' - The status of the batch inference job. The status is one of the
+-- following values:
+--
+-- -   PENDING
+--
+-- -   IN PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+newBatchInferenceJob ::
+  BatchInferenceJob
+newBatchInferenceJob =
+  BatchInferenceJob'
+    { batchInferenceJobArn =
+        Prelude.Nothing,
+      batchInferenceJobConfig = Prelude.Nothing,
+      creationDateTime = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      filterArn = Prelude.Nothing,
+      jobInput = Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      jobOutput = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      numResults = Prelude.Nothing,
+      roleArn = Prelude.Nothing,
+      solutionVersionArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the batch inference job.
+batchInferenceJob_batchInferenceJobArn :: Lens.Lens' BatchInferenceJob (Prelude.Maybe Prelude.Text)
+batchInferenceJob_batchInferenceJobArn = Lens.lens (\BatchInferenceJob' {batchInferenceJobArn} -> batchInferenceJobArn) (\s@BatchInferenceJob' {} a -> s {batchInferenceJobArn = a} :: BatchInferenceJob)
+
+-- | A string to string map of the configuration details of a batch inference
+-- job.
+batchInferenceJob_batchInferenceJobConfig :: Lens.Lens' BatchInferenceJob (Prelude.Maybe BatchInferenceJobConfig)
+batchInferenceJob_batchInferenceJobConfig = Lens.lens (\BatchInferenceJob' {batchInferenceJobConfig} -> batchInferenceJobConfig) (\s@BatchInferenceJob' {} a -> s {batchInferenceJobConfig = a} :: BatchInferenceJob)
+
+-- | The time at which the batch inference job was created.
+batchInferenceJob_creationDateTime :: Lens.Lens' BatchInferenceJob (Prelude.Maybe Prelude.UTCTime)
+batchInferenceJob_creationDateTime = Lens.lens (\BatchInferenceJob' {creationDateTime} -> creationDateTime) (\s@BatchInferenceJob' {} a -> s {creationDateTime = a} :: BatchInferenceJob) Prelude.. Lens.mapping Data._Time
+
+-- | If the batch inference job failed, the reason for the failure.
+batchInferenceJob_failureReason :: Lens.Lens' BatchInferenceJob (Prelude.Maybe Prelude.Text)
+batchInferenceJob_failureReason = Lens.lens (\BatchInferenceJob' {failureReason} -> failureReason) (\s@BatchInferenceJob' {} a -> s {failureReason = a} :: BatchInferenceJob)
+
+-- | The ARN of the filter used on the batch inference job.
+batchInferenceJob_filterArn :: Lens.Lens' BatchInferenceJob (Prelude.Maybe Prelude.Text)
+batchInferenceJob_filterArn = Lens.lens (\BatchInferenceJob' {filterArn} -> filterArn) (\s@BatchInferenceJob' {} a -> s {filterArn = a} :: BatchInferenceJob)
+
+-- | The Amazon S3 path that leads to the input data used to generate the
+-- batch inference job.
+batchInferenceJob_jobInput :: Lens.Lens' BatchInferenceJob (Prelude.Maybe BatchInferenceJobInput)
+batchInferenceJob_jobInput = Lens.lens (\BatchInferenceJob' {jobInput} -> jobInput) (\s@BatchInferenceJob' {} a -> s {jobInput = a} :: BatchInferenceJob)
+
+-- | The name of the batch inference job.
+batchInferenceJob_jobName :: Lens.Lens' BatchInferenceJob (Prelude.Maybe Prelude.Text)
+batchInferenceJob_jobName = Lens.lens (\BatchInferenceJob' {jobName} -> jobName) (\s@BatchInferenceJob' {} a -> s {jobName = a} :: BatchInferenceJob)
+
+-- | The Amazon S3 bucket that contains the output data generated by the
+-- batch inference job.
+batchInferenceJob_jobOutput :: Lens.Lens' BatchInferenceJob (Prelude.Maybe BatchInferenceJobOutput)
+batchInferenceJob_jobOutput = Lens.lens (\BatchInferenceJob' {jobOutput} -> jobOutput) (\s@BatchInferenceJob' {} a -> s {jobOutput = a} :: BatchInferenceJob)
+
+-- | The time at which the batch inference job was last updated.
+batchInferenceJob_lastUpdatedDateTime :: Lens.Lens' BatchInferenceJob (Prelude.Maybe Prelude.UTCTime)
+batchInferenceJob_lastUpdatedDateTime = Lens.lens (\BatchInferenceJob' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@BatchInferenceJob' {} a -> s {lastUpdatedDateTime = a} :: BatchInferenceJob) Prelude.. Lens.mapping Data._Time
+
+-- | The number of recommendations generated by the batch inference job. This
+-- number includes the error messages generated for failed input records.
+batchInferenceJob_numResults :: Lens.Lens' BatchInferenceJob (Prelude.Maybe Prelude.Int)
+batchInferenceJob_numResults = Lens.lens (\BatchInferenceJob' {numResults} -> numResults) (\s@BatchInferenceJob' {} a -> s {numResults = a} :: BatchInferenceJob)
+
+-- | The ARN of the Amazon Identity and Access Management (IAM) role that
+-- requested the batch inference job.
+batchInferenceJob_roleArn :: Lens.Lens' BatchInferenceJob (Prelude.Maybe Prelude.Text)
+batchInferenceJob_roleArn = Lens.lens (\BatchInferenceJob' {roleArn} -> roleArn) (\s@BatchInferenceJob' {} a -> s {roleArn = a} :: BatchInferenceJob)
+
+-- | The Amazon Resource Name (ARN) of the solution version from which the
+-- batch inference job was created.
+batchInferenceJob_solutionVersionArn :: Lens.Lens' BatchInferenceJob (Prelude.Maybe Prelude.Text)
+batchInferenceJob_solutionVersionArn = Lens.lens (\BatchInferenceJob' {solutionVersionArn} -> solutionVersionArn) (\s@BatchInferenceJob' {} a -> s {solutionVersionArn = a} :: BatchInferenceJob)
+
+-- | The status of the batch inference job. The status is one of the
+-- following values:
+--
+-- -   PENDING
+--
+-- -   IN PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+batchInferenceJob_status :: Lens.Lens' BatchInferenceJob (Prelude.Maybe Prelude.Text)
+batchInferenceJob_status = Lens.lens (\BatchInferenceJob' {status} -> status) (\s@BatchInferenceJob' {} a -> s {status = a} :: BatchInferenceJob)
+
+instance Data.FromJSON BatchInferenceJob where
+  parseJSON =
+    Data.withObject
+      "BatchInferenceJob"
+      ( \x ->
+          BatchInferenceJob'
+            Prelude.<$> (x Data..:? "batchInferenceJobArn")
+            Prelude.<*> (x Data..:? "batchInferenceJobConfig")
+            Prelude.<*> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "filterArn")
+            Prelude.<*> (x Data..:? "jobInput")
+            Prelude.<*> (x Data..:? "jobName")
+            Prelude.<*> (x Data..:? "jobOutput")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "numResults")
+            Prelude.<*> (x Data..:? "roleArn")
+            Prelude.<*> (x Data..:? "solutionVersionArn")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable BatchInferenceJob where
+  hashWithSalt _salt BatchInferenceJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` batchInferenceJobArn
+      `Prelude.hashWithSalt` batchInferenceJobConfig
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` filterArn
+      `Prelude.hashWithSalt` jobInput
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` jobOutput
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` numResults
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` solutionVersionArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData BatchInferenceJob where
+  rnf BatchInferenceJob' {..} =
+    Prelude.rnf batchInferenceJobArn
+      `Prelude.seq` Prelude.rnf batchInferenceJobConfig
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf filterArn
+      `Prelude.seq` Prelude.rnf jobInput
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf jobOutput
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf numResults
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/BatchInferenceJobConfig.hs b/gen/Amazonka/Personalize/Types/BatchInferenceJobConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/BatchInferenceJobConfig.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.BatchInferenceJobConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.BatchInferenceJobConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The configuration details of a batch inference job.
+--
+-- /See:/ 'newBatchInferenceJobConfig' smart constructor.
+data BatchInferenceJobConfig = BatchInferenceJobConfig'
+  { -- | A string to string map specifying the exploration configuration
+    -- hyperparameters, including @explorationWeight@ and
+    -- @explorationItemAgeCutOff@, you want to use to configure the amount of
+    -- item exploration Amazon Personalize uses when recommending items. See
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html User-Personalization>.
+    itemExplorationConfig :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchInferenceJobConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'itemExplorationConfig', 'batchInferenceJobConfig_itemExplorationConfig' - A string to string map specifying the exploration configuration
+-- hyperparameters, including @explorationWeight@ and
+-- @explorationItemAgeCutOff@, you want to use to configure the amount of
+-- item exploration Amazon Personalize uses when recommending items. See
+-- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html User-Personalization>.
+newBatchInferenceJobConfig ::
+  BatchInferenceJobConfig
+newBatchInferenceJobConfig =
+  BatchInferenceJobConfig'
+    { itemExplorationConfig =
+        Prelude.Nothing
+    }
+
+-- | A string to string map specifying the exploration configuration
+-- hyperparameters, including @explorationWeight@ and
+-- @explorationItemAgeCutOff@, you want to use to configure the amount of
+-- item exploration Amazon Personalize uses when recommending items. See
+-- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html User-Personalization>.
+batchInferenceJobConfig_itemExplorationConfig :: Lens.Lens' BatchInferenceJobConfig (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+batchInferenceJobConfig_itemExplorationConfig = Lens.lens (\BatchInferenceJobConfig' {itemExplorationConfig} -> itemExplorationConfig) (\s@BatchInferenceJobConfig' {} a -> s {itemExplorationConfig = a} :: BatchInferenceJobConfig) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON BatchInferenceJobConfig where
+  parseJSON =
+    Data.withObject
+      "BatchInferenceJobConfig"
+      ( \x ->
+          BatchInferenceJobConfig'
+            Prelude.<$> ( x
+                            Data..:? "itemExplorationConfig"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable BatchInferenceJobConfig where
+  hashWithSalt _salt BatchInferenceJobConfig' {..} =
+    _salt `Prelude.hashWithSalt` itemExplorationConfig
+
+instance Prelude.NFData BatchInferenceJobConfig where
+  rnf BatchInferenceJobConfig' {..} =
+    Prelude.rnf itemExplorationConfig
+
+instance Data.ToJSON BatchInferenceJobConfig where
+  toJSON BatchInferenceJobConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("itemExplorationConfig" Data..=)
+              Prelude.<$> itemExplorationConfig
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/BatchInferenceJobInput.hs b/gen/Amazonka/Personalize/Types/BatchInferenceJobInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/BatchInferenceJobInput.hs
@@ -0,0 +1,88 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.BatchInferenceJobInput
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.BatchInferenceJobInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.S3DataConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | The input configuration of a batch inference job.
+--
+-- /See:/ 'newBatchInferenceJobInput' smart constructor.
+data BatchInferenceJobInput = BatchInferenceJobInput'
+  { -- | The URI of the Amazon S3 location that contains your input data. The
+    -- Amazon S3 bucket must be in the same region as the API endpoint you are
+    -- calling.
+    s3DataSource :: S3DataConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchInferenceJobInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 's3DataSource', 'batchInferenceJobInput_s3DataSource' - The URI of the Amazon S3 location that contains your input data. The
+-- Amazon S3 bucket must be in the same region as the API endpoint you are
+-- calling.
+newBatchInferenceJobInput ::
+  -- | 's3DataSource'
+  S3DataConfig ->
+  BatchInferenceJobInput
+newBatchInferenceJobInput pS3DataSource_ =
+  BatchInferenceJobInput'
+    { s3DataSource =
+        pS3DataSource_
+    }
+
+-- | The URI of the Amazon S3 location that contains your input data. The
+-- Amazon S3 bucket must be in the same region as the API endpoint you are
+-- calling.
+batchInferenceJobInput_s3DataSource :: Lens.Lens' BatchInferenceJobInput S3DataConfig
+batchInferenceJobInput_s3DataSource = Lens.lens (\BatchInferenceJobInput' {s3DataSource} -> s3DataSource) (\s@BatchInferenceJobInput' {} a -> s {s3DataSource = a} :: BatchInferenceJobInput)
+
+instance Data.FromJSON BatchInferenceJobInput where
+  parseJSON =
+    Data.withObject
+      "BatchInferenceJobInput"
+      ( \x ->
+          BatchInferenceJobInput'
+            Prelude.<$> (x Data..: "s3DataSource")
+      )
+
+instance Prelude.Hashable BatchInferenceJobInput where
+  hashWithSalt _salt BatchInferenceJobInput' {..} =
+    _salt `Prelude.hashWithSalt` s3DataSource
+
+instance Prelude.NFData BatchInferenceJobInput where
+  rnf BatchInferenceJobInput' {..} =
+    Prelude.rnf s3DataSource
+
+instance Data.ToJSON BatchInferenceJobInput where
+  toJSON BatchInferenceJobInput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("s3DataSource" Data..= s3DataSource)]
+      )
diff --git a/gen/Amazonka/Personalize/Types/BatchInferenceJobOutput.hs b/gen/Amazonka/Personalize/Types/BatchInferenceJobOutput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/BatchInferenceJobOutput.hs
@@ -0,0 +1,87 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.BatchInferenceJobOutput
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.BatchInferenceJobOutput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.S3DataConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | The output configuration parameters of a batch inference job.
+--
+-- /See:/ 'newBatchInferenceJobOutput' smart constructor.
+data BatchInferenceJobOutput = BatchInferenceJobOutput'
+  { -- | Information on the Amazon S3 bucket in which the batch inference job\'s
+    -- output is stored.
+    s3DataDestination :: S3DataConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchInferenceJobOutput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 's3DataDestination', 'batchInferenceJobOutput_s3DataDestination' - Information on the Amazon S3 bucket in which the batch inference job\'s
+-- output is stored.
+newBatchInferenceJobOutput ::
+  -- | 's3DataDestination'
+  S3DataConfig ->
+  BatchInferenceJobOutput
+newBatchInferenceJobOutput pS3DataDestination_ =
+  BatchInferenceJobOutput'
+    { s3DataDestination =
+        pS3DataDestination_
+    }
+
+-- | Information on the Amazon S3 bucket in which the batch inference job\'s
+-- output is stored.
+batchInferenceJobOutput_s3DataDestination :: Lens.Lens' BatchInferenceJobOutput S3DataConfig
+batchInferenceJobOutput_s3DataDestination = Lens.lens (\BatchInferenceJobOutput' {s3DataDestination} -> s3DataDestination) (\s@BatchInferenceJobOutput' {} a -> s {s3DataDestination = a} :: BatchInferenceJobOutput)
+
+instance Data.FromJSON BatchInferenceJobOutput where
+  parseJSON =
+    Data.withObject
+      "BatchInferenceJobOutput"
+      ( \x ->
+          BatchInferenceJobOutput'
+            Prelude.<$> (x Data..: "s3DataDestination")
+      )
+
+instance Prelude.Hashable BatchInferenceJobOutput where
+  hashWithSalt _salt BatchInferenceJobOutput' {..} =
+    _salt `Prelude.hashWithSalt` s3DataDestination
+
+instance Prelude.NFData BatchInferenceJobOutput where
+  rnf BatchInferenceJobOutput' {..} =
+    Prelude.rnf s3DataDestination
+
+instance Data.ToJSON BatchInferenceJobOutput where
+  toJSON BatchInferenceJobOutput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("s3DataDestination" Data..= s3DataDestination)
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/BatchInferenceJobSummary.hs b/gen/Amazonka/Personalize/Types/BatchInferenceJobSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/BatchInferenceJobSummary.hs
@@ -0,0 +1,176 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.BatchInferenceJobSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.BatchInferenceJobSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A truncated version of the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_BatchInferenceJob.html BatchInferenceJob>.
+-- The
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_ListBatchInferenceJobs.html ListBatchInferenceJobs>
+-- operation returns a list of batch inference job summaries.
+--
+-- /See:/ 'newBatchInferenceJobSummary' smart constructor.
+data BatchInferenceJobSummary = BatchInferenceJobSummary'
+  { -- | The Amazon Resource Name (ARN) of the batch inference job.
+    batchInferenceJobArn :: Prelude.Maybe Prelude.Text,
+    -- | The time at which the batch inference job was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | If the batch inference job failed, the reason for the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The name of the batch inference job.
+    jobName :: Prelude.Maybe Prelude.Text,
+    -- | The time at which the batch inference job was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The ARN of the solution version used by the batch inference job.
+    solutionVersionArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the batch inference job. The status is one of the
+    -- following values:
+    --
+    -- -   PENDING
+    --
+    -- -   IN PROGRESS
+    --
+    -- -   ACTIVE
+    --
+    -- -   CREATE FAILED
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchInferenceJobSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchInferenceJobArn', 'batchInferenceJobSummary_batchInferenceJobArn' - The Amazon Resource Name (ARN) of the batch inference job.
+--
+-- 'creationDateTime', 'batchInferenceJobSummary_creationDateTime' - The time at which the batch inference job was created.
+--
+-- 'failureReason', 'batchInferenceJobSummary_failureReason' - If the batch inference job failed, the reason for the failure.
+--
+-- 'jobName', 'batchInferenceJobSummary_jobName' - The name of the batch inference job.
+--
+-- 'lastUpdatedDateTime', 'batchInferenceJobSummary_lastUpdatedDateTime' - The time at which the batch inference job was last updated.
+--
+-- 'solutionVersionArn', 'batchInferenceJobSummary_solutionVersionArn' - The ARN of the solution version used by the batch inference job.
+--
+-- 'status', 'batchInferenceJobSummary_status' - The status of the batch inference job. The status is one of the
+-- following values:
+--
+-- -   PENDING
+--
+-- -   IN PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+newBatchInferenceJobSummary ::
+  BatchInferenceJobSummary
+newBatchInferenceJobSummary =
+  BatchInferenceJobSummary'
+    { batchInferenceJobArn =
+        Prelude.Nothing,
+      creationDateTime = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      solutionVersionArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the batch inference job.
+batchInferenceJobSummary_batchInferenceJobArn :: Lens.Lens' BatchInferenceJobSummary (Prelude.Maybe Prelude.Text)
+batchInferenceJobSummary_batchInferenceJobArn = Lens.lens (\BatchInferenceJobSummary' {batchInferenceJobArn} -> batchInferenceJobArn) (\s@BatchInferenceJobSummary' {} a -> s {batchInferenceJobArn = a} :: BatchInferenceJobSummary)
+
+-- | The time at which the batch inference job was created.
+batchInferenceJobSummary_creationDateTime :: Lens.Lens' BatchInferenceJobSummary (Prelude.Maybe Prelude.UTCTime)
+batchInferenceJobSummary_creationDateTime = Lens.lens (\BatchInferenceJobSummary' {creationDateTime} -> creationDateTime) (\s@BatchInferenceJobSummary' {} a -> s {creationDateTime = a} :: BatchInferenceJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | If the batch inference job failed, the reason for the failure.
+batchInferenceJobSummary_failureReason :: Lens.Lens' BatchInferenceJobSummary (Prelude.Maybe Prelude.Text)
+batchInferenceJobSummary_failureReason = Lens.lens (\BatchInferenceJobSummary' {failureReason} -> failureReason) (\s@BatchInferenceJobSummary' {} a -> s {failureReason = a} :: BatchInferenceJobSummary)
+
+-- | The name of the batch inference job.
+batchInferenceJobSummary_jobName :: Lens.Lens' BatchInferenceJobSummary (Prelude.Maybe Prelude.Text)
+batchInferenceJobSummary_jobName = Lens.lens (\BatchInferenceJobSummary' {jobName} -> jobName) (\s@BatchInferenceJobSummary' {} a -> s {jobName = a} :: BatchInferenceJobSummary)
+
+-- | The time at which the batch inference job was last updated.
+batchInferenceJobSummary_lastUpdatedDateTime :: Lens.Lens' BatchInferenceJobSummary (Prelude.Maybe Prelude.UTCTime)
+batchInferenceJobSummary_lastUpdatedDateTime = Lens.lens (\BatchInferenceJobSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@BatchInferenceJobSummary' {} a -> s {lastUpdatedDateTime = a} :: BatchInferenceJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The ARN of the solution version used by the batch inference job.
+batchInferenceJobSummary_solutionVersionArn :: Lens.Lens' BatchInferenceJobSummary (Prelude.Maybe Prelude.Text)
+batchInferenceJobSummary_solutionVersionArn = Lens.lens (\BatchInferenceJobSummary' {solutionVersionArn} -> solutionVersionArn) (\s@BatchInferenceJobSummary' {} a -> s {solutionVersionArn = a} :: BatchInferenceJobSummary)
+
+-- | The status of the batch inference job. The status is one of the
+-- following values:
+--
+-- -   PENDING
+--
+-- -   IN PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+batchInferenceJobSummary_status :: Lens.Lens' BatchInferenceJobSummary (Prelude.Maybe Prelude.Text)
+batchInferenceJobSummary_status = Lens.lens (\BatchInferenceJobSummary' {status} -> status) (\s@BatchInferenceJobSummary' {} a -> s {status = a} :: BatchInferenceJobSummary)
+
+instance Data.FromJSON BatchInferenceJobSummary where
+  parseJSON =
+    Data.withObject
+      "BatchInferenceJobSummary"
+      ( \x ->
+          BatchInferenceJobSummary'
+            Prelude.<$> (x Data..:? "batchInferenceJobArn")
+            Prelude.<*> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "jobName")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "solutionVersionArn")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable BatchInferenceJobSummary where
+  hashWithSalt _salt BatchInferenceJobSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` batchInferenceJobArn
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` solutionVersionArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData BatchInferenceJobSummary where
+  rnf BatchInferenceJobSummary' {..} =
+    Prelude.rnf batchInferenceJobArn
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/BatchSegmentJob.hs b/gen/Amazonka/Personalize/Types/BatchSegmentJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/BatchSegmentJob.hs
@@ -0,0 +1,249 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.BatchSegmentJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.BatchSegmentJob where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.BatchSegmentJobInput
+import Amazonka.Personalize.Types.BatchSegmentJobOutput
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information on a batch segment job.
+--
+-- /See:/ 'newBatchSegmentJob' smart constructor.
+data BatchSegmentJob = BatchSegmentJob'
+  { -- | The Amazon Resource Name (ARN) of the batch segment job.
+    batchSegmentJobArn :: Prelude.Maybe Prelude.Text,
+    -- | The time at which the batch segment job was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | If the batch segment job failed, the reason for the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the filter used on the batch segment job.
+    filterArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon S3 path that leads to the input data used to generate the
+    -- batch segment job.
+    jobInput :: Prelude.Maybe BatchSegmentJobInput,
+    -- | The name of the batch segment job.
+    jobName :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon S3 bucket that contains the output data generated by the
+    -- batch segment job.
+    jobOutput :: Prelude.Maybe BatchSegmentJobOutput,
+    -- | The time at which the batch segment job last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The number of predicted users generated by the batch segment job for
+    -- each line of input data.
+    numResults :: Prelude.Maybe Prelude.Int,
+    -- | The ARN of the Amazon Identity and Access Management (IAM) role that
+    -- requested the batch segment job.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the solution version used by the batch
+    -- segment job to generate batch segments.
+    solutionVersionArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the batch segment job. The status is one of the following
+    -- values:
+    --
+    -- -   PENDING
+    --
+    -- -   IN PROGRESS
+    --
+    -- -   ACTIVE
+    --
+    -- -   CREATE FAILED
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchSegmentJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchSegmentJobArn', 'batchSegmentJob_batchSegmentJobArn' - The Amazon Resource Name (ARN) of the batch segment job.
+--
+-- 'creationDateTime', 'batchSegmentJob_creationDateTime' - The time at which the batch segment job was created.
+--
+-- 'failureReason', 'batchSegmentJob_failureReason' - If the batch segment job failed, the reason for the failure.
+--
+-- 'filterArn', 'batchSegmentJob_filterArn' - The ARN of the filter used on the batch segment job.
+--
+-- 'jobInput', 'batchSegmentJob_jobInput' - The Amazon S3 path that leads to the input data used to generate the
+-- batch segment job.
+--
+-- 'jobName', 'batchSegmentJob_jobName' - The name of the batch segment job.
+--
+-- 'jobOutput', 'batchSegmentJob_jobOutput' - The Amazon S3 bucket that contains the output data generated by the
+-- batch segment job.
+--
+-- 'lastUpdatedDateTime', 'batchSegmentJob_lastUpdatedDateTime' - The time at which the batch segment job last updated.
+--
+-- 'numResults', 'batchSegmentJob_numResults' - The number of predicted users generated by the batch segment job for
+-- each line of input data.
+--
+-- 'roleArn', 'batchSegmentJob_roleArn' - The ARN of the Amazon Identity and Access Management (IAM) role that
+-- requested the batch segment job.
+--
+-- 'solutionVersionArn', 'batchSegmentJob_solutionVersionArn' - The Amazon Resource Name (ARN) of the solution version used by the batch
+-- segment job to generate batch segments.
+--
+-- 'status', 'batchSegmentJob_status' - The status of the batch segment job. The status is one of the following
+-- values:
+--
+-- -   PENDING
+--
+-- -   IN PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+newBatchSegmentJob ::
+  BatchSegmentJob
+newBatchSegmentJob =
+  BatchSegmentJob'
+    { batchSegmentJobArn =
+        Prelude.Nothing,
+      creationDateTime = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      filterArn = Prelude.Nothing,
+      jobInput = Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      jobOutput = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      numResults = Prelude.Nothing,
+      roleArn = Prelude.Nothing,
+      solutionVersionArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the batch segment job.
+batchSegmentJob_batchSegmentJobArn :: Lens.Lens' BatchSegmentJob (Prelude.Maybe Prelude.Text)
+batchSegmentJob_batchSegmentJobArn = Lens.lens (\BatchSegmentJob' {batchSegmentJobArn} -> batchSegmentJobArn) (\s@BatchSegmentJob' {} a -> s {batchSegmentJobArn = a} :: BatchSegmentJob)
+
+-- | The time at which the batch segment job was created.
+batchSegmentJob_creationDateTime :: Lens.Lens' BatchSegmentJob (Prelude.Maybe Prelude.UTCTime)
+batchSegmentJob_creationDateTime = Lens.lens (\BatchSegmentJob' {creationDateTime} -> creationDateTime) (\s@BatchSegmentJob' {} a -> s {creationDateTime = a} :: BatchSegmentJob) Prelude.. Lens.mapping Data._Time
+
+-- | If the batch segment job failed, the reason for the failure.
+batchSegmentJob_failureReason :: Lens.Lens' BatchSegmentJob (Prelude.Maybe Prelude.Text)
+batchSegmentJob_failureReason = Lens.lens (\BatchSegmentJob' {failureReason} -> failureReason) (\s@BatchSegmentJob' {} a -> s {failureReason = a} :: BatchSegmentJob)
+
+-- | The ARN of the filter used on the batch segment job.
+batchSegmentJob_filterArn :: Lens.Lens' BatchSegmentJob (Prelude.Maybe Prelude.Text)
+batchSegmentJob_filterArn = Lens.lens (\BatchSegmentJob' {filterArn} -> filterArn) (\s@BatchSegmentJob' {} a -> s {filterArn = a} :: BatchSegmentJob)
+
+-- | The Amazon S3 path that leads to the input data used to generate the
+-- batch segment job.
+batchSegmentJob_jobInput :: Lens.Lens' BatchSegmentJob (Prelude.Maybe BatchSegmentJobInput)
+batchSegmentJob_jobInput = Lens.lens (\BatchSegmentJob' {jobInput} -> jobInput) (\s@BatchSegmentJob' {} a -> s {jobInput = a} :: BatchSegmentJob)
+
+-- | The name of the batch segment job.
+batchSegmentJob_jobName :: Lens.Lens' BatchSegmentJob (Prelude.Maybe Prelude.Text)
+batchSegmentJob_jobName = Lens.lens (\BatchSegmentJob' {jobName} -> jobName) (\s@BatchSegmentJob' {} a -> s {jobName = a} :: BatchSegmentJob)
+
+-- | The Amazon S3 bucket that contains the output data generated by the
+-- batch segment job.
+batchSegmentJob_jobOutput :: Lens.Lens' BatchSegmentJob (Prelude.Maybe BatchSegmentJobOutput)
+batchSegmentJob_jobOutput = Lens.lens (\BatchSegmentJob' {jobOutput} -> jobOutput) (\s@BatchSegmentJob' {} a -> s {jobOutput = a} :: BatchSegmentJob)
+
+-- | The time at which the batch segment job last updated.
+batchSegmentJob_lastUpdatedDateTime :: Lens.Lens' BatchSegmentJob (Prelude.Maybe Prelude.UTCTime)
+batchSegmentJob_lastUpdatedDateTime = Lens.lens (\BatchSegmentJob' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@BatchSegmentJob' {} a -> s {lastUpdatedDateTime = a} :: BatchSegmentJob) Prelude.. Lens.mapping Data._Time
+
+-- | The number of predicted users generated by the batch segment job for
+-- each line of input data.
+batchSegmentJob_numResults :: Lens.Lens' BatchSegmentJob (Prelude.Maybe Prelude.Int)
+batchSegmentJob_numResults = Lens.lens (\BatchSegmentJob' {numResults} -> numResults) (\s@BatchSegmentJob' {} a -> s {numResults = a} :: BatchSegmentJob)
+
+-- | The ARN of the Amazon Identity and Access Management (IAM) role that
+-- requested the batch segment job.
+batchSegmentJob_roleArn :: Lens.Lens' BatchSegmentJob (Prelude.Maybe Prelude.Text)
+batchSegmentJob_roleArn = Lens.lens (\BatchSegmentJob' {roleArn} -> roleArn) (\s@BatchSegmentJob' {} a -> s {roleArn = a} :: BatchSegmentJob)
+
+-- | The Amazon Resource Name (ARN) of the solution version used by the batch
+-- segment job to generate batch segments.
+batchSegmentJob_solutionVersionArn :: Lens.Lens' BatchSegmentJob (Prelude.Maybe Prelude.Text)
+batchSegmentJob_solutionVersionArn = Lens.lens (\BatchSegmentJob' {solutionVersionArn} -> solutionVersionArn) (\s@BatchSegmentJob' {} a -> s {solutionVersionArn = a} :: BatchSegmentJob)
+
+-- | The status of the batch segment job. The status is one of the following
+-- values:
+--
+-- -   PENDING
+--
+-- -   IN PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+batchSegmentJob_status :: Lens.Lens' BatchSegmentJob (Prelude.Maybe Prelude.Text)
+batchSegmentJob_status = Lens.lens (\BatchSegmentJob' {status} -> status) (\s@BatchSegmentJob' {} a -> s {status = a} :: BatchSegmentJob)
+
+instance Data.FromJSON BatchSegmentJob where
+  parseJSON =
+    Data.withObject
+      "BatchSegmentJob"
+      ( \x ->
+          BatchSegmentJob'
+            Prelude.<$> (x Data..:? "batchSegmentJobArn")
+            Prelude.<*> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "filterArn")
+            Prelude.<*> (x Data..:? "jobInput")
+            Prelude.<*> (x Data..:? "jobName")
+            Prelude.<*> (x Data..:? "jobOutput")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "numResults")
+            Prelude.<*> (x Data..:? "roleArn")
+            Prelude.<*> (x Data..:? "solutionVersionArn")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable BatchSegmentJob where
+  hashWithSalt _salt BatchSegmentJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` batchSegmentJobArn
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` filterArn
+      `Prelude.hashWithSalt` jobInput
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` jobOutput
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` numResults
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` solutionVersionArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData BatchSegmentJob where
+  rnf BatchSegmentJob' {..} =
+    Prelude.rnf batchSegmentJobArn
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf filterArn
+      `Prelude.seq` Prelude.rnf jobInput
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf jobOutput
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf numResults
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/BatchSegmentJobInput.hs b/gen/Amazonka/Personalize/Types/BatchSegmentJobInput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/BatchSegmentJobInput.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.BatchSegmentJobInput
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.BatchSegmentJobInput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.S3DataConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | The input configuration of a batch segment job.
+--
+-- /See:/ 'newBatchSegmentJobInput' smart constructor.
+data BatchSegmentJobInput = BatchSegmentJobInput'
+  { s3DataSource :: S3DataConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchSegmentJobInput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 's3DataSource', 'batchSegmentJobInput_s3DataSource' - Undocumented member.
+newBatchSegmentJobInput ::
+  -- | 's3DataSource'
+  S3DataConfig ->
+  BatchSegmentJobInput
+newBatchSegmentJobInput pS3DataSource_ =
+  BatchSegmentJobInput'
+    { s3DataSource =
+        pS3DataSource_
+    }
+
+-- | Undocumented member.
+batchSegmentJobInput_s3DataSource :: Lens.Lens' BatchSegmentJobInput S3DataConfig
+batchSegmentJobInput_s3DataSource = Lens.lens (\BatchSegmentJobInput' {s3DataSource} -> s3DataSource) (\s@BatchSegmentJobInput' {} a -> s {s3DataSource = a} :: BatchSegmentJobInput)
+
+instance Data.FromJSON BatchSegmentJobInput where
+  parseJSON =
+    Data.withObject
+      "BatchSegmentJobInput"
+      ( \x ->
+          BatchSegmentJobInput'
+            Prelude.<$> (x Data..: "s3DataSource")
+      )
+
+instance Prelude.Hashable BatchSegmentJobInput where
+  hashWithSalt _salt BatchSegmentJobInput' {..} =
+    _salt `Prelude.hashWithSalt` s3DataSource
+
+instance Prelude.NFData BatchSegmentJobInput where
+  rnf BatchSegmentJobInput' {..} =
+    Prelude.rnf s3DataSource
+
+instance Data.ToJSON BatchSegmentJobInput where
+  toJSON BatchSegmentJobInput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("s3DataSource" Data..= s3DataSource)]
+      )
diff --git a/gen/Amazonka/Personalize/Types/BatchSegmentJobOutput.hs b/gen/Amazonka/Personalize/Types/BatchSegmentJobOutput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/BatchSegmentJobOutput.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.BatchSegmentJobOutput
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.BatchSegmentJobOutput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.S3DataConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | The output configuration parameters of a batch segment job.
+--
+-- /See:/ 'newBatchSegmentJobOutput' smart constructor.
+data BatchSegmentJobOutput = BatchSegmentJobOutput'
+  { s3DataDestination :: S3DataConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchSegmentJobOutput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 's3DataDestination', 'batchSegmentJobOutput_s3DataDestination' - Undocumented member.
+newBatchSegmentJobOutput ::
+  -- | 's3DataDestination'
+  S3DataConfig ->
+  BatchSegmentJobOutput
+newBatchSegmentJobOutput pS3DataDestination_ =
+  BatchSegmentJobOutput'
+    { s3DataDestination =
+        pS3DataDestination_
+    }
+
+-- | Undocumented member.
+batchSegmentJobOutput_s3DataDestination :: Lens.Lens' BatchSegmentJobOutput S3DataConfig
+batchSegmentJobOutput_s3DataDestination = Lens.lens (\BatchSegmentJobOutput' {s3DataDestination} -> s3DataDestination) (\s@BatchSegmentJobOutput' {} a -> s {s3DataDestination = a} :: BatchSegmentJobOutput)
+
+instance Data.FromJSON BatchSegmentJobOutput where
+  parseJSON =
+    Data.withObject
+      "BatchSegmentJobOutput"
+      ( \x ->
+          BatchSegmentJobOutput'
+            Prelude.<$> (x Data..: "s3DataDestination")
+      )
+
+instance Prelude.Hashable BatchSegmentJobOutput where
+  hashWithSalt _salt BatchSegmentJobOutput' {..} =
+    _salt `Prelude.hashWithSalt` s3DataDestination
+
+instance Prelude.NFData BatchSegmentJobOutput where
+  rnf BatchSegmentJobOutput' {..} =
+    Prelude.rnf s3DataDestination
+
+instance Data.ToJSON BatchSegmentJobOutput where
+  toJSON BatchSegmentJobOutput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("s3DataDestination" Data..= s3DataDestination)
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/BatchSegmentJobSummary.hs b/gen/Amazonka/Personalize/Types/BatchSegmentJobSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/BatchSegmentJobSummary.hs
@@ -0,0 +1,179 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.BatchSegmentJobSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.BatchSegmentJobSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A truncated version of the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_BatchSegmentJob.html BatchSegmentJob>
+-- datatype.
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_ListBatchSegmentJobs.html ListBatchSegmentJobs>
+-- operation returns a list of batch segment job summaries.
+--
+-- /See:/ 'newBatchSegmentJobSummary' smart constructor.
+data BatchSegmentJobSummary = BatchSegmentJobSummary'
+  { -- | The Amazon Resource Name (ARN) of the batch segment job.
+    batchSegmentJobArn :: Prelude.Maybe Prelude.Text,
+    -- | The time at which the batch segment job was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | If the batch segment job failed, the reason for the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The name of the batch segment job.
+    jobName :: Prelude.Maybe Prelude.Text,
+    -- | The time at which the batch segment job was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the solution version used by the batch
+    -- segment job to generate batch segments.
+    solutionVersionArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the batch segment job. The status is one of the following
+    -- values:
+    --
+    -- -   PENDING
+    --
+    -- -   IN PROGRESS
+    --
+    -- -   ACTIVE
+    --
+    -- -   CREATE FAILED
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'BatchSegmentJobSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'batchSegmentJobArn', 'batchSegmentJobSummary_batchSegmentJobArn' - The Amazon Resource Name (ARN) of the batch segment job.
+--
+-- 'creationDateTime', 'batchSegmentJobSummary_creationDateTime' - The time at which the batch segment job was created.
+--
+-- 'failureReason', 'batchSegmentJobSummary_failureReason' - If the batch segment job failed, the reason for the failure.
+--
+-- 'jobName', 'batchSegmentJobSummary_jobName' - The name of the batch segment job.
+--
+-- 'lastUpdatedDateTime', 'batchSegmentJobSummary_lastUpdatedDateTime' - The time at which the batch segment job was last updated.
+--
+-- 'solutionVersionArn', 'batchSegmentJobSummary_solutionVersionArn' - The Amazon Resource Name (ARN) of the solution version used by the batch
+-- segment job to generate batch segments.
+--
+-- 'status', 'batchSegmentJobSummary_status' - The status of the batch segment job. The status is one of the following
+-- values:
+--
+-- -   PENDING
+--
+-- -   IN PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+newBatchSegmentJobSummary ::
+  BatchSegmentJobSummary
+newBatchSegmentJobSummary =
+  BatchSegmentJobSummary'
+    { batchSegmentJobArn =
+        Prelude.Nothing,
+      creationDateTime = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      solutionVersionArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the batch segment job.
+batchSegmentJobSummary_batchSegmentJobArn :: Lens.Lens' BatchSegmentJobSummary (Prelude.Maybe Prelude.Text)
+batchSegmentJobSummary_batchSegmentJobArn = Lens.lens (\BatchSegmentJobSummary' {batchSegmentJobArn} -> batchSegmentJobArn) (\s@BatchSegmentJobSummary' {} a -> s {batchSegmentJobArn = a} :: BatchSegmentJobSummary)
+
+-- | The time at which the batch segment job was created.
+batchSegmentJobSummary_creationDateTime :: Lens.Lens' BatchSegmentJobSummary (Prelude.Maybe Prelude.UTCTime)
+batchSegmentJobSummary_creationDateTime = Lens.lens (\BatchSegmentJobSummary' {creationDateTime} -> creationDateTime) (\s@BatchSegmentJobSummary' {} a -> s {creationDateTime = a} :: BatchSegmentJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | If the batch segment job failed, the reason for the failure.
+batchSegmentJobSummary_failureReason :: Lens.Lens' BatchSegmentJobSummary (Prelude.Maybe Prelude.Text)
+batchSegmentJobSummary_failureReason = Lens.lens (\BatchSegmentJobSummary' {failureReason} -> failureReason) (\s@BatchSegmentJobSummary' {} a -> s {failureReason = a} :: BatchSegmentJobSummary)
+
+-- | The name of the batch segment job.
+batchSegmentJobSummary_jobName :: Lens.Lens' BatchSegmentJobSummary (Prelude.Maybe Prelude.Text)
+batchSegmentJobSummary_jobName = Lens.lens (\BatchSegmentJobSummary' {jobName} -> jobName) (\s@BatchSegmentJobSummary' {} a -> s {jobName = a} :: BatchSegmentJobSummary)
+
+-- | The time at which the batch segment job was last updated.
+batchSegmentJobSummary_lastUpdatedDateTime :: Lens.Lens' BatchSegmentJobSummary (Prelude.Maybe Prelude.UTCTime)
+batchSegmentJobSummary_lastUpdatedDateTime = Lens.lens (\BatchSegmentJobSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@BatchSegmentJobSummary' {} a -> s {lastUpdatedDateTime = a} :: BatchSegmentJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the solution version used by the batch
+-- segment job to generate batch segments.
+batchSegmentJobSummary_solutionVersionArn :: Lens.Lens' BatchSegmentJobSummary (Prelude.Maybe Prelude.Text)
+batchSegmentJobSummary_solutionVersionArn = Lens.lens (\BatchSegmentJobSummary' {solutionVersionArn} -> solutionVersionArn) (\s@BatchSegmentJobSummary' {} a -> s {solutionVersionArn = a} :: BatchSegmentJobSummary)
+
+-- | The status of the batch segment job. The status is one of the following
+-- values:
+--
+-- -   PENDING
+--
+-- -   IN PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+batchSegmentJobSummary_status :: Lens.Lens' BatchSegmentJobSummary (Prelude.Maybe Prelude.Text)
+batchSegmentJobSummary_status = Lens.lens (\BatchSegmentJobSummary' {status} -> status) (\s@BatchSegmentJobSummary' {} a -> s {status = a} :: BatchSegmentJobSummary)
+
+instance Data.FromJSON BatchSegmentJobSummary where
+  parseJSON =
+    Data.withObject
+      "BatchSegmentJobSummary"
+      ( \x ->
+          BatchSegmentJobSummary'
+            Prelude.<$> (x Data..:? "batchSegmentJobArn")
+            Prelude.<*> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "jobName")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "solutionVersionArn")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable BatchSegmentJobSummary where
+  hashWithSalt _salt BatchSegmentJobSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` batchSegmentJobArn
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` solutionVersionArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData BatchSegmentJobSummary where
+  rnf BatchSegmentJobSummary' {..} =
+    Prelude.rnf batchSegmentJobArn
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/Campaign.hs b/gen/Amazonka/Personalize/Types/Campaign.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/Campaign.hs
@@ -0,0 +1,204 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.Campaign
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.Campaign where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.CampaignConfig
+import Amazonka.Personalize.Types.CampaignUpdateSummary
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that describes the deployment of a solution version. For more
+-- information on campaigns, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateCampaign.html CreateCampaign>.
+--
+-- /See:/ 'newCampaign' smart constructor.
+data Campaign = Campaign'
+  { -- | The Amazon Resource Name (ARN) of the campaign.
+    campaignArn :: Prelude.Maybe Prelude.Text,
+    -- | The configuration details of a campaign.
+    campaignConfig :: Prelude.Maybe CampaignConfig,
+    -- | The date and time (in Unix format) that the campaign was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | If a campaign fails, the reason behind the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix format) that the campaign was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    latestCampaignUpdate :: Prelude.Maybe CampaignUpdateSummary,
+    -- | Specifies the requested minimum provisioned transactions
+    -- (recommendations) per second.
+    minProvisionedTPS :: Prelude.Maybe Prelude.Natural,
+    -- | The name of the campaign.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of a specific version of the solution.
+    solutionVersionArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the campaign.
+    --
+    -- A campaign can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   DELETE PENDING > DELETE IN_PROGRESS
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Campaign' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'campaignArn', 'campaign_campaignArn' - The Amazon Resource Name (ARN) of the campaign.
+--
+-- 'campaignConfig', 'campaign_campaignConfig' - The configuration details of a campaign.
+--
+-- 'creationDateTime', 'campaign_creationDateTime' - The date and time (in Unix format) that the campaign was created.
+--
+-- 'failureReason', 'campaign_failureReason' - If a campaign fails, the reason behind the failure.
+--
+-- 'lastUpdatedDateTime', 'campaign_lastUpdatedDateTime' - The date and time (in Unix format) that the campaign was last updated.
+--
+-- 'latestCampaignUpdate', 'campaign_latestCampaignUpdate' - Undocumented member.
+--
+-- 'minProvisionedTPS', 'campaign_minProvisionedTPS' - Specifies the requested minimum provisioned transactions
+-- (recommendations) per second.
+--
+-- 'name', 'campaign_name' - The name of the campaign.
+--
+-- 'solutionVersionArn', 'campaign_solutionVersionArn' - The Amazon Resource Name (ARN) of a specific version of the solution.
+--
+-- 'status', 'campaign_status' - The status of the campaign.
+--
+-- A campaign can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+newCampaign ::
+  Campaign
+newCampaign =
+  Campaign'
+    { campaignArn = Prelude.Nothing,
+      campaignConfig = Prelude.Nothing,
+      creationDateTime = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      latestCampaignUpdate = Prelude.Nothing,
+      minProvisionedTPS = Prelude.Nothing,
+      name = Prelude.Nothing,
+      solutionVersionArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the campaign.
+campaign_campaignArn :: Lens.Lens' Campaign (Prelude.Maybe Prelude.Text)
+campaign_campaignArn = Lens.lens (\Campaign' {campaignArn} -> campaignArn) (\s@Campaign' {} a -> s {campaignArn = a} :: Campaign)
+
+-- | The configuration details of a campaign.
+campaign_campaignConfig :: Lens.Lens' Campaign (Prelude.Maybe CampaignConfig)
+campaign_campaignConfig = Lens.lens (\Campaign' {campaignConfig} -> campaignConfig) (\s@Campaign' {} a -> s {campaignConfig = a} :: Campaign)
+
+-- | The date and time (in Unix format) that the campaign was created.
+campaign_creationDateTime :: Lens.Lens' Campaign (Prelude.Maybe Prelude.UTCTime)
+campaign_creationDateTime = Lens.lens (\Campaign' {creationDateTime} -> creationDateTime) (\s@Campaign' {} a -> s {creationDateTime = a} :: Campaign) Prelude.. Lens.mapping Data._Time
+
+-- | If a campaign fails, the reason behind the failure.
+campaign_failureReason :: Lens.Lens' Campaign (Prelude.Maybe Prelude.Text)
+campaign_failureReason = Lens.lens (\Campaign' {failureReason} -> failureReason) (\s@Campaign' {} a -> s {failureReason = a} :: Campaign)
+
+-- | The date and time (in Unix format) that the campaign was last updated.
+campaign_lastUpdatedDateTime :: Lens.Lens' Campaign (Prelude.Maybe Prelude.UTCTime)
+campaign_lastUpdatedDateTime = Lens.lens (\Campaign' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@Campaign' {} a -> s {lastUpdatedDateTime = a} :: Campaign) Prelude.. Lens.mapping Data._Time
+
+-- | Undocumented member.
+campaign_latestCampaignUpdate :: Lens.Lens' Campaign (Prelude.Maybe CampaignUpdateSummary)
+campaign_latestCampaignUpdate = Lens.lens (\Campaign' {latestCampaignUpdate} -> latestCampaignUpdate) (\s@Campaign' {} a -> s {latestCampaignUpdate = a} :: Campaign)
+
+-- | Specifies the requested minimum provisioned transactions
+-- (recommendations) per second.
+campaign_minProvisionedTPS :: Lens.Lens' Campaign (Prelude.Maybe Prelude.Natural)
+campaign_minProvisionedTPS = Lens.lens (\Campaign' {minProvisionedTPS} -> minProvisionedTPS) (\s@Campaign' {} a -> s {minProvisionedTPS = a} :: Campaign)
+
+-- | The name of the campaign.
+campaign_name :: Lens.Lens' Campaign (Prelude.Maybe Prelude.Text)
+campaign_name = Lens.lens (\Campaign' {name} -> name) (\s@Campaign' {} a -> s {name = a} :: Campaign)
+
+-- | The Amazon Resource Name (ARN) of a specific version of the solution.
+campaign_solutionVersionArn :: Lens.Lens' Campaign (Prelude.Maybe Prelude.Text)
+campaign_solutionVersionArn = Lens.lens (\Campaign' {solutionVersionArn} -> solutionVersionArn) (\s@Campaign' {} a -> s {solutionVersionArn = a} :: Campaign)
+
+-- | The status of the campaign.
+--
+-- A campaign can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+campaign_status :: Lens.Lens' Campaign (Prelude.Maybe Prelude.Text)
+campaign_status = Lens.lens (\Campaign' {status} -> status) (\s@Campaign' {} a -> s {status = a} :: Campaign)
+
+instance Data.FromJSON Campaign where
+  parseJSON =
+    Data.withObject
+      "Campaign"
+      ( \x ->
+          Campaign'
+            Prelude.<$> (x Data..:? "campaignArn")
+            Prelude.<*> (x Data..:? "campaignConfig")
+            Prelude.<*> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "latestCampaignUpdate")
+            Prelude.<*> (x Data..:? "minProvisionedTPS")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "solutionVersionArn")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable Campaign where
+  hashWithSalt _salt Campaign' {..} =
+    _salt
+      `Prelude.hashWithSalt` campaignArn
+      `Prelude.hashWithSalt` campaignConfig
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` latestCampaignUpdate
+      `Prelude.hashWithSalt` minProvisionedTPS
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` solutionVersionArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData Campaign where
+  rnf Campaign' {..} =
+    Prelude.rnf campaignArn
+      `Prelude.seq` Prelude.rnf campaignConfig
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf latestCampaignUpdate
+      `Prelude.seq` Prelude.rnf minProvisionedTPS
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/CampaignConfig.hs b/gen/Amazonka/Personalize/Types/CampaignConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/CampaignConfig.hs
@@ -0,0 +1,102 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.CampaignConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.CampaignConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The configuration details of a campaign.
+--
+-- /See:/ 'newCampaignConfig' smart constructor.
+data CampaignConfig = CampaignConfig'
+  { -- | Specifies the exploration configuration hyperparameters, including
+    -- @explorationWeight@ and @explorationItemAgeCutOff@, you want to use to
+    -- configure the amount of item exploration Amazon Personalize uses when
+    -- recommending items. Provide @itemExplorationConfig@ data only if your
+    -- solution uses the
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html User-Personalization>
+    -- recipe.
+    itemExplorationConfig :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CampaignConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'itemExplorationConfig', 'campaignConfig_itemExplorationConfig' - Specifies the exploration configuration hyperparameters, including
+-- @explorationWeight@ and @explorationItemAgeCutOff@, you want to use to
+-- configure the amount of item exploration Amazon Personalize uses when
+-- recommending items. Provide @itemExplorationConfig@ data only if your
+-- solution uses the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html User-Personalization>
+-- recipe.
+newCampaignConfig ::
+  CampaignConfig
+newCampaignConfig =
+  CampaignConfig'
+    { itemExplorationConfig =
+        Prelude.Nothing
+    }
+
+-- | Specifies the exploration configuration hyperparameters, including
+-- @explorationWeight@ and @explorationItemAgeCutOff@, you want to use to
+-- configure the amount of item exploration Amazon Personalize uses when
+-- recommending items. Provide @itemExplorationConfig@ data only if your
+-- solution uses the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html User-Personalization>
+-- recipe.
+campaignConfig_itemExplorationConfig :: Lens.Lens' CampaignConfig (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+campaignConfig_itemExplorationConfig = Lens.lens (\CampaignConfig' {itemExplorationConfig} -> itemExplorationConfig) (\s@CampaignConfig' {} a -> s {itemExplorationConfig = a} :: CampaignConfig) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON CampaignConfig where
+  parseJSON =
+    Data.withObject
+      "CampaignConfig"
+      ( \x ->
+          CampaignConfig'
+            Prelude.<$> ( x
+                            Data..:? "itemExplorationConfig"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable CampaignConfig where
+  hashWithSalt _salt CampaignConfig' {..} =
+    _salt `Prelude.hashWithSalt` itemExplorationConfig
+
+instance Prelude.NFData CampaignConfig where
+  rnf CampaignConfig' {..} =
+    Prelude.rnf itemExplorationConfig
+
+instance Data.ToJSON CampaignConfig where
+  toJSON CampaignConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("itemExplorationConfig" Data..=)
+              Prelude.<$> itemExplorationConfig
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/CampaignSummary.hs b/gen/Amazonka/Personalize/Types/CampaignSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/CampaignSummary.hs
@@ -0,0 +1,153 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.CampaignSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.CampaignSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of a campaign. For a complete
+-- listing, call the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeCampaign.html DescribeCampaign>
+-- API.
+--
+-- /See:/ 'newCampaignSummary' smart constructor.
+data CampaignSummary = CampaignSummary'
+  { -- | The Amazon Resource Name (ARN) of the campaign.
+    campaignArn :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) that the campaign was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | If a campaign fails, the reason behind the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) that the campaign was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the campaign.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The status of the campaign.
+    --
+    -- A campaign can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   DELETE PENDING > DELETE IN_PROGRESS
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CampaignSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'campaignArn', 'campaignSummary_campaignArn' - The Amazon Resource Name (ARN) of the campaign.
+--
+-- 'creationDateTime', 'campaignSummary_creationDateTime' - The date and time (in Unix time) that the campaign was created.
+--
+-- 'failureReason', 'campaignSummary_failureReason' - If a campaign fails, the reason behind the failure.
+--
+-- 'lastUpdatedDateTime', 'campaignSummary_lastUpdatedDateTime' - The date and time (in Unix time) that the campaign was last updated.
+--
+-- 'name', 'campaignSummary_name' - The name of the campaign.
+--
+-- 'status', 'campaignSummary_status' - The status of the campaign.
+--
+-- A campaign can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+newCampaignSummary ::
+  CampaignSummary
+newCampaignSummary =
+  CampaignSummary'
+    { campaignArn = Prelude.Nothing,
+      creationDateTime = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the campaign.
+campaignSummary_campaignArn :: Lens.Lens' CampaignSummary (Prelude.Maybe Prelude.Text)
+campaignSummary_campaignArn = Lens.lens (\CampaignSummary' {campaignArn} -> campaignArn) (\s@CampaignSummary' {} a -> s {campaignArn = a} :: CampaignSummary)
+
+-- | The date and time (in Unix time) that the campaign was created.
+campaignSummary_creationDateTime :: Lens.Lens' CampaignSummary (Prelude.Maybe Prelude.UTCTime)
+campaignSummary_creationDateTime = Lens.lens (\CampaignSummary' {creationDateTime} -> creationDateTime) (\s@CampaignSummary' {} a -> s {creationDateTime = a} :: CampaignSummary) Prelude.. Lens.mapping Data._Time
+
+-- | If a campaign fails, the reason behind the failure.
+campaignSummary_failureReason :: Lens.Lens' CampaignSummary (Prelude.Maybe Prelude.Text)
+campaignSummary_failureReason = Lens.lens (\CampaignSummary' {failureReason} -> failureReason) (\s@CampaignSummary' {} a -> s {failureReason = a} :: CampaignSummary)
+
+-- | The date and time (in Unix time) that the campaign was last updated.
+campaignSummary_lastUpdatedDateTime :: Lens.Lens' CampaignSummary (Prelude.Maybe Prelude.UTCTime)
+campaignSummary_lastUpdatedDateTime = Lens.lens (\CampaignSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@CampaignSummary' {} a -> s {lastUpdatedDateTime = a} :: CampaignSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the campaign.
+campaignSummary_name :: Lens.Lens' CampaignSummary (Prelude.Maybe Prelude.Text)
+campaignSummary_name = Lens.lens (\CampaignSummary' {name} -> name) (\s@CampaignSummary' {} a -> s {name = a} :: CampaignSummary)
+
+-- | The status of the campaign.
+--
+-- A campaign can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+campaignSummary_status :: Lens.Lens' CampaignSummary (Prelude.Maybe Prelude.Text)
+campaignSummary_status = Lens.lens (\CampaignSummary' {status} -> status) (\s@CampaignSummary' {} a -> s {status = a} :: CampaignSummary)
+
+instance Data.FromJSON CampaignSummary where
+  parseJSON =
+    Data.withObject
+      "CampaignSummary"
+      ( \x ->
+          CampaignSummary'
+            Prelude.<$> (x Data..:? "campaignArn")
+            Prelude.<*> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable CampaignSummary where
+  hashWithSalt _salt CampaignSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` campaignArn
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData CampaignSummary where
+  rnf CampaignSummary' {..} =
+    Prelude.rnf campaignArn
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/CampaignUpdateSummary.hs b/gen/Amazonka/Personalize/Types/CampaignUpdateSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/CampaignUpdateSummary.hs
@@ -0,0 +1,172 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.CampaignUpdateSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.CampaignUpdateSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.CampaignConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of a campaign update. For a
+-- complete listing, call the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeCampaign.html DescribeCampaign>
+-- API.
+--
+-- /See:/ 'newCampaignUpdateSummary' smart constructor.
+data CampaignUpdateSummary = CampaignUpdateSummary'
+  { campaignConfig :: Prelude.Maybe CampaignConfig,
+    -- | The date and time (in Unix time) that the campaign update was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | If a campaign update fails, the reason behind the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) that the campaign update was last
+    -- updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | Specifies the requested minimum provisioned transactions
+    -- (recommendations) per second that Amazon Personalize will support.
+    minProvisionedTPS :: Prelude.Maybe Prelude.Natural,
+    -- | The Amazon Resource Name (ARN) of the deployed solution version.
+    solutionVersionArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the campaign update.
+    --
+    -- A campaign update can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   DELETE PENDING > DELETE IN_PROGRESS
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CampaignUpdateSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'campaignConfig', 'campaignUpdateSummary_campaignConfig' - Undocumented member.
+--
+-- 'creationDateTime', 'campaignUpdateSummary_creationDateTime' - The date and time (in Unix time) that the campaign update was created.
+--
+-- 'failureReason', 'campaignUpdateSummary_failureReason' - If a campaign update fails, the reason behind the failure.
+--
+-- 'lastUpdatedDateTime', 'campaignUpdateSummary_lastUpdatedDateTime' - The date and time (in Unix time) that the campaign update was last
+-- updated.
+--
+-- 'minProvisionedTPS', 'campaignUpdateSummary_minProvisionedTPS' - Specifies the requested minimum provisioned transactions
+-- (recommendations) per second that Amazon Personalize will support.
+--
+-- 'solutionVersionArn', 'campaignUpdateSummary_solutionVersionArn' - The Amazon Resource Name (ARN) of the deployed solution version.
+--
+-- 'status', 'campaignUpdateSummary_status' - The status of the campaign update.
+--
+-- A campaign update can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+newCampaignUpdateSummary ::
+  CampaignUpdateSummary
+newCampaignUpdateSummary =
+  CampaignUpdateSummary'
+    { campaignConfig =
+        Prelude.Nothing,
+      creationDateTime = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      minProvisionedTPS = Prelude.Nothing,
+      solutionVersionArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | Undocumented member.
+campaignUpdateSummary_campaignConfig :: Lens.Lens' CampaignUpdateSummary (Prelude.Maybe CampaignConfig)
+campaignUpdateSummary_campaignConfig = Lens.lens (\CampaignUpdateSummary' {campaignConfig} -> campaignConfig) (\s@CampaignUpdateSummary' {} a -> s {campaignConfig = a} :: CampaignUpdateSummary)
+
+-- | The date and time (in Unix time) that the campaign update was created.
+campaignUpdateSummary_creationDateTime :: Lens.Lens' CampaignUpdateSummary (Prelude.Maybe Prelude.UTCTime)
+campaignUpdateSummary_creationDateTime = Lens.lens (\CampaignUpdateSummary' {creationDateTime} -> creationDateTime) (\s@CampaignUpdateSummary' {} a -> s {creationDateTime = a} :: CampaignUpdateSummary) Prelude.. Lens.mapping Data._Time
+
+-- | If a campaign update fails, the reason behind the failure.
+campaignUpdateSummary_failureReason :: Lens.Lens' CampaignUpdateSummary (Prelude.Maybe Prelude.Text)
+campaignUpdateSummary_failureReason = Lens.lens (\CampaignUpdateSummary' {failureReason} -> failureReason) (\s@CampaignUpdateSummary' {} a -> s {failureReason = a} :: CampaignUpdateSummary)
+
+-- | The date and time (in Unix time) that the campaign update was last
+-- updated.
+campaignUpdateSummary_lastUpdatedDateTime :: Lens.Lens' CampaignUpdateSummary (Prelude.Maybe Prelude.UTCTime)
+campaignUpdateSummary_lastUpdatedDateTime = Lens.lens (\CampaignUpdateSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@CampaignUpdateSummary' {} a -> s {lastUpdatedDateTime = a} :: CampaignUpdateSummary) Prelude.. Lens.mapping Data._Time
+
+-- | Specifies the requested minimum provisioned transactions
+-- (recommendations) per second that Amazon Personalize will support.
+campaignUpdateSummary_minProvisionedTPS :: Lens.Lens' CampaignUpdateSummary (Prelude.Maybe Prelude.Natural)
+campaignUpdateSummary_minProvisionedTPS = Lens.lens (\CampaignUpdateSummary' {minProvisionedTPS} -> minProvisionedTPS) (\s@CampaignUpdateSummary' {} a -> s {minProvisionedTPS = a} :: CampaignUpdateSummary)
+
+-- | The Amazon Resource Name (ARN) of the deployed solution version.
+campaignUpdateSummary_solutionVersionArn :: Lens.Lens' CampaignUpdateSummary (Prelude.Maybe Prelude.Text)
+campaignUpdateSummary_solutionVersionArn = Lens.lens (\CampaignUpdateSummary' {solutionVersionArn} -> solutionVersionArn) (\s@CampaignUpdateSummary' {} a -> s {solutionVersionArn = a} :: CampaignUpdateSummary)
+
+-- | The status of the campaign update.
+--
+-- A campaign update can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+campaignUpdateSummary_status :: Lens.Lens' CampaignUpdateSummary (Prelude.Maybe Prelude.Text)
+campaignUpdateSummary_status = Lens.lens (\CampaignUpdateSummary' {status} -> status) (\s@CampaignUpdateSummary' {} a -> s {status = a} :: CampaignUpdateSummary)
+
+instance Data.FromJSON CampaignUpdateSummary where
+  parseJSON =
+    Data.withObject
+      "CampaignUpdateSummary"
+      ( \x ->
+          CampaignUpdateSummary'
+            Prelude.<$> (x Data..:? "campaignConfig")
+            Prelude.<*> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "minProvisionedTPS")
+            Prelude.<*> (x Data..:? "solutionVersionArn")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable CampaignUpdateSummary where
+  hashWithSalt _salt CampaignUpdateSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` campaignConfig
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` minProvisionedTPS
+      `Prelude.hashWithSalt` solutionVersionArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData CampaignUpdateSummary where
+  rnf CampaignUpdateSummary' {..} =
+    Prelude.rnf campaignConfig
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf minProvisionedTPS
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/CategoricalHyperParameterRange.hs b/gen/Amazonka/Personalize/Types/CategoricalHyperParameterRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/CategoricalHyperParameterRange.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.CategoricalHyperParameterRange
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.CategoricalHyperParameterRange where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides the name and range of a categorical hyperparameter.
+--
+-- /See:/ 'newCategoricalHyperParameterRange' smart constructor.
+data CategoricalHyperParameterRange = CategoricalHyperParameterRange'
+  { -- | The name of the hyperparameter.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | A list of the categories for the hyperparameter.
+    values :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CategoricalHyperParameterRange' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'name', 'categoricalHyperParameterRange_name' - The name of the hyperparameter.
+--
+-- 'values', 'categoricalHyperParameterRange_values' - A list of the categories for the hyperparameter.
+newCategoricalHyperParameterRange ::
+  CategoricalHyperParameterRange
+newCategoricalHyperParameterRange =
+  CategoricalHyperParameterRange'
+    { name =
+        Prelude.Nothing,
+      values = Prelude.Nothing
+    }
+
+-- | The name of the hyperparameter.
+categoricalHyperParameterRange_name :: Lens.Lens' CategoricalHyperParameterRange (Prelude.Maybe Prelude.Text)
+categoricalHyperParameterRange_name = Lens.lens (\CategoricalHyperParameterRange' {name} -> name) (\s@CategoricalHyperParameterRange' {} a -> s {name = a} :: CategoricalHyperParameterRange)
+
+-- | A list of the categories for the hyperparameter.
+categoricalHyperParameterRange_values :: Lens.Lens' CategoricalHyperParameterRange (Prelude.Maybe [Prelude.Text])
+categoricalHyperParameterRange_values = Lens.lens (\CategoricalHyperParameterRange' {values} -> values) (\s@CategoricalHyperParameterRange' {} a -> s {values = a} :: CategoricalHyperParameterRange) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON CategoricalHyperParameterRange where
+  parseJSON =
+    Data.withObject
+      "CategoricalHyperParameterRange"
+      ( \x ->
+          CategoricalHyperParameterRange'
+            Prelude.<$> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "values" Data..!= Prelude.mempty)
+      )
+
+instance
+  Prelude.Hashable
+    CategoricalHyperParameterRange
+  where
+  hashWithSalt
+    _salt
+    CategoricalHyperParameterRange' {..} =
+      _salt
+        `Prelude.hashWithSalt` name
+        `Prelude.hashWithSalt` values
+
+instance
+  Prelude.NFData
+    CategoricalHyperParameterRange
+  where
+  rnf CategoricalHyperParameterRange' {..} =
+    Prelude.rnf name `Prelude.seq` Prelude.rnf values
+
+instance Data.ToJSON CategoricalHyperParameterRange where
+  toJSON CategoricalHyperParameterRange' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("name" Data..=) Prelude.<$> name,
+            ("values" Data..=) Prelude.<$> values
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/ContinuousHyperParameterRange.hs b/gen/Amazonka/Personalize/Types/ContinuousHyperParameterRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/ContinuousHyperParameterRange.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.ContinuousHyperParameterRange
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.ContinuousHyperParameterRange where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides the name and range of a continuous hyperparameter.
+--
+-- /See:/ 'newContinuousHyperParameterRange' smart constructor.
+data ContinuousHyperParameterRange = ContinuousHyperParameterRange'
+  { -- | The maximum allowable value for the hyperparameter.
+    maxValue :: Prelude.Maybe Prelude.Double,
+    -- | The minimum allowable value for the hyperparameter.
+    minValue :: Prelude.Maybe Prelude.Double,
+    -- | The name of the hyperparameter.
+    name :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ContinuousHyperParameterRange' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxValue', 'continuousHyperParameterRange_maxValue' - The maximum allowable value for the hyperparameter.
+--
+-- 'minValue', 'continuousHyperParameterRange_minValue' - The minimum allowable value for the hyperparameter.
+--
+-- 'name', 'continuousHyperParameterRange_name' - The name of the hyperparameter.
+newContinuousHyperParameterRange ::
+  ContinuousHyperParameterRange
+newContinuousHyperParameterRange =
+  ContinuousHyperParameterRange'
+    { maxValue =
+        Prelude.Nothing,
+      minValue = Prelude.Nothing,
+      name = Prelude.Nothing
+    }
+
+-- | The maximum allowable value for the hyperparameter.
+continuousHyperParameterRange_maxValue :: Lens.Lens' ContinuousHyperParameterRange (Prelude.Maybe Prelude.Double)
+continuousHyperParameterRange_maxValue = Lens.lens (\ContinuousHyperParameterRange' {maxValue} -> maxValue) (\s@ContinuousHyperParameterRange' {} a -> s {maxValue = a} :: ContinuousHyperParameterRange)
+
+-- | The minimum allowable value for the hyperparameter.
+continuousHyperParameterRange_minValue :: Lens.Lens' ContinuousHyperParameterRange (Prelude.Maybe Prelude.Double)
+continuousHyperParameterRange_minValue = Lens.lens (\ContinuousHyperParameterRange' {minValue} -> minValue) (\s@ContinuousHyperParameterRange' {} a -> s {minValue = a} :: ContinuousHyperParameterRange)
+
+-- | The name of the hyperparameter.
+continuousHyperParameterRange_name :: Lens.Lens' ContinuousHyperParameterRange (Prelude.Maybe Prelude.Text)
+continuousHyperParameterRange_name = Lens.lens (\ContinuousHyperParameterRange' {name} -> name) (\s@ContinuousHyperParameterRange' {} a -> s {name = a} :: ContinuousHyperParameterRange)
+
+instance Data.FromJSON ContinuousHyperParameterRange where
+  parseJSON =
+    Data.withObject
+      "ContinuousHyperParameterRange"
+      ( \x ->
+          ContinuousHyperParameterRange'
+            Prelude.<$> (x Data..:? "maxValue")
+            Prelude.<*> (x Data..:? "minValue")
+            Prelude.<*> (x Data..:? "name")
+      )
+
+instance
+  Prelude.Hashable
+    ContinuousHyperParameterRange
+  where
+  hashWithSalt _salt ContinuousHyperParameterRange' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxValue
+      `Prelude.hashWithSalt` minValue
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData ContinuousHyperParameterRange where
+  rnf ContinuousHyperParameterRange' {..} =
+    Prelude.rnf maxValue
+      `Prelude.seq` Prelude.rnf minValue
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON ContinuousHyperParameterRange where
+  toJSON ContinuousHyperParameterRange' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxValue" Data..=) Prelude.<$> maxValue,
+            ("minValue" Data..=) Prelude.<$> minValue,
+            ("name" Data..=) Prelude.<$> name
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/DataSource.hs b/gen/Amazonka/Personalize/Types/DataSource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DataSource.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DataSource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DataSource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the data source that contains the data to upload to a dataset.
+--
+-- /See:/ 'newDataSource' smart constructor.
+data DataSource = DataSource'
+  { -- | The path to the Amazon S3 bucket where the data that you want to upload
+    -- to your dataset is stored. For example:
+    --
+    -- @s3:\/\/bucket-name\/folder-name\/@
+    dataLocation :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DataSource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'dataLocation', 'dataSource_dataLocation' - The path to the Amazon S3 bucket where the data that you want to upload
+-- to your dataset is stored. For example:
+--
+-- @s3:\/\/bucket-name\/folder-name\/@
+newDataSource ::
+  DataSource
+newDataSource =
+  DataSource' {dataLocation = Prelude.Nothing}
+
+-- | The path to the Amazon S3 bucket where the data that you want to upload
+-- to your dataset is stored. For example:
+--
+-- @s3:\/\/bucket-name\/folder-name\/@
+dataSource_dataLocation :: Lens.Lens' DataSource (Prelude.Maybe Prelude.Text)
+dataSource_dataLocation = Lens.lens (\DataSource' {dataLocation} -> dataLocation) (\s@DataSource' {} a -> s {dataLocation = a} :: DataSource)
+
+instance Data.FromJSON DataSource where
+  parseJSON =
+    Data.withObject
+      "DataSource"
+      ( \x ->
+          DataSource' Prelude.<$> (x Data..:? "dataLocation")
+      )
+
+instance Prelude.Hashable DataSource where
+  hashWithSalt _salt DataSource' {..} =
+    _salt `Prelude.hashWithSalt` dataLocation
+
+instance Prelude.NFData DataSource where
+  rnf DataSource' {..} = Prelude.rnf dataLocation
+
+instance Data.ToJSON DataSource where
+  toJSON DataSource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("dataLocation" Data..=) Prelude.<$> dataLocation]
+      )
diff --git a/gen/Amazonka/Personalize/Types/Dataset.hs b/gen/Amazonka/Personalize/Types/Dataset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/Dataset.hs
@@ -0,0 +1,195 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.Dataset
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.Dataset where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides metadata for a dataset.
+--
+-- /See:/ 'newDataset' smart constructor.
+data Dataset = Dataset'
+  { -- | The creation date and time (in Unix time) of the dataset.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the dataset that you want metadata
+    -- for.
+    datasetArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the dataset group.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | One of the following values:
+    --
+    -- -   Interactions
+    --
+    -- -   Items
+    --
+    -- -   Users
+    datasetType :: Prelude.Maybe Prelude.Text,
+    -- | A time stamp that shows when the dataset was updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the dataset.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the associated schema.
+    schemaArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the dataset.
+    --
+    -- A dataset can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   DELETE PENDING > DELETE IN_PROGRESS
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Dataset' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'dataset_creationDateTime' - The creation date and time (in Unix time) of the dataset.
+--
+-- 'datasetArn', 'dataset_datasetArn' - The Amazon Resource Name (ARN) of the dataset that you want metadata
+-- for.
+--
+-- 'datasetGroupArn', 'dataset_datasetGroupArn' - The Amazon Resource Name (ARN) of the dataset group.
+--
+-- 'datasetType', 'dataset_datasetType' - One of the following values:
+--
+-- -   Interactions
+--
+-- -   Items
+--
+-- -   Users
+--
+-- 'lastUpdatedDateTime', 'dataset_lastUpdatedDateTime' - A time stamp that shows when the dataset was updated.
+--
+-- 'name', 'dataset_name' - The name of the dataset.
+--
+-- 'schemaArn', 'dataset_schemaArn' - The ARN of the associated schema.
+--
+-- 'status', 'dataset_status' - The status of the dataset.
+--
+-- A dataset can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+newDataset ::
+  Dataset
+newDataset =
+  Dataset'
+    { creationDateTime = Prelude.Nothing,
+      datasetArn = Prelude.Nothing,
+      datasetGroupArn = Prelude.Nothing,
+      datasetType = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      schemaArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The creation date and time (in Unix time) of the dataset.
+dataset_creationDateTime :: Lens.Lens' Dataset (Prelude.Maybe Prelude.UTCTime)
+dataset_creationDateTime = Lens.lens (\Dataset' {creationDateTime} -> creationDateTime) (\s@Dataset' {} a -> s {creationDateTime = a} :: Dataset) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the dataset that you want metadata
+-- for.
+dataset_datasetArn :: Lens.Lens' Dataset (Prelude.Maybe Prelude.Text)
+dataset_datasetArn = Lens.lens (\Dataset' {datasetArn} -> datasetArn) (\s@Dataset' {} a -> s {datasetArn = a} :: Dataset)
+
+-- | The Amazon Resource Name (ARN) of the dataset group.
+dataset_datasetGroupArn :: Lens.Lens' Dataset (Prelude.Maybe Prelude.Text)
+dataset_datasetGroupArn = Lens.lens (\Dataset' {datasetGroupArn} -> datasetGroupArn) (\s@Dataset' {} a -> s {datasetGroupArn = a} :: Dataset)
+
+-- | One of the following values:
+--
+-- -   Interactions
+--
+-- -   Items
+--
+-- -   Users
+dataset_datasetType :: Lens.Lens' Dataset (Prelude.Maybe Prelude.Text)
+dataset_datasetType = Lens.lens (\Dataset' {datasetType} -> datasetType) (\s@Dataset' {} a -> s {datasetType = a} :: Dataset)
+
+-- | A time stamp that shows when the dataset was updated.
+dataset_lastUpdatedDateTime :: Lens.Lens' Dataset (Prelude.Maybe Prelude.UTCTime)
+dataset_lastUpdatedDateTime = Lens.lens (\Dataset' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@Dataset' {} a -> s {lastUpdatedDateTime = a} :: Dataset) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the dataset.
+dataset_name :: Lens.Lens' Dataset (Prelude.Maybe Prelude.Text)
+dataset_name = Lens.lens (\Dataset' {name} -> name) (\s@Dataset' {} a -> s {name = a} :: Dataset)
+
+-- | The ARN of the associated schema.
+dataset_schemaArn :: Lens.Lens' Dataset (Prelude.Maybe Prelude.Text)
+dataset_schemaArn = Lens.lens (\Dataset' {schemaArn} -> schemaArn) (\s@Dataset' {} a -> s {schemaArn = a} :: Dataset)
+
+-- | The status of the dataset.
+--
+-- A dataset can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+dataset_status :: Lens.Lens' Dataset (Prelude.Maybe Prelude.Text)
+dataset_status = Lens.lens (\Dataset' {status} -> status) (\s@Dataset' {} a -> s {status = a} :: Dataset)
+
+instance Data.FromJSON Dataset where
+  parseJSON =
+    Data.withObject
+      "Dataset"
+      ( \x ->
+          Dataset'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetArn")
+            Prelude.<*> (x Data..:? "datasetGroupArn")
+            Prelude.<*> (x Data..:? "datasetType")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "schemaArn")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable Dataset where
+  hashWithSalt _salt Dataset' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetArn
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` datasetType
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` schemaArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData Dataset where
+  rnf Dataset' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetArn
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf datasetType
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf schemaArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/DatasetExportJob.hs b/gen/Amazonka/Personalize/Types/DatasetExportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DatasetExportJob.hs
@@ -0,0 +1,228 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DatasetExportJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DatasetExportJob where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.DatasetExportJobOutput
+import Amazonka.Personalize.Types.IngestionMode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a job that exports a dataset to an Amazon S3 bucket. For more
+-- information, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetExportJob.html CreateDatasetExportJob>.
+--
+-- A dataset export job can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- /See:/ 'newDatasetExportJob' smart constructor.
+data DatasetExportJob = DatasetExportJob'
+  { -- | The creation date and time (in Unix time) of the dataset export job.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the dataset to export.
+    datasetArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the dataset export job.
+    datasetExportJobArn :: Prelude.Maybe Prelude.Text,
+    -- | If a dataset export job fails, provides the reason why.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The data to export, based on how you imported the data. You can choose
+    -- to export @BULK@ data that you imported using a dataset import job,
+    -- @PUT@ data that you imported incrementally (using the console,
+    -- PutEvents, PutUsers and PutItems operations), or @ALL@ for both types.
+    -- The default value is @PUT@.
+    ingestionMode :: Prelude.Maybe IngestionMode,
+    -- | The name of the export job.
+    jobName :: Prelude.Maybe Prelude.Text,
+    -- | The path to the Amazon S3 bucket where the job\'s output is stored. For
+    -- example:
+    --
+    -- @s3:\/\/bucket-name\/folder-name\/@
+    jobOutput :: Prelude.Maybe DatasetExportJobOutput,
+    -- | The date and time (in Unix time) the status of the dataset export job
+    -- was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the IAM service role that has
+    -- permissions to add data to your output Amazon S3 bucket.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the dataset export job.
+    --
+    -- A dataset export job can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetExportJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'datasetExportJob_creationDateTime' - The creation date and time (in Unix time) of the dataset export job.
+--
+-- 'datasetArn', 'datasetExportJob_datasetArn' - The Amazon Resource Name (ARN) of the dataset to export.
+--
+-- 'datasetExportJobArn', 'datasetExportJob_datasetExportJobArn' - The Amazon Resource Name (ARN) of the dataset export job.
+--
+-- 'failureReason', 'datasetExportJob_failureReason' - If a dataset export job fails, provides the reason why.
+--
+-- 'ingestionMode', 'datasetExportJob_ingestionMode' - The data to export, based on how you imported the data. You can choose
+-- to export @BULK@ data that you imported using a dataset import job,
+-- @PUT@ data that you imported incrementally (using the console,
+-- PutEvents, PutUsers and PutItems operations), or @ALL@ for both types.
+-- The default value is @PUT@.
+--
+-- 'jobName', 'datasetExportJob_jobName' - The name of the export job.
+--
+-- 'jobOutput', 'datasetExportJob_jobOutput' - The path to the Amazon S3 bucket where the job\'s output is stored. For
+-- example:
+--
+-- @s3:\/\/bucket-name\/folder-name\/@
+--
+-- 'lastUpdatedDateTime', 'datasetExportJob_lastUpdatedDateTime' - The date and time (in Unix time) the status of the dataset export job
+-- was last updated.
+--
+-- 'roleArn', 'datasetExportJob_roleArn' - The Amazon Resource Name (ARN) of the IAM service role that has
+-- permissions to add data to your output Amazon S3 bucket.
+--
+-- 'status', 'datasetExportJob_status' - The status of the dataset export job.
+--
+-- A dataset export job can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+newDatasetExportJob ::
+  DatasetExportJob
+newDatasetExportJob =
+  DatasetExportJob'
+    { creationDateTime =
+        Prelude.Nothing,
+      datasetArn = Prelude.Nothing,
+      datasetExportJobArn = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      ingestionMode = Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      jobOutput = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      roleArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The creation date and time (in Unix time) of the dataset export job.
+datasetExportJob_creationDateTime :: Lens.Lens' DatasetExportJob (Prelude.Maybe Prelude.UTCTime)
+datasetExportJob_creationDateTime = Lens.lens (\DatasetExportJob' {creationDateTime} -> creationDateTime) (\s@DatasetExportJob' {} a -> s {creationDateTime = a} :: DatasetExportJob) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the dataset to export.
+datasetExportJob_datasetArn :: Lens.Lens' DatasetExportJob (Prelude.Maybe Prelude.Text)
+datasetExportJob_datasetArn = Lens.lens (\DatasetExportJob' {datasetArn} -> datasetArn) (\s@DatasetExportJob' {} a -> s {datasetArn = a} :: DatasetExportJob)
+
+-- | The Amazon Resource Name (ARN) of the dataset export job.
+datasetExportJob_datasetExportJobArn :: Lens.Lens' DatasetExportJob (Prelude.Maybe Prelude.Text)
+datasetExportJob_datasetExportJobArn = Lens.lens (\DatasetExportJob' {datasetExportJobArn} -> datasetExportJobArn) (\s@DatasetExportJob' {} a -> s {datasetExportJobArn = a} :: DatasetExportJob)
+
+-- | If a dataset export job fails, provides the reason why.
+datasetExportJob_failureReason :: Lens.Lens' DatasetExportJob (Prelude.Maybe Prelude.Text)
+datasetExportJob_failureReason = Lens.lens (\DatasetExportJob' {failureReason} -> failureReason) (\s@DatasetExportJob' {} a -> s {failureReason = a} :: DatasetExportJob)
+
+-- | The data to export, based on how you imported the data. You can choose
+-- to export @BULK@ data that you imported using a dataset import job,
+-- @PUT@ data that you imported incrementally (using the console,
+-- PutEvents, PutUsers and PutItems operations), or @ALL@ for both types.
+-- The default value is @PUT@.
+datasetExportJob_ingestionMode :: Lens.Lens' DatasetExportJob (Prelude.Maybe IngestionMode)
+datasetExportJob_ingestionMode = Lens.lens (\DatasetExportJob' {ingestionMode} -> ingestionMode) (\s@DatasetExportJob' {} a -> s {ingestionMode = a} :: DatasetExportJob)
+
+-- | The name of the export job.
+datasetExportJob_jobName :: Lens.Lens' DatasetExportJob (Prelude.Maybe Prelude.Text)
+datasetExportJob_jobName = Lens.lens (\DatasetExportJob' {jobName} -> jobName) (\s@DatasetExportJob' {} a -> s {jobName = a} :: DatasetExportJob)
+
+-- | The path to the Amazon S3 bucket where the job\'s output is stored. For
+-- example:
+--
+-- @s3:\/\/bucket-name\/folder-name\/@
+datasetExportJob_jobOutput :: Lens.Lens' DatasetExportJob (Prelude.Maybe DatasetExportJobOutput)
+datasetExportJob_jobOutput = Lens.lens (\DatasetExportJob' {jobOutput} -> jobOutput) (\s@DatasetExportJob' {} a -> s {jobOutput = a} :: DatasetExportJob)
+
+-- | The date and time (in Unix time) the status of the dataset export job
+-- was last updated.
+datasetExportJob_lastUpdatedDateTime :: Lens.Lens' DatasetExportJob (Prelude.Maybe Prelude.UTCTime)
+datasetExportJob_lastUpdatedDateTime = Lens.lens (\DatasetExportJob' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@DatasetExportJob' {} a -> s {lastUpdatedDateTime = a} :: DatasetExportJob) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the IAM service role that has
+-- permissions to add data to your output Amazon S3 bucket.
+datasetExportJob_roleArn :: Lens.Lens' DatasetExportJob (Prelude.Maybe Prelude.Text)
+datasetExportJob_roleArn = Lens.lens (\DatasetExportJob' {roleArn} -> roleArn) (\s@DatasetExportJob' {} a -> s {roleArn = a} :: DatasetExportJob)
+
+-- | The status of the dataset export job.
+--
+-- A dataset export job can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+datasetExportJob_status :: Lens.Lens' DatasetExportJob (Prelude.Maybe Prelude.Text)
+datasetExportJob_status = Lens.lens (\DatasetExportJob' {status} -> status) (\s@DatasetExportJob' {} a -> s {status = a} :: DatasetExportJob)
+
+instance Data.FromJSON DatasetExportJob where
+  parseJSON =
+    Data.withObject
+      "DatasetExportJob"
+      ( \x ->
+          DatasetExportJob'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetArn")
+            Prelude.<*> (x Data..:? "datasetExportJobArn")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "ingestionMode")
+            Prelude.<*> (x Data..:? "jobName")
+            Prelude.<*> (x Data..:? "jobOutput")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "roleArn")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable DatasetExportJob where
+  hashWithSalt _salt DatasetExportJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetArn
+      `Prelude.hashWithSalt` datasetExportJobArn
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` ingestionMode
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` jobOutput
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData DatasetExportJob where
+  rnf DatasetExportJob' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetArn
+      `Prelude.seq` Prelude.rnf datasetExportJobArn
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf ingestionMode
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf jobOutput
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/DatasetExportJobOutput.hs b/gen/Amazonka/Personalize/Types/DatasetExportJobOutput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DatasetExportJobOutput.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DatasetExportJobOutput
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DatasetExportJobOutput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.S3DataConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | The output configuration parameters of a dataset export job.
+--
+-- /See:/ 'newDatasetExportJobOutput' smart constructor.
+data DatasetExportJobOutput = DatasetExportJobOutput'
+  { s3DataDestination :: S3DataConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetExportJobOutput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 's3DataDestination', 'datasetExportJobOutput_s3DataDestination' - Undocumented member.
+newDatasetExportJobOutput ::
+  -- | 's3DataDestination'
+  S3DataConfig ->
+  DatasetExportJobOutput
+newDatasetExportJobOutput pS3DataDestination_ =
+  DatasetExportJobOutput'
+    { s3DataDestination =
+        pS3DataDestination_
+    }
+
+-- | Undocumented member.
+datasetExportJobOutput_s3DataDestination :: Lens.Lens' DatasetExportJobOutput S3DataConfig
+datasetExportJobOutput_s3DataDestination = Lens.lens (\DatasetExportJobOutput' {s3DataDestination} -> s3DataDestination) (\s@DatasetExportJobOutput' {} a -> s {s3DataDestination = a} :: DatasetExportJobOutput)
+
+instance Data.FromJSON DatasetExportJobOutput where
+  parseJSON =
+    Data.withObject
+      "DatasetExportJobOutput"
+      ( \x ->
+          DatasetExportJobOutput'
+            Prelude.<$> (x Data..: "s3DataDestination")
+      )
+
+instance Prelude.Hashable DatasetExportJobOutput where
+  hashWithSalt _salt DatasetExportJobOutput' {..} =
+    _salt `Prelude.hashWithSalt` s3DataDestination
+
+instance Prelude.NFData DatasetExportJobOutput where
+  rnf DatasetExportJobOutput' {..} =
+    Prelude.rnf s3DataDestination
+
+instance Data.ToJSON DatasetExportJobOutput where
+  toJSON DatasetExportJobOutput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("s3DataDestination" Data..= s3DataDestination)
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/DatasetExportJobSummary.hs b/gen/Amazonka/Personalize/Types/DatasetExportJobSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DatasetExportJobSummary.hs
@@ -0,0 +1,154 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DatasetExportJobSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DatasetExportJobSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of a dataset export job. For a
+-- complete listing, call the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeDatasetExportJob.html DescribeDatasetExportJob>
+-- API.
+--
+-- /See:/ 'newDatasetExportJobSummary' smart constructor.
+data DatasetExportJobSummary = DatasetExportJobSummary'
+  { -- | The date and time (in Unix time) that the dataset export job was
+    -- created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the dataset export job.
+    datasetExportJobArn :: Prelude.Maybe Prelude.Text,
+    -- | If a dataset export job fails, the reason behind the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The name of the dataset export job.
+    jobName :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) that the dataset export job status was
+    -- last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The status of the dataset export job.
+    --
+    -- A dataset export job can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetExportJobSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'datasetExportJobSummary_creationDateTime' - The date and time (in Unix time) that the dataset export job was
+-- created.
+--
+-- 'datasetExportJobArn', 'datasetExportJobSummary_datasetExportJobArn' - The Amazon Resource Name (ARN) of the dataset export job.
+--
+-- 'failureReason', 'datasetExportJobSummary_failureReason' - If a dataset export job fails, the reason behind the failure.
+--
+-- 'jobName', 'datasetExportJobSummary_jobName' - The name of the dataset export job.
+--
+-- 'lastUpdatedDateTime', 'datasetExportJobSummary_lastUpdatedDateTime' - The date and time (in Unix time) that the dataset export job status was
+-- last updated.
+--
+-- 'status', 'datasetExportJobSummary_status' - The status of the dataset export job.
+--
+-- A dataset export job can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+newDatasetExportJobSummary ::
+  DatasetExportJobSummary
+newDatasetExportJobSummary =
+  DatasetExportJobSummary'
+    { creationDateTime =
+        Prelude.Nothing,
+      datasetExportJobArn = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix time) that the dataset export job was
+-- created.
+datasetExportJobSummary_creationDateTime :: Lens.Lens' DatasetExportJobSummary (Prelude.Maybe Prelude.UTCTime)
+datasetExportJobSummary_creationDateTime = Lens.lens (\DatasetExportJobSummary' {creationDateTime} -> creationDateTime) (\s@DatasetExportJobSummary' {} a -> s {creationDateTime = a} :: DatasetExportJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the dataset export job.
+datasetExportJobSummary_datasetExportJobArn :: Lens.Lens' DatasetExportJobSummary (Prelude.Maybe Prelude.Text)
+datasetExportJobSummary_datasetExportJobArn = Lens.lens (\DatasetExportJobSummary' {datasetExportJobArn} -> datasetExportJobArn) (\s@DatasetExportJobSummary' {} a -> s {datasetExportJobArn = a} :: DatasetExportJobSummary)
+
+-- | If a dataset export job fails, the reason behind the failure.
+datasetExportJobSummary_failureReason :: Lens.Lens' DatasetExportJobSummary (Prelude.Maybe Prelude.Text)
+datasetExportJobSummary_failureReason = Lens.lens (\DatasetExportJobSummary' {failureReason} -> failureReason) (\s@DatasetExportJobSummary' {} a -> s {failureReason = a} :: DatasetExportJobSummary)
+
+-- | The name of the dataset export job.
+datasetExportJobSummary_jobName :: Lens.Lens' DatasetExportJobSummary (Prelude.Maybe Prelude.Text)
+datasetExportJobSummary_jobName = Lens.lens (\DatasetExportJobSummary' {jobName} -> jobName) (\s@DatasetExportJobSummary' {} a -> s {jobName = a} :: DatasetExportJobSummary)
+
+-- | The date and time (in Unix time) that the dataset export job status was
+-- last updated.
+datasetExportJobSummary_lastUpdatedDateTime :: Lens.Lens' DatasetExportJobSummary (Prelude.Maybe Prelude.UTCTime)
+datasetExportJobSummary_lastUpdatedDateTime = Lens.lens (\DatasetExportJobSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@DatasetExportJobSummary' {} a -> s {lastUpdatedDateTime = a} :: DatasetExportJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The status of the dataset export job.
+--
+-- A dataset export job can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+datasetExportJobSummary_status :: Lens.Lens' DatasetExportJobSummary (Prelude.Maybe Prelude.Text)
+datasetExportJobSummary_status = Lens.lens (\DatasetExportJobSummary' {status} -> status) (\s@DatasetExportJobSummary' {} a -> s {status = a} :: DatasetExportJobSummary)
+
+instance Data.FromJSON DatasetExportJobSummary where
+  parseJSON =
+    Data.withObject
+      "DatasetExportJobSummary"
+      ( \x ->
+          DatasetExportJobSummary'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetExportJobArn")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "jobName")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable DatasetExportJobSummary where
+  hashWithSalt _salt DatasetExportJobSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetExportJobArn
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData DatasetExportJobSummary where
+  rnf DatasetExportJobSummary' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetExportJobArn
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/DatasetGroup.hs b/gen/Amazonka/Personalize/Types/DatasetGroup.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DatasetGroup.hs
@@ -0,0 +1,203 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DatasetGroup
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DatasetGroup where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.Domain
+import qualified Amazonka.Prelude as Prelude
+
+-- | A dataset group is a collection of related datasets (Interactions, User,
+-- and Item). You create a dataset group by calling
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetGroup.html CreateDatasetGroup>.
+-- You then create a dataset and add it to a dataset group by calling
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDataset.html CreateDataset>.
+-- The dataset group is used to create and train a solution by calling
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolution.html CreateSolution>.
+-- A dataset group can contain only one of each type of dataset.
+--
+-- You can specify an Key Management Service (KMS) key to encrypt the
+-- datasets in the group.
+--
+-- /See:/ 'newDatasetGroup' smart constructor.
+data DatasetGroup = DatasetGroup'
+  { -- | The creation date and time (in Unix time) of the dataset group.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the dataset group.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The domain of a Domain dataset group.
+    domain :: Prelude.Maybe Domain,
+    -- | If creating a dataset group fails, provides the reason why.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the Key Management Service (KMS) key
+    -- used to encrypt the datasets.
+    kmsKeyArn :: Prelude.Maybe Prelude.Text,
+    -- | The last update date and time (in Unix time) of the dataset group.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the dataset group.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the IAM role that has permissions to create the dataset
+    -- group.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | The current status of the dataset group.
+    --
+    -- A dataset group can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   DELETE PENDING
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetGroup' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'datasetGroup_creationDateTime' - The creation date and time (in Unix time) of the dataset group.
+--
+-- 'datasetGroupArn', 'datasetGroup_datasetGroupArn' - The Amazon Resource Name (ARN) of the dataset group.
+--
+-- 'domain', 'datasetGroup_domain' - The domain of a Domain dataset group.
+--
+-- 'failureReason', 'datasetGroup_failureReason' - If creating a dataset group fails, provides the reason why.
+--
+-- 'kmsKeyArn', 'datasetGroup_kmsKeyArn' - The Amazon Resource Name (ARN) of the Key Management Service (KMS) key
+-- used to encrypt the datasets.
+--
+-- 'lastUpdatedDateTime', 'datasetGroup_lastUpdatedDateTime' - The last update date and time (in Unix time) of the dataset group.
+--
+-- 'name', 'datasetGroup_name' - The name of the dataset group.
+--
+-- 'roleArn', 'datasetGroup_roleArn' - The ARN of the IAM role that has permissions to create the dataset
+-- group.
+--
+-- 'status', 'datasetGroup_status' - The current status of the dataset group.
+--
+-- A dataset group can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING
+newDatasetGroup ::
+  DatasetGroup
+newDatasetGroup =
+  DatasetGroup'
+    { creationDateTime = Prelude.Nothing,
+      datasetGroupArn = Prelude.Nothing,
+      domain = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      kmsKeyArn = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      roleArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The creation date and time (in Unix time) of the dataset group.
+datasetGroup_creationDateTime :: Lens.Lens' DatasetGroup (Prelude.Maybe Prelude.UTCTime)
+datasetGroup_creationDateTime = Lens.lens (\DatasetGroup' {creationDateTime} -> creationDateTime) (\s@DatasetGroup' {} a -> s {creationDateTime = a} :: DatasetGroup) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the dataset group.
+datasetGroup_datasetGroupArn :: Lens.Lens' DatasetGroup (Prelude.Maybe Prelude.Text)
+datasetGroup_datasetGroupArn = Lens.lens (\DatasetGroup' {datasetGroupArn} -> datasetGroupArn) (\s@DatasetGroup' {} a -> s {datasetGroupArn = a} :: DatasetGroup)
+
+-- | The domain of a Domain dataset group.
+datasetGroup_domain :: Lens.Lens' DatasetGroup (Prelude.Maybe Domain)
+datasetGroup_domain = Lens.lens (\DatasetGroup' {domain} -> domain) (\s@DatasetGroup' {} a -> s {domain = a} :: DatasetGroup)
+
+-- | If creating a dataset group fails, provides the reason why.
+datasetGroup_failureReason :: Lens.Lens' DatasetGroup (Prelude.Maybe Prelude.Text)
+datasetGroup_failureReason = Lens.lens (\DatasetGroup' {failureReason} -> failureReason) (\s@DatasetGroup' {} a -> s {failureReason = a} :: DatasetGroup)
+
+-- | The Amazon Resource Name (ARN) of the Key Management Service (KMS) key
+-- used to encrypt the datasets.
+datasetGroup_kmsKeyArn :: Lens.Lens' DatasetGroup (Prelude.Maybe Prelude.Text)
+datasetGroup_kmsKeyArn = Lens.lens (\DatasetGroup' {kmsKeyArn} -> kmsKeyArn) (\s@DatasetGroup' {} a -> s {kmsKeyArn = a} :: DatasetGroup)
+
+-- | The last update date and time (in Unix time) of the dataset group.
+datasetGroup_lastUpdatedDateTime :: Lens.Lens' DatasetGroup (Prelude.Maybe Prelude.UTCTime)
+datasetGroup_lastUpdatedDateTime = Lens.lens (\DatasetGroup' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@DatasetGroup' {} a -> s {lastUpdatedDateTime = a} :: DatasetGroup) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the dataset group.
+datasetGroup_name :: Lens.Lens' DatasetGroup (Prelude.Maybe Prelude.Text)
+datasetGroup_name = Lens.lens (\DatasetGroup' {name} -> name) (\s@DatasetGroup' {} a -> s {name = a} :: DatasetGroup)
+
+-- | The ARN of the IAM role that has permissions to create the dataset
+-- group.
+datasetGroup_roleArn :: Lens.Lens' DatasetGroup (Prelude.Maybe Prelude.Text)
+datasetGroup_roleArn = Lens.lens (\DatasetGroup' {roleArn} -> roleArn) (\s@DatasetGroup' {} a -> s {roleArn = a} :: DatasetGroup)
+
+-- | The current status of the dataset group.
+--
+-- A dataset group can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING
+datasetGroup_status :: Lens.Lens' DatasetGroup (Prelude.Maybe Prelude.Text)
+datasetGroup_status = Lens.lens (\DatasetGroup' {status} -> status) (\s@DatasetGroup' {} a -> s {status = a} :: DatasetGroup)
+
+instance Data.FromJSON DatasetGroup where
+  parseJSON =
+    Data.withObject
+      "DatasetGroup"
+      ( \x ->
+          DatasetGroup'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetGroupArn")
+            Prelude.<*> (x Data..:? "domain")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "kmsKeyArn")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "roleArn")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable DatasetGroup where
+  hashWithSalt _salt DatasetGroup' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` domain
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` kmsKeyArn
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData DatasetGroup where
+  rnf DatasetGroup' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf kmsKeyArn
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/DatasetGroupSummary.hs b/gen/Amazonka/Personalize/Types/DatasetGroupSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DatasetGroupSummary.hs
@@ -0,0 +1,170 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DatasetGroupSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DatasetGroupSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.Domain
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of a dataset group. For a complete
+-- listing, call the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeDatasetGroup.html DescribeDatasetGroup>
+-- API.
+--
+-- /See:/ 'newDatasetGroupSummary' smart constructor.
+data DatasetGroupSummary = DatasetGroupSummary'
+  { -- | The date and time (in Unix time) that the dataset group was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the dataset group.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The domain of a Domain dataset group.
+    domain :: Prelude.Maybe Domain,
+    -- | If creating a dataset group fails, the reason behind the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) that the dataset group was last
+    -- updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the dataset group.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The status of the dataset group.
+    --
+    -- A dataset group can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   DELETE PENDING
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetGroupSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'datasetGroupSummary_creationDateTime' - The date and time (in Unix time) that the dataset group was created.
+--
+-- 'datasetGroupArn', 'datasetGroupSummary_datasetGroupArn' - The Amazon Resource Name (ARN) of the dataset group.
+--
+-- 'domain', 'datasetGroupSummary_domain' - The domain of a Domain dataset group.
+--
+-- 'failureReason', 'datasetGroupSummary_failureReason' - If creating a dataset group fails, the reason behind the failure.
+--
+-- 'lastUpdatedDateTime', 'datasetGroupSummary_lastUpdatedDateTime' - The date and time (in Unix time) that the dataset group was last
+-- updated.
+--
+-- 'name', 'datasetGroupSummary_name' - The name of the dataset group.
+--
+-- 'status', 'datasetGroupSummary_status' - The status of the dataset group.
+--
+-- A dataset group can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING
+newDatasetGroupSummary ::
+  DatasetGroupSummary
+newDatasetGroupSummary =
+  DatasetGroupSummary'
+    { creationDateTime =
+        Prelude.Nothing,
+      datasetGroupArn = Prelude.Nothing,
+      domain = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix time) that the dataset group was created.
+datasetGroupSummary_creationDateTime :: Lens.Lens' DatasetGroupSummary (Prelude.Maybe Prelude.UTCTime)
+datasetGroupSummary_creationDateTime = Lens.lens (\DatasetGroupSummary' {creationDateTime} -> creationDateTime) (\s@DatasetGroupSummary' {} a -> s {creationDateTime = a} :: DatasetGroupSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the dataset group.
+datasetGroupSummary_datasetGroupArn :: Lens.Lens' DatasetGroupSummary (Prelude.Maybe Prelude.Text)
+datasetGroupSummary_datasetGroupArn = Lens.lens (\DatasetGroupSummary' {datasetGroupArn} -> datasetGroupArn) (\s@DatasetGroupSummary' {} a -> s {datasetGroupArn = a} :: DatasetGroupSummary)
+
+-- | The domain of a Domain dataset group.
+datasetGroupSummary_domain :: Lens.Lens' DatasetGroupSummary (Prelude.Maybe Domain)
+datasetGroupSummary_domain = Lens.lens (\DatasetGroupSummary' {domain} -> domain) (\s@DatasetGroupSummary' {} a -> s {domain = a} :: DatasetGroupSummary)
+
+-- | If creating a dataset group fails, the reason behind the failure.
+datasetGroupSummary_failureReason :: Lens.Lens' DatasetGroupSummary (Prelude.Maybe Prelude.Text)
+datasetGroupSummary_failureReason = Lens.lens (\DatasetGroupSummary' {failureReason} -> failureReason) (\s@DatasetGroupSummary' {} a -> s {failureReason = a} :: DatasetGroupSummary)
+
+-- | The date and time (in Unix time) that the dataset group was last
+-- updated.
+datasetGroupSummary_lastUpdatedDateTime :: Lens.Lens' DatasetGroupSummary (Prelude.Maybe Prelude.UTCTime)
+datasetGroupSummary_lastUpdatedDateTime = Lens.lens (\DatasetGroupSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@DatasetGroupSummary' {} a -> s {lastUpdatedDateTime = a} :: DatasetGroupSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the dataset group.
+datasetGroupSummary_name :: Lens.Lens' DatasetGroupSummary (Prelude.Maybe Prelude.Text)
+datasetGroupSummary_name = Lens.lens (\DatasetGroupSummary' {name} -> name) (\s@DatasetGroupSummary' {} a -> s {name = a} :: DatasetGroupSummary)
+
+-- | The status of the dataset group.
+--
+-- A dataset group can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING
+datasetGroupSummary_status :: Lens.Lens' DatasetGroupSummary (Prelude.Maybe Prelude.Text)
+datasetGroupSummary_status = Lens.lens (\DatasetGroupSummary' {status} -> status) (\s@DatasetGroupSummary' {} a -> s {status = a} :: DatasetGroupSummary)
+
+instance Data.FromJSON DatasetGroupSummary where
+  parseJSON =
+    Data.withObject
+      "DatasetGroupSummary"
+      ( \x ->
+          DatasetGroupSummary'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetGroupArn")
+            Prelude.<*> (x Data..:? "domain")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable DatasetGroupSummary where
+  hashWithSalt _salt DatasetGroupSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` domain
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData DatasetGroupSummary where
+  rnf DatasetGroupSummary' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/DatasetImportJob.hs b/gen/Amazonka/Personalize/Types/DatasetImportJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DatasetImportJob.hs
@@ -0,0 +1,219 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DatasetImportJob
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DatasetImportJob where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.DataSource
+import Amazonka.Personalize.Types.ImportMode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a job that imports training data from a data source (Amazon S3
+-- bucket) to an Amazon Personalize dataset. For more information, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateDatasetImportJob.html CreateDatasetImportJob>.
+--
+-- A dataset import job can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- /See:/ 'newDatasetImportJob' smart constructor.
+data DatasetImportJob = DatasetImportJob'
+  { -- | The creation date and time (in Unix time) of the dataset import job.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon S3 bucket that contains the training data to import.
+    dataSource :: Prelude.Maybe DataSource,
+    -- | The Amazon Resource Name (ARN) of the dataset that receives the imported
+    -- data.
+    datasetArn :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the dataset import job.
+    datasetImportJobArn :: Prelude.Maybe Prelude.Text,
+    -- | If a dataset import job fails, provides the reason why.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The import mode used by the dataset import job to import new records.
+    importMode :: Prelude.Maybe ImportMode,
+    -- | The name of the import job.
+    jobName :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) the dataset was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | Whether the job publishes metrics to Amazon S3 for a metric attribution.
+    publishAttributionMetricsToS3 :: Prelude.Maybe Prelude.Bool,
+    -- | The ARN of the IAM role that has permissions to read from the Amazon S3
+    -- data source.
+    roleArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the dataset import job.
+    --
+    -- A dataset import job can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetImportJob' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'datasetImportJob_creationDateTime' - The creation date and time (in Unix time) of the dataset import job.
+--
+-- 'dataSource', 'datasetImportJob_dataSource' - The Amazon S3 bucket that contains the training data to import.
+--
+-- 'datasetArn', 'datasetImportJob_datasetArn' - The Amazon Resource Name (ARN) of the dataset that receives the imported
+-- data.
+--
+-- 'datasetImportJobArn', 'datasetImportJob_datasetImportJobArn' - The ARN of the dataset import job.
+--
+-- 'failureReason', 'datasetImportJob_failureReason' - If a dataset import job fails, provides the reason why.
+--
+-- 'importMode', 'datasetImportJob_importMode' - The import mode used by the dataset import job to import new records.
+--
+-- 'jobName', 'datasetImportJob_jobName' - The name of the import job.
+--
+-- 'lastUpdatedDateTime', 'datasetImportJob_lastUpdatedDateTime' - The date and time (in Unix time) the dataset was last updated.
+--
+-- 'publishAttributionMetricsToS3', 'datasetImportJob_publishAttributionMetricsToS3' - Whether the job publishes metrics to Amazon S3 for a metric attribution.
+--
+-- 'roleArn', 'datasetImportJob_roleArn' - The ARN of the IAM role that has permissions to read from the Amazon S3
+-- data source.
+--
+-- 'status', 'datasetImportJob_status' - The status of the dataset import job.
+--
+-- A dataset import job can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+newDatasetImportJob ::
+  DatasetImportJob
+newDatasetImportJob =
+  DatasetImportJob'
+    { creationDateTime =
+        Prelude.Nothing,
+      dataSource = Prelude.Nothing,
+      datasetArn = Prelude.Nothing,
+      datasetImportJobArn = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      importMode = Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      publishAttributionMetricsToS3 = Prelude.Nothing,
+      roleArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The creation date and time (in Unix time) of the dataset import job.
+datasetImportJob_creationDateTime :: Lens.Lens' DatasetImportJob (Prelude.Maybe Prelude.UTCTime)
+datasetImportJob_creationDateTime = Lens.lens (\DatasetImportJob' {creationDateTime} -> creationDateTime) (\s@DatasetImportJob' {} a -> s {creationDateTime = a} :: DatasetImportJob) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon S3 bucket that contains the training data to import.
+datasetImportJob_dataSource :: Lens.Lens' DatasetImportJob (Prelude.Maybe DataSource)
+datasetImportJob_dataSource = Lens.lens (\DatasetImportJob' {dataSource} -> dataSource) (\s@DatasetImportJob' {} a -> s {dataSource = a} :: DatasetImportJob)
+
+-- | The Amazon Resource Name (ARN) of the dataset that receives the imported
+-- data.
+datasetImportJob_datasetArn :: Lens.Lens' DatasetImportJob (Prelude.Maybe Prelude.Text)
+datasetImportJob_datasetArn = Lens.lens (\DatasetImportJob' {datasetArn} -> datasetArn) (\s@DatasetImportJob' {} a -> s {datasetArn = a} :: DatasetImportJob)
+
+-- | The ARN of the dataset import job.
+datasetImportJob_datasetImportJobArn :: Lens.Lens' DatasetImportJob (Prelude.Maybe Prelude.Text)
+datasetImportJob_datasetImportJobArn = Lens.lens (\DatasetImportJob' {datasetImportJobArn} -> datasetImportJobArn) (\s@DatasetImportJob' {} a -> s {datasetImportJobArn = a} :: DatasetImportJob)
+
+-- | If a dataset import job fails, provides the reason why.
+datasetImportJob_failureReason :: Lens.Lens' DatasetImportJob (Prelude.Maybe Prelude.Text)
+datasetImportJob_failureReason = Lens.lens (\DatasetImportJob' {failureReason} -> failureReason) (\s@DatasetImportJob' {} a -> s {failureReason = a} :: DatasetImportJob)
+
+-- | The import mode used by the dataset import job to import new records.
+datasetImportJob_importMode :: Lens.Lens' DatasetImportJob (Prelude.Maybe ImportMode)
+datasetImportJob_importMode = Lens.lens (\DatasetImportJob' {importMode} -> importMode) (\s@DatasetImportJob' {} a -> s {importMode = a} :: DatasetImportJob)
+
+-- | The name of the import job.
+datasetImportJob_jobName :: Lens.Lens' DatasetImportJob (Prelude.Maybe Prelude.Text)
+datasetImportJob_jobName = Lens.lens (\DatasetImportJob' {jobName} -> jobName) (\s@DatasetImportJob' {} a -> s {jobName = a} :: DatasetImportJob)
+
+-- | The date and time (in Unix time) the dataset was last updated.
+datasetImportJob_lastUpdatedDateTime :: Lens.Lens' DatasetImportJob (Prelude.Maybe Prelude.UTCTime)
+datasetImportJob_lastUpdatedDateTime = Lens.lens (\DatasetImportJob' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@DatasetImportJob' {} a -> s {lastUpdatedDateTime = a} :: DatasetImportJob) Prelude.. Lens.mapping Data._Time
+
+-- | Whether the job publishes metrics to Amazon S3 for a metric attribution.
+datasetImportJob_publishAttributionMetricsToS3 :: Lens.Lens' DatasetImportJob (Prelude.Maybe Prelude.Bool)
+datasetImportJob_publishAttributionMetricsToS3 = Lens.lens (\DatasetImportJob' {publishAttributionMetricsToS3} -> publishAttributionMetricsToS3) (\s@DatasetImportJob' {} a -> s {publishAttributionMetricsToS3 = a} :: DatasetImportJob)
+
+-- | The ARN of the IAM role that has permissions to read from the Amazon S3
+-- data source.
+datasetImportJob_roleArn :: Lens.Lens' DatasetImportJob (Prelude.Maybe Prelude.Text)
+datasetImportJob_roleArn = Lens.lens (\DatasetImportJob' {roleArn} -> roleArn) (\s@DatasetImportJob' {} a -> s {roleArn = a} :: DatasetImportJob)
+
+-- | The status of the dataset import job.
+--
+-- A dataset import job can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+datasetImportJob_status :: Lens.Lens' DatasetImportJob (Prelude.Maybe Prelude.Text)
+datasetImportJob_status = Lens.lens (\DatasetImportJob' {status} -> status) (\s@DatasetImportJob' {} a -> s {status = a} :: DatasetImportJob)
+
+instance Data.FromJSON DatasetImportJob where
+  parseJSON =
+    Data.withObject
+      "DatasetImportJob"
+      ( \x ->
+          DatasetImportJob'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "dataSource")
+            Prelude.<*> (x Data..:? "datasetArn")
+            Prelude.<*> (x Data..:? "datasetImportJobArn")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "importMode")
+            Prelude.<*> (x Data..:? "jobName")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "publishAttributionMetricsToS3")
+            Prelude.<*> (x Data..:? "roleArn")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable DatasetImportJob where
+  hashWithSalt _salt DatasetImportJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` dataSource
+      `Prelude.hashWithSalt` datasetArn
+      `Prelude.hashWithSalt` datasetImportJobArn
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` importMode
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` publishAttributionMetricsToS3
+      `Prelude.hashWithSalt` roleArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData DatasetImportJob where
+  rnf DatasetImportJob' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf dataSource
+      `Prelude.seq` Prelude.rnf datasetArn
+      `Prelude.seq` Prelude.rnf datasetImportJobArn
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf importMode
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf publishAttributionMetricsToS3
+      `Prelude.seq` Prelude.rnf roleArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/DatasetImportJobSummary.hs b/gen/Amazonka/Personalize/Types/DatasetImportJobSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DatasetImportJobSummary.hs
@@ -0,0 +1,173 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DatasetImportJobSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DatasetImportJobSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.ImportMode
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of a dataset import job. For a
+-- complete listing, call the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeDatasetImportJob.html DescribeDatasetImportJob>
+-- API.
+--
+-- /See:/ 'newDatasetImportJobSummary' smart constructor.
+data DatasetImportJobSummary = DatasetImportJobSummary'
+  { -- | The date and time (in Unix time) that the dataset import job was
+    -- created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the dataset import job.
+    datasetImportJobArn :: Prelude.Maybe Prelude.Text,
+    -- | If a dataset import job fails, the reason behind the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The import mode the dataset import job used to update the data in the
+    -- dataset. For more information see
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/updating-existing-bulk-data.html Updating existing bulk data>.
+    importMode :: Prelude.Maybe ImportMode,
+    -- | The name of the dataset import job.
+    jobName :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) that the dataset import job status was
+    -- last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The status of the dataset import job.
+    --
+    -- A dataset import job can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetImportJobSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'datasetImportJobSummary_creationDateTime' - The date and time (in Unix time) that the dataset import job was
+-- created.
+--
+-- 'datasetImportJobArn', 'datasetImportJobSummary_datasetImportJobArn' - The Amazon Resource Name (ARN) of the dataset import job.
+--
+-- 'failureReason', 'datasetImportJobSummary_failureReason' - If a dataset import job fails, the reason behind the failure.
+--
+-- 'importMode', 'datasetImportJobSummary_importMode' - The import mode the dataset import job used to update the data in the
+-- dataset. For more information see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/updating-existing-bulk-data.html Updating existing bulk data>.
+--
+-- 'jobName', 'datasetImportJobSummary_jobName' - The name of the dataset import job.
+--
+-- 'lastUpdatedDateTime', 'datasetImportJobSummary_lastUpdatedDateTime' - The date and time (in Unix time) that the dataset import job status was
+-- last updated.
+--
+-- 'status', 'datasetImportJobSummary_status' - The status of the dataset import job.
+--
+-- A dataset import job can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+newDatasetImportJobSummary ::
+  DatasetImportJobSummary
+newDatasetImportJobSummary =
+  DatasetImportJobSummary'
+    { creationDateTime =
+        Prelude.Nothing,
+      datasetImportJobArn = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      importMode = Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix time) that the dataset import job was
+-- created.
+datasetImportJobSummary_creationDateTime :: Lens.Lens' DatasetImportJobSummary (Prelude.Maybe Prelude.UTCTime)
+datasetImportJobSummary_creationDateTime = Lens.lens (\DatasetImportJobSummary' {creationDateTime} -> creationDateTime) (\s@DatasetImportJobSummary' {} a -> s {creationDateTime = a} :: DatasetImportJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the dataset import job.
+datasetImportJobSummary_datasetImportJobArn :: Lens.Lens' DatasetImportJobSummary (Prelude.Maybe Prelude.Text)
+datasetImportJobSummary_datasetImportJobArn = Lens.lens (\DatasetImportJobSummary' {datasetImportJobArn} -> datasetImportJobArn) (\s@DatasetImportJobSummary' {} a -> s {datasetImportJobArn = a} :: DatasetImportJobSummary)
+
+-- | If a dataset import job fails, the reason behind the failure.
+datasetImportJobSummary_failureReason :: Lens.Lens' DatasetImportJobSummary (Prelude.Maybe Prelude.Text)
+datasetImportJobSummary_failureReason = Lens.lens (\DatasetImportJobSummary' {failureReason} -> failureReason) (\s@DatasetImportJobSummary' {} a -> s {failureReason = a} :: DatasetImportJobSummary)
+
+-- | The import mode the dataset import job used to update the data in the
+-- dataset. For more information see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/updating-existing-bulk-data.html Updating existing bulk data>.
+datasetImportJobSummary_importMode :: Lens.Lens' DatasetImportJobSummary (Prelude.Maybe ImportMode)
+datasetImportJobSummary_importMode = Lens.lens (\DatasetImportJobSummary' {importMode} -> importMode) (\s@DatasetImportJobSummary' {} a -> s {importMode = a} :: DatasetImportJobSummary)
+
+-- | The name of the dataset import job.
+datasetImportJobSummary_jobName :: Lens.Lens' DatasetImportJobSummary (Prelude.Maybe Prelude.Text)
+datasetImportJobSummary_jobName = Lens.lens (\DatasetImportJobSummary' {jobName} -> jobName) (\s@DatasetImportJobSummary' {} a -> s {jobName = a} :: DatasetImportJobSummary)
+
+-- | The date and time (in Unix time) that the dataset import job status was
+-- last updated.
+datasetImportJobSummary_lastUpdatedDateTime :: Lens.Lens' DatasetImportJobSummary (Prelude.Maybe Prelude.UTCTime)
+datasetImportJobSummary_lastUpdatedDateTime = Lens.lens (\DatasetImportJobSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@DatasetImportJobSummary' {} a -> s {lastUpdatedDateTime = a} :: DatasetImportJobSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The status of the dataset import job.
+--
+-- A dataset import job can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+datasetImportJobSummary_status :: Lens.Lens' DatasetImportJobSummary (Prelude.Maybe Prelude.Text)
+datasetImportJobSummary_status = Lens.lens (\DatasetImportJobSummary' {status} -> status) (\s@DatasetImportJobSummary' {} a -> s {status = a} :: DatasetImportJobSummary)
+
+instance Data.FromJSON DatasetImportJobSummary where
+  parseJSON =
+    Data.withObject
+      "DatasetImportJobSummary"
+      ( \x ->
+          DatasetImportJobSummary'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetImportJobArn")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "importMode")
+            Prelude.<*> (x Data..:? "jobName")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable DatasetImportJobSummary where
+  hashWithSalt _salt DatasetImportJobSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetImportJobArn
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` importMode
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData DatasetImportJobSummary where
+  rnf DatasetImportJobSummary' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetImportJobArn
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf importMode
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/DatasetSchema.hs b/gen/Amazonka/Personalize/Types/DatasetSchema.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DatasetSchema.hs
@@ -0,0 +1,137 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DatasetSchema
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DatasetSchema where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.Domain
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the schema for a dataset. For more information on schemas, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSchema.html CreateSchema>.
+--
+-- /See:/ 'newDatasetSchema' smart constructor.
+data DatasetSchema = DatasetSchema'
+  { -- | The date and time (in Unix time) that the schema was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The domain of a schema that you created for a dataset in a Domain
+    -- dataset group.
+    domain :: Prelude.Maybe Domain,
+    -- | The date and time (in Unix time) that the schema was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the schema.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The schema.
+    schema :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the schema.
+    schemaArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetSchema' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'datasetSchema_creationDateTime' - The date and time (in Unix time) that the schema was created.
+--
+-- 'domain', 'datasetSchema_domain' - The domain of a schema that you created for a dataset in a Domain
+-- dataset group.
+--
+-- 'lastUpdatedDateTime', 'datasetSchema_lastUpdatedDateTime' - The date and time (in Unix time) that the schema was last updated.
+--
+-- 'name', 'datasetSchema_name' - The name of the schema.
+--
+-- 'schema', 'datasetSchema_schema' - The schema.
+--
+-- 'schemaArn', 'datasetSchema_schemaArn' - The Amazon Resource Name (ARN) of the schema.
+newDatasetSchema ::
+  DatasetSchema
+newDatasetSchema =
+  DatasetSchema'
+    { creationDateTime = Prelude.Nothing,
+      domain = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      schema = Prelude.Nothing,
+      schemaArn = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix time) that the schema was created.
+datasetSchema_creationDateTime :: Lens.Lens' DatasetSchema (Prelude.Maybe Prelude.UTCTime)
+datasetSchema_creationDateTime = Lens.lens (\DatasetSchema' {creationDateTime} -> creationDateTime) (\s@DatasetSchema' {} a -> s {creationDateTime = a} :: DatasetSchema) Prelude.. Lens.mapping Data._Time
+
+-- | The domain of a schema that you created for a dataset in a Domain
+-- dataset group.
+datasetSchema_domain :: Lens.Lens' DatasetSchema (Prelude.Maybe Domain)
+datasetSchema_domain = Lens.lens (\DatasetSchema' {domain} -> domain) (\s@DatasetSchema' {} a -> s {domain = a} :: DatasetSchema)
+
+-- | The date and time (in Unix time) that the schema was last updated.
+datasetSchema_lastUpdatedDateTime :: Lens.Lens' DatasetSchema (Prelude.Maybe Prelude.UTCTime)
+datasetSchema_lastUpdatedDateTime = Lens.lens (\DatasetSchema' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@DatasetSchema' {} a -> s {lastUpdatedDateTime = a} :: DatasetSchema) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the schema.
+datasetSchema_name :: Lens.Lens' DatasetSchema (Prelude.Maybe Prelude.Text)
+datasetSchema_name = Lens.lens (\DatasetSchema' {name} -> name) (\s@DatasetSchema' {} a -> s {name = a} :: DatasetSchema)
+
+-- | The schema.
+datasetSchema_schema :: Lens.Lens' DatasetSchema (Prelude.Maybe Prelude.Text)
+datasetSchema_schema = Lens.lens (\DatasetSchema' {schema} -> schema) (\s@DatasetSchema' {} a -> s {schema = a} :: DatasetSchema)
+
+-- | The Amazon Resource Name (ARN) of the schema.
+datasetSchema_schemaArn :: Lens.Lens' DatasetSchema (Prelude.Maybe Prelude.Text)
+datasetSchema_schemaArn = Lens.lens (\DatasetSchema' {schemaArn} -> schemaArn) (\s@DatasetSchema' {} a -> s {schemaArn = a} :: DatasetSchema)
+
+instance Data.FromJSON DatasetSchema where
+  parseJSON =
+    Data.withObject
+      "DatasetSchema"
+      ( \x ->
+          DatasetSchema'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "domain")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "schema")
+            Prelude.<*> (x Data..:? "schemaArn")
+      )
+
+instance Prelude.Hashable DatasetSchema where
+  hashWithSalt _salt DatasetSchema' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` domain
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` schema
+      `Prelude.hashWithSalt` schemaArn
+
+instance Prelude.NFData DatasetSchema where
+  rnf DatasetSchema' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf schema
+      `Prelude.seq` Prelude.rnf schemaArn
diff --git a/gen/Amazonka/Personalize/Types/DatasetSchemaSummary.hs b/gen/Amazonka/Personalize/Types/DatasetSchemaSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DatasetSchemaSummary.hs
@@ -0,0 +1,128 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DatasetSchemaSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DatasetSchemaSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.Domain
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of a dataset schema. For a complete
+-- listing, call the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSchema.html DescribeSchema>
+-- API.
+--
+-- /See:/ 'newDatasetSchemaSummary' smart constructor.
+data DatasetSchemaSummary = DatasetSchemaSummary'
+  { -- | The date and time (in Unix time) that the schema was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The domain of a schema that you created for a dataset in a Domain
+    -- dataset group.
+    domain :: Prelude.Maybe Domain,
+    -- | The date and time (in Unix time) that the schema was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the schema.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the schema.
+    schemaArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetSchemaSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'datasetSchemaSummary_creationDateTime' - The date and time (in Unix time) that the schema was created.
+--
+-- 'domain', 'datasetSchemaSummary_domain' - The domain of a schema that you created for a dataset in a Domain
+-- dataset group.
+--
+-- 'lastUpdatedDateTime', 'datasetSchemaSummary_lastUpdatedDateTime' - The date and time (in Unix time) that the schema was last updated.
+--
+-- 'name', 'datasetSchemaSummary_name' - The name of the schema.
+--
+-- 'schemaArn', 'datasetSchemaSummary_schemaArn' - The Amazon Resource Name (ARN) of the schema.
+newDatasetSchemaSummary ::
+  DatasetSchemaSummary
+newDatasetSchemaSummary =
+  DatasetSchemaSummary'
+    { creationDateTime =
+        Prelude.Nothing,
+      domain = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      schemaArn = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix time) that the schema was created.
+datasetSchemaSummary_creationDateTime :: Lens.Lens' DatasetSchemaSummary (Prelude.Maybe Prelude.UTCTime)
+datasetSchemaSummary_creationDateTime = Lens.lens (\DatasetSchemaSummary' {creationDateTime} -> creationDateTime) (\s@DatasetSchemaSummary' {} a -> s {creationDateTime = a} :: DatasetSchemaSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The domain of a schema that you created for a dataset in a Domain
+-- dataset group.
+datasetSchemaSummary_domain :: Lens.Lens' DatasetSchemaSummary (Prelude.Maybe Domain)
+datasetSchemaSummary_domain = Lens.lens (\DatasetSchemaSummary' {domain} -> domain) (\s@DatasetSchemaSummary' {} a -> s {domain = a} :: DatasetSchemaSummary)
+
+-- | The date and time (in Unix time) that the schema was last updated.
+datasetSchemaSummary_lastUpdatedDateTime :: Lens.Lens' DatasetSchemaSummary (Prelude.Maybe Prelude.UTCTime)
+datasetSchemaSummary_lastUpdatedDateTime = Lens.lens (\DatasetSchemaSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@DatasetSchemaSummary' {} a -> s {lastUpdatedDateTime = a} :: DatasetSchemaSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the schema.
+datasetSchemaSummary_name :: Lens.Lens' DatasetSchemaSummary (Prelude.Maybe Prelude.Text)
+datasetSchemaSummary_name = Lens.lens (\DatasetSchemaSummary' {name} -> name) (\s@DatasetSchemaSummary' {} a -> s {name = a} :: DatasetSchemaSummary)
+
+-- | The Amazon Resource Name (ARN) of the schema.
+datasetSchemaSummary_schemaArn :: Lens.Lens' DatasetSchemaSummary (Prelude.Maybe Prelude.Text)
+datasetSchemaSummary_schemaArn = Lens.lens (\DatasetSchemaSummary' {schemaArn} -> schemaArn) (\s@DatasetSchemaSummary' {} a -> s {schemaArn = a} :: DatasetSchemaSummary)
+
+instance Data.FromJSON DatasetSchemaSummary where
+  parseJSON =
+    Data.withObject
+      "DatasetSchemaSummary"
+      ( \x ->
+          DatasetSchemaSummary'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "domain")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "schemaArn")
+      )
+
+instance Prelude.Hashable DatasetSchemaSummary where
+  hashWithSalt _salt DatasetSchemaSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` domain
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` schemaArn
+
+instance Prelude.NFData DatasetSchemaSummary where
+  rnf DatasetSchemaSummary' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf schemaArn
diff --git a/gen/Amazonka/Personalize/Types/DatasetSummary.hs b/gen/Amazonka/Personalize/Types/DatasetSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DatasetSummary.hs
@@ -0,0 +1,177 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DatasetSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DatasetSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of a dataset. For a complete
+-- listing, call the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeDataset.html DescribeDataset>
+-- API.
+--
+-- /See:/ 'newDatasetSummary' smart constructor.
+data DatasetSummary = DatasetSummary'
+  { -- | The date and time (in Unix time) that the dataset was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the dataset.
+    datasetArn :: Prelude.Maybe Prelude.Text,
+    -- | The dataset type. One of the following values:
+    --
+    -- -   Interactions
+    --
+    -- -   Items
+    --
+    -- -   Users
+    --
+    -- -   Event-Interactions
+    datasetType :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) that the dataset was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the dataset.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The status of the dataset.
+    --
+    -- A dataset can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   DELETE PENDING > DELETE IN_PROGRESS
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'datasetSummary_creationDateTime' - The date and time (in Unix time) that the dataset was created.
+--
+-- 'datasetArn', 'datasetSummary_datasetArn' - The Amazon Resource Name (ARN) of the dataset.
+--
+-- 'datasetType', 'datasetSummary_datasetType' - The dataset type. One of the following values:
+--
+-- -   Interactions
+--
+-- -   Items
+--
+-- -   Users
+--
+-- -   Event-Interactions
+--
+-- 'lastUpdatedDateTime', 'datasetSummary_lastUpdatedDateTime' - The date and time (in Unix time) that the dataset was last updated.
+--
+-- 'name', 'datasetSummary_name' - The name of the dataset.
+--
+-- 'status', 'datasetSummary_status' - The status of the dataset.
+--
+-- A dataset can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+newDatasetSummary ::
+  DatasetSummary
+newDatasetSummary =
+  DatasetSummary'
+    { creationDateTime = Prelude.Nothing,
+      datasetArn = Prelude.Nothing,
+      datasetType = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix time) that the dataset was created.
+datasetSummary_creationDateTime :: Lens.Lens' DatasetSummary (Prelude.Maybe Prelude.UTCTime)
+datasetSummary_creationDateTime = Lens.lens (\DatasetSummary' {creationDateTime} -> creationDateTime) (\s@DatasetSummary' {} a -> s {creationDateTime = a} :: DatasetSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the dataset.
+datasetSummary_datasetArn :: Lens.Lens' DatasetSummary (Prelude.Maybe Prelude.Text)
+datasetSummary_datasetArn = Lens.lens (\DatasetSummary' {datasetArn} -> datasetArn) (\s@DatasetSummary' {} a -> s {datasetArn = a} :: DatasetSummary)
+
+-- | The dataset type. One of the following values:
+--
+-- -   Interactions
+--
+-- -   Items
+--
+-- -   Users
+--
+-- -   Event-Interactions
+datasetSummary_datasetType :: Lens.Lens' DatasetSummary (Prelude.Maybe Prelude.Text)
+datasetSummary_datasetType = Lens.lens (\DatasetSummary' {datasetType} -> datasetType) (\s@DatasetSummary' {} a -> s {datasetType = a} :: DatasetSummary)
+
+-- | The date and time (in Unix time) that the dataset was last updated.
+datasetSummary_lastUpdatedDateTime :: Lens.Lens' DatasetSummary (Prelude.Maybe Prelude.UTCTime)
+datasetSummary_lastUpdatedDateTime = Lens.lens (\DatasetSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@DatasetSummary' {} a -> s {lastUpdatedDateTime = a} :: DatasetSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the dataset.
+datasetSummary_name :: Lens.Lens' DatasetSummary (Prelude.Maybe Prelude.Text)
+datasetSummary_name = Lens.lens (\DatasetSummary' {name} -> name) (\s@DatasetSummary' {} a -> s {name = a} :: DatasetSummary)
+
+-- | The status of the dataset.
+--
+-- A dataset can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+datasetSummary_status :: Lens.Lens' DatasetSummary (Prelude.Maybe Prelude.Text)
+datasetSummary_status = Lens.lens (\DatasetSummary' {status} -> status) (\s@DatasetSummary' {} a -> s {status = a} :: DatasetSummary)
+
+instance Data.FromJSON DatasetSummary where
+  parseJSON =
+    Data.withObject
+      "DatasetSummary"
+      ( \x ->
+          DatasetSummary'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetArn")
+            Prelude.<*> (x Data..:? "datasetType")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable DatasetSummary where
+  hashWithSalt _salt DatasetSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetArn
+      `Prelude.hashWithSalt` datasetType
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData DatasetSummary where
+  rnf DatasetSummary' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetArn
+      `Prelude.seq` Prelude.rnf datasetType
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/DefaultCategoricalHyperParameterRange.hs b/gen/Amazonka/Personalize/Types/DefaultCategoricalHyperParameterRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DefaultCategoricalHyperParameterRange.hs
@@ -0,0 +1,110 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DefaultCategoricalHyperParameterRange
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DefaultCategoricalHyperParameterRange where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides the name and default range of a categorical hyperparameter and
+-- whether the hyperparameter is tunable. A tunable hyperparameter can have
+-- its value determined during hyperparameter optimization (HPO).
+--
+-- /See:/ 'newDefaultCategoricalHyperParameterRange' smart constructor.
+data DefaultCategoricalHyperParameterRange = DefaultCategoricalHyperParameterRange'
+  { -- | Whether the hyperparameter is tunable.
+    isTunable :: Prelude.Maybe Prelude.Bool,
+    -- | The name of the hyperparameter.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | A list of the categories for the hyperparameter.
+    values :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DefaultCategoricalHyperParameterRange' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'isTunable', 'defaultCategoricalHyperParameterRange_isTunable' - Whether the hyperparameter is tunable.
+--
+-- 'name', 'defaultCategoricalHyperParameterRange_name' - The name of the hyperparameter.
+--
+-- 'values', 'defaultCategoricalHyperParameterRange_values' - A list of the categories for the hyperparameter.
+newDefaultCategoricalHyperParameterRange ::
+  DefaultCategoricalHyperParameterRange
+newDefaultCategoricalHyperParameterRange =
+  DefaultCategoricalHyperParameterRange'
+    { isTunable =
+        Prelude.Nothing,
+      name = Prelude.Nothing,
+      values = Prelude.Nothing
+    }
+
+-- | Whether the hyperparameter is tunable.
+defaultCategoricalHyperParameterRange_isTunable :: Lens.Lens' DefaultCategoricalHyperParameterRange (Prelude.Maybe Prelude.Bool)
+defaultCategoricalHyperParameterRange_isTunable = Lens.lens (\DefaultCategoricalHyperParameterRange' {isTunable} -> isTunable) (\s@DefaultCategoricalHyperParameterRange' {} a -> s {isTunable = a} :: DefaultCategoricalHyperParameterRange)
+
+-- | The name of the hyperparameter.
+defaultCategoricalHyperParameterRange_name :: Lens.Lens' DefaultCategoricalHyperParameterRange (Prelude.Maybe Prelude.Text)
+defaultCategoricalHyperParameterRange_name = Lens.lens (\DefaultCategoricalHyperParameterRange' {name} -> name) (\s@DefaultCategoricalHyperParameterRange' {} a -> s {name = a} :: DefaultCategoricalHyperParameterRange)
+
+-- | A list of the categories for the hyperparameter.
+defaultCategoricalHyperParameterRange_values :: Lens.Lens' DefaultCategoricalHyperParameterRange (Prelude.Maybe [Prelude.Text])
+defaultCategoricalHyperParameterRange_values = Lens.lens (\DefaultCategoricalHyperParameterRange' {values} -> values) (\s@DefaultCategoricalHyperParameterRange' {} a -> s {values = a} :: DefaultCategoricalHyperParameterRange) Prelude.. Lens.mapping Lens.coerced
+
+instance
+  Data.FromJSON
+    DefaultCategoricalHyperParameterRange
+  where
+  parseJSON =
+    Data.withObject
+      "DefaultCategoricalHyperParameterRange"
+      ( \x ->
+          DefaultCategoricalHyperParameterRange'
+            Prelude.<$> (x Data..:? "isTunable")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "values" Data..!= Prelude.mempty)
+      )
+
+instance
+  Prelude.Hashable
+    DefaultCategoricalHyperParameterRange
+  where
+  hashWithSalt
+    _salt
+    DefaultCategoricalHyperParameterRange' {..} =
+      _salt
+        `Prelude.hashWithSalt` isTunable
+        `Prelude.hashWithSalt` name
+        `Prelude.hashWithSalt` values
+
+instance
+  Prelude.NFData
+    DefaultCategoricalHyperParameterRange
+  where
+  rnf DefaultCategoricalHyperParameterRange' {..} =
+    Prelude.rnf isTunable
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf values
diff --git a/gen/Amazonka/Personalize/Types/DefaultContinuousHyperParameterRange.hs b/gen/Amazonka/Personalize/Types/DefaultContinuousHyperParameterRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DefaultContinuousHyperParameterRange.hs
@@ -0,0 +1,122 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DefaultContinuousHyperParameterRange
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DefaultContinuousHyperParameterRange where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides the name and default range of a continuous hyperparameter and
+-- whether the hyperparameter is tunable. A tunable hyperparameter can have
+-- its value determined during hyperparameter optimization (HPO).
+--
+-- /See:/ 'newDefaultContinuousHyperParameterRange' smart constructor.
+data DefaultContinuousHyperParameterRange = DefaultContinuousHyperParameterRange'
+  { -- | Whether the hyperparameter is tunable.
+    isTunable :: Prelude.Maybe Prelude.Bool,
+    -- | The maximum allowable value for the hyperparameter.
+    maxValue :: Prelude.Maybe Prelude.Double,
+    -- | The minimum allowable value for the hyperparameter.
+    minValue :: Prelude.Maybe Prelude.Double,
+    -- | The name of the hyperparameter.
+    name :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DefaultContinuousHyperParameterRange' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'isTunable', 'defaultContinuousHyperParameterRange_isTunable' - Whether the hyperparameter is tunable.
+--
+-- 'maxValue', 'defaultContinuousHyperParameterRange_maxValue' - The maximum allowable value for the hyperparameter.
+--
+-- 'minValue', 'defaultContinuousHyperParameterRange_minValue' - The minimum allowable value for the hyperparameter.
+--
+-- 'name', 'defaultContinuousHyperParameterRange_name' - The name of the hyperparameter.
+newDefaultContinuousHyperParameterRange ::
+  DefaultContinuousHyperParameterRange
+newDefaultContinuousHyperParameterRange =
+  DefaultContinuousHyperParameterRange'
+    { isTunable =
+        Prelude.Nothing,
+      maxValue = Prelude.Nothing,
+      minValue = Prelude.Nothing,
+      name = Prelude.Nothing
+    }
+
+-- | Whether the hyperparameter is tunable.
+defaultContinuousHyperParameterRange_isTunable :: Lens.Lens' DefaultContinuousHyperParameterRange (Prelude.Maybe Prelude.Bool)
+defaultContinuousHyperParameterRange_isTunable = Lens.lens (\DefaultContinuousHyperParameterRange' {isTunable} -> isTunable) (\s@DefaultContinuousHyperParameterRange' {} a -> s {isTunable = a} :: DefaultContinuousHyperParameterRange)
+
+-- | The maximum allowable value for the hyperparameter.
+defaultContinuousHyperParameterRange_maxValue :: Lens.Lens' DefaultContinuousHyperParameterRange (Prelude.Maybe Prelude.Double)
+defaultContinuousHyperParameterRange_maxValue = Lens.lens (\DefaultContinuousHyperParameterRange' {maxValue} -> maxValue) (\s@DefaultContinuousHyperParameterRange' {} a -> s {maxValue = a} :: DefaultContinuousHyperParameterRange)
+
+-- | The minimum allowable value for the hyperparameter.
+defaultContinuousHyperParameterRange_minValue :: Lens.Lens' DefaultContinuousHyperParameterRange (Prelude.Maybe Prelude.Double)
+defaultContinuousHyperParameterRange_minValue = Lens.lens (\DefaultContinuousHyperParameterRange' {minValue} -> minValue) (\s@DefaultContinuousHyperParameterRange' {} a -> s {minValue = a} :: DefaultContinuousHyperParameterRange)
+
+-- | The name of the hyperparameter.
+defaultContinuousHyperParameterRange_name :: Lens.Lens' DefaultContinuousHyperParameterRange (Prelude.Maybe Prelude.Text)
+defaultContinuousHyperParameterRange_name = Lens.lens (\DefaultContinuousHyperParameterRange' {name} -> name) (\s@DefaultContinuousHyperParameterRange' {} a -> s {name = a} :: DefaultContinuousHyperParameterRange)
+
+instance
+  Data.FromJSON
+    DefaultContinuousHyperParameterRange
+  where
+  parseJSON =
+    Data.withObject
+      "DefaultContinuousHyperParameterRange"
+      ( \x ->
+          DefaultContinuousHyperParameterRange'
+            Prelude.<$> (x Data..:? "isTunable")
+            Prelude.<*> (x Data..:? "maxValue")
+            Prelude.<*> (x Data..:? "minValue")
+            Prelude.<*> (x Data..:? "name")
+      )
+
+instance
+  Prelude.Hashable
+    DefaultContinuousHyperParameterRange
+  where
+  hashWithSalt
+    _salt
+    DefaultContinuousHyperParameterRange' {..} =
+      _salt
+        `Prelude.hashWithSalt` isTunable
+        `Prelude.hashWithSalt` maxValue
+        `Prelude.hashWithSalt` minValue
+        `Prelude.hashWithSalt` name
+
+instance
+  Prelude.NFData
+    DefaultContinuousHyperParameterRange
+  where
+  rnf DefaultContinuousHyperParameterRange' {..} =
+    Prelude.rnf isTunable
+      `Prelude.seq` Prelude.rnf maxValue
+      `Prelude.seq` Prelude.rnf minValue
+      `Prelude.seq` Prelude.rnf name
diff --git a/gen/Amazonka/Personalize/Types/DefaultHyperParameterRanges.hs b/gen/Amazonka/Personalize/Types/DefaultHyperParameterRanges.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DefaultHyperParameterRanges.hs
@@ -0,0 +1,111 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DefaultHyperParameterRanges
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DefaultHyperParameterRanges where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.DefaultCategoricalHyperParameterRange
+import Amazonka.Personalize.Types.DefaultContinuousHyperParameterRange
+import Amazonka.Personalize.Types.DefaultIntegerHyperParameterRange
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies the hyperparameters and their default ranges. Hyperparameters
+-- can be categorical, continuous, or integer-valued.
+--
+-- /See:/ 'newDefaultHyperParameterRanges' smart constructor.
+data DefaultHyperParameterRanges = DefaultHyperParameterRanges'
+  { -- | The categorical hyperparameters and their default ranges.
+    categoricalHyperParameterRanges :: Prelude.Maybe [DefaultCategoricalHyperParameterRange],
+    -- | The continuous hyperparameters and their default ranges.
+    continuousHyperParameterRanges :: Prelude.Maybe [DefaultContinuousHyperParameterRange],
+    -- | The integer-valued hyperparameters and their default ranges.
+    integerHyperParameterRanges :: Prelude.Maybe [DefaultIntegerHyperParameterRange]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DefaultHyperParameterRanges' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'categoricalHyperParameterRanges', 'defaultHyperParameterRanges_categoricalHyperParameterRanges' - The categorical hyperparameters and their default ranges.
+--
+-- 'continuousHyperParameterRanges', 'defaultHyperParameterRanges_continuousHyperParameterRanges' - The continuous hyperparameters and their default ranges.
+--
+-- 'integerHyperParameterRanges', 'defaultHyperParameterRanges_integerHyperParameterRanges' - The integer-valued hyperparameters and their default ranges.
+newDefaultHyperParameterRanges ::
+  DefaultHyperParameterRanges
+newDefaultHyperParameterRanges =
+  DefaultHyperParameterRanges'
+    { categoricalHyperParameterRanges =
+        Prelude.Nothing,
+      continuousHyperParameterRanges =
+        Prelude.Nothing,
+      integerHyperParameterRanges = Prelude.Nothing
+    }
+
+-- | The categorical hyperparameters and their default ranges.
+defaultHyperParameterRanges_categoricalHyperParameterRanges :: Lens.Lens' DefaultHyperParameterRanges (Prelude.Maybe [DefaultCategoricalHyperParameterRange])
+defaultHyperParameterRanges_categoricalHyperParameterRanges = Lens.lens (\DefaultHyperParameterRanges' {categoricalHyperParameterRanges} -> categoricalHyperParameterRanges) (\s@DefaultHyperParameterRanges' {} a -> s {categoricalHyperParameterRanges = a} :: DefaultHyperParameterRanges) Prelude.. Lens.mapping Lens.coerced
+
+-- | The continuous hyperparameters and their default ranges.
+defaultHyperParameterRanges_continuousHyperParameterRanges :: Lens.Lens' DefaultHyperParameterRanges (Prelude.Maybe [DefaultContinuousHyperParameterRange])
+defaultHyperParameterRanges_continuousHyperParameterRanges = Lens.lens (\DefaultHyperParameterRanges' {continuousHyperParameterRanges} -> continuousHyperParameterRanges) (\s@DefaultHyperParameterRanges' {} a -> s {continuousHyperParameterRanges = a} :: DefaultHyperParameterRanges) Prelude.. Lens.mapping Lens.coerced
+
+-- | The integer-valued hyperparameters and their default ranges.
+defaultHyperParameterRanges_integerHyperParameterRanges :: Lens.Lens' DefaultHyperParameterRanges (Prelude.Maybe [DefaultIntegerHyperParameterRange])
+defaultHyperParameterRanges_integerHyperParameterRanges = Lens.lens (\DefaultHyperParameterRanges' {integerHyperParameterRanges} -> integerHyperParameterRanges) (\s@DefaultHyperParameterRanges' {} a -> s {integerHyperParameterRanges = a} :: DefaultHyperParameterRanges) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON DefaultHyperParameterRanges where
+  parseJSON =
+    Data.withObject
+      "DefaultHyperParameterRanges"
+      ( \x ->
+          DefaultHyperParameterRanges'
+            Prelude.<$> ( x
+                            Data..:? "categoricalHyperParameterRanges"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..:? "continuousHyperParameterRanges"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..:? "integerHyperParameterRanges"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable DefaultHyperParameterRanges where
+  hashWithSalt _salt DefaultHyperParameterRanges' {..} =
+    _salt
+      `Prelude.hashWithSalt` categoricalHyperParameterRanges
+      `Prelude.hashWithSalt` continuousHyperParameterRanges
+      `Prelude.hashWithSalt` integerHyperParameterRanges
+
+instance Prelude.NFData DefaultHyperParameterRanges where
+  rnf DefaultHyperParameterRanges' {..} =
+    Prelude.rnf categoricalHyperParameterRanges
+      `Prelude.seq` Prelude.rnf continuousHyperParameterRanges
+      `Prelude.seq` Prelude.rnf integerHyperParameterRanges
diff --git a/gen/Amazonka/Personalize/Types/DefaultIntegerHyperParameterRange.hs b/gen/Amazonka/Personalize/Types/DefaultIntegerHyperParameterRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/DefaultIntegerHyperParameterRange.hs
@@ -0,0 +1,122 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.DefaultIntegerHyperParameterRange
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.DefaultIntegerHyperParameterRange where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides the name and default range of a integer-valued hyperparameter
+-- and whether the hyperparameter is tunable. A tunable hyperparameter can
+-- have its value determined during hyperparameter optimization (HPO).
+--
+-- /See:/ 'newDefaultIntegerHyperParameterRange' smart constructor.
+data DefaultIntegerHyperParameterRange = DefaultIntegerHyperParameterRange'
+  { -- | Indicates whether the hyperparameter is tunable.
+    isTunable :: Prelude.Maybe Prelude.Bool,
+    -- | The maximum allowable value for the hyperparameter.
+    maxValue :: Prelude.Maybe Prelude.Int,
+    -- | The minimum allowable value for the hyperparameter.
+    minValue :: Prelude.Maybe Prelude.Int,
+    -- | The name of the hyperparameter.
+    name :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DefaultIntegerHyperParameterRange' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'isTunable', 'defaultIntegerHyperParameterRange_isTunable' - Indicates whether the hyperparameter is tunable.
+--
+-- 'maxValue', 'defaultIntegerHyperParameterRange_maxValue' - The maximum allowable value for the hyperparameter.
+--
+-- 'minValue', 'defaultIntegerHyperParameterRange_minValue' - The minimum allowable value for the hyperparameter.
+--
+-- 'name', 'defaultIntegerHyperParameterRange_name' - The name of the hyperparameter.
+newDefaultIntegerHyperParameterRange ::
+  DefaultIntegerHyperParameterRange
+newDefaultIntegerHyperParameterRange =
+  DefaultIntegerHyperParameterRange'
+    { isTunable =
+        Prelude.Nothing,
+      maxValue = Prelude.Nothing,
+      minValue = Prelude.Nothing,
+      name = Prelude.Nothing
+    }
+
+-- | Indicates whether the hyperparameter is tunable.
+defaultIntegerHyperParameterRange_isTunable :: Lens.Lens' DefaultIntegerHyperParameterRange (Prelude.Maybe Prelude.Bool)
+defaultIntegerHyperParameterRange_isTunable = Lens.lens (\DefaultIntegerHyperParameterRange' {isTunable} -> isTunable) (\s@DefaultIntegerHyperParameterRange' {} a -> s {isTunable = a} :: DefaultIntegerHyperParameterRange)
+
+-- | The maximum allowable value for the hyperparameter.
+defaultIntegerHyperParameterRange_maxValue :: Lens.Lens' DefaultIntegerHyperParameterRange (Prelude.Maybe Prelude.Int)
+defaultIntegerHyperParameterRange_maxValue = Lens.lens (\DefaultIntegerHyperParameterRange' {maxValue} -> maxValue) (\s@DefaultIntegerHyperParameterRange' {} a -> s {maxValue = a} :: DefaultIntegerHyperParameterRange)
+
+-- | The minimum allowable value for the hyperparameter.
+defaultIntegerHyperParameterRange_minValue :: Lens.Lens' DefaultIntegerHyperParameterRange (Prelude.Maybe Prelude.Int)
+defaultIntegerHyperParameterRange_minValue = Lens.lens (\DefaultIntegerHyperParameterRange' {minValue} -> minValue) (\s@DefaultIntegerHyperParameterRange' {} a -> s {minValue = a} :: DefaultIntegerHyperParameterRange)
+
+-- | The name of the hyperparameter.
+defaultIntegerHyperParameterRange_name :: Lens.Lens' DefaultIntegerHyperParameterRange (Prelude.Maybe Prelude.Text)
+defaultIntegerHyperParameterRange_name = Lens.lens (\DefaultIntegerHyperParameterRange' {name} -> name) (\s@DefaultIntegerHyperParameterRange' {} a -> s {name = a} :: DefaultIntegerHyperParameterRange)
+
+instance
+  Data.FromJSON
+    DefaultIntegerHyperParameterRange
+  where
+  parseJSON =
+    Data.withObject
+      "DefaultIntegerHyperParameterRange"
+      ( \x ->
+          DefaultIntegerHyperParameterRange'
+            Prelude.<$> (x Data..:? "isTunable")
+            Prelude.<*> (x Data..:? "maxValue")
+            Prelude.<*> (x Data..:? "minValue")
+            Prelude.<*> (x Data..:? "name")
+      )
+
+instance
+  Prelude.Hashable
+    DefaultIntegerHyperParameterRange
+  where
+  hashWithSalt
+    _salt
+    DefaultIntegerHyperParameterRange' {..} =
+      _salt
+        `Prelude.hashWithSalt` isTunable
+        `Prelude.hashWithSalt` maxValue
+        `Prelude.hashWithSalt` minValue
+        `Prelude.hashWithSalt` name
+
+instance
+  Prelude.NFData
+    DefaultIntegerHyperParameterRange
+  where
+  rnf DefaultIntegerHyperParameterRange' {..} =
+    Prelude.rnf isTunable
+      `Prelude.seq` Prelude.rnf maxValue
+      `Prelude.seq` Prelude.rnf minValue
+      `Prelude.seq` Prelude.rnf name
diff --git a/gen/Amazonka/Personalize/Types/Domain.hs b/gen/Amazonka/Personalize/Types/Domain.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/Domain.hs
@@ -0,0 +1,68 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.Domain
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.Domain
+  ( Domain
+      ( ..,
+        Domain_ECOMMERCE,
+        Domain_VIDEO_ON_DEMAND
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype Domain = Domain' {fromDomain :: Data.Text}
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern Domain_ECOMMERCE :: Domain
+pattern Domain_ECOMMERCE = Domain' "ECOMMERCE"
+
+pattern Domain_VIDEO_ON_DEMAND :: Domain
+pattern Domain_VIDEO_ON_DEMAND = Domain' "VIDEO_ON_DEMAND"
+
+{-# COMPLETE
+  Domain_ECOMMERCE,
+  Domain_VIDEO_ON_DEMAND,
+  Domain'
+  #-}
diff --git a/gen/Amazonka/Personalize/Types/EventTracker.hs b/gen/Amazonka/Personalize/Types/EventTracker.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/EventTracker.hs
@@ -0,0 +1,186 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.EventTracker
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.EventTracker where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides information about an event tracker.
+--
+-- /See:/ 'newEventTracker' smart constructor.
+data EventTracker = EventTracker'
+  { -- | The Amazon Web Services account that owns the event tracker.
+    accountId :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix format) that the event tracker was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the dataset group that receives the
+    -- event data.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the event tracker.
+    eventTrackerArn :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) that the event tracker was last
+    -- updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the event tracker.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The status of the event tracker.
+    --
+    -- An event tracker can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   DELETE PENDING > DELETE IN_PROGRESS
+    status :: Prelude.Maybe Prelude.Text,
+    -- | The ID of the event tracker. Include this ID in requests to the
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/API_UBS_PutEvents.html PutEvents>
+    -- API.
+    trackingId :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EventTracker' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'accountId', 'eventTracker_accountId' - The Amazon Web Services account that owns the event tracker.
+--
+-- 'creationDateTime', 'eventTracker_creationDateTime' - The date and time (in Unix format) that the event tracker was created.
+--
+-- 'datasetGroupArn', 'eventTracker_datasetGroupArn' - The Amazon Resource Name (ARN) of the dataset group that receives the
+-- event data.
+--
+-- 'eventTrackerArn', 'eventTracker_eventTrackerArn' - The ARN of the event tracker.
+--
+-- 'lastUpdatedDateTime', 'eventTracker_lastUpdatedDateTime' - The date and time (in Unix time) that the event tracker was last
+-- updated.
+--
+-- 'name', 'eventTracker_name' - The name of the event tracker.
+--
+-- 'status', 'eventTracker_status' - The status of the event tracker.
+--
+-- An event tracker can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+--
+-- 'trackingId', 'eventTracker_trackingId' - The ID of the event tracker. Include this ID in requests to the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_UBS_PutEvents.html PutEvents>
+-- API.
+newEventTracker ::
+  EventTracker
+newEventTracker =
+  EventTracker'
+    { accountId = Prelude.Nothing,
+      creationDateTime = Prelude.Nothing,
+      datasetGroupArn = Prelude.Nothing,
+      eventTrackerArn = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing,
+      trackingId = Prelude.Nothing
+    }
+
+-- | The Amazon Web Services account that owns the event tracker.
+eventTracker_accountId :: Lens.Lens' EventTracker (Prelude.Maybe Prelude.Text)
+eventTracker_accountId = Lens.lens (\EventTracker' {accountId} -> accountId) (\s@EventTracker' {} a -> s {accountId = a} :: EventTracker)
+
+-- | The date and time (in Unix format) that the event tracker was created.
+eventTracker_creationDateTime :: Lens.Lens' EventTracker (Prelude.Maybe Prelude.UTCTime)
+eventTracker_creationDateTime = Lens.lens (\EventTracker' {creationDateTime} -> creationDateTime) (\s@EventTracker' {} a -> s {creationDateTime = a} :: EventTracker) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the dataset group that receives the
+-- event data.
+eventTracker_datasetGroupArn :: Lens.Lens' EventTracker (Prelude.Maybe Prelude.Text)
+eventTracker_datasetGroupArn = Lens.lens (\EventTracker' {datasetGroupArn} -> datasetGroupArn) (\s@EventTracker' {} a -> s {datasetGroupArn = a} :: EventTracker)
+
+-- | The ARN of the event tracker.
+eventTracker_eventTrackerArn :: Lens.Lens' EventTracker (Prelude.Maybe Prelude.Text)
+eventTracker_eventTrackerArn = Lens.lens (\EventTracker' {eventTrackerArn} -> eventTrackerArn) (\s@EventTracker' {} a -> s {eventTrackerArn = a} :: EventTracker)
+
+-- | The date and time (in Unix time) that the event tracker was last
+-- updated.
+eventTracker_lastUpdatedDateTime :: Lens.Lens' EventTracker (Prelude.Maybe Prelude.UTCTime)
+eventTracker_lastUpdatedDateTime = Lens.lens (\EventTracker' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@EventTracker' {} a -> s {lastUpdatedDateTime = a} :: EventTracker) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the event tracker.
+eventTracker_name :: Lens.Lens' EventTracker (Prelude.Maybe Prelude.Text)
+eventTracker_name = Lens.lens (\EventTracker' {name} -> name) (\s@EventTracker' {} a -> s {name = a} :: EventTracker)
+
+-- | The status of the event tracker.
+--
+-- An event tracker can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+eventTracker_status :: Lens.Lens' EventTracker (Prelude.Maybe Prelude.Text)
+eventTracker_status = Lens.lens (\EventTracker' {status} -> status) (\s@EventTracker' {} a -> s {status = a} :: EventTracker)
+
+-- | The ID of the event tracker. Include this ID in requests to the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_UBS_PutEvents.html PutEvents>
+-- API.
+eventTracker_trackingId :: Lens.Lens' EventTracker (Prelude.Maybe Prelude.Text)
+eventTracker_trackingId = Lens.lens (\EventTracker' {trackingId} -> trackingId) (\s@EventTracker' {} a -> s {trackingId = a} :: EventTracker)
+
+instance Data.FromJSON EventTracker where
+  parseJSON =
+    Data.withObject
+      "EventTracker"
+      ( \x ->
+          EventTracker'
+            Prelude.<$> (x Data..:? "accountId")
+            Prelude.<*> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetGroupArn")
+            Prelude.<*> (x Data..:? "eventTrackerArn")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "status")
+            Prelude.<*> (x Data..:? "trackingId")
+      )
+
+instance Prelude.Hashable EventTracker where
+  hashWithSalt _salt EventTracker' {..} =
+    _salt
+      `Prelude.hashWithSalt` accountId
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` eventTrackerArn
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` trackingId
+
+instance Prelude.NFData EventTracker where
+  rnf EventTracker' {..} =
+    Prelude.rnf accountId
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf eventTrackerArn
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf trackingId
diff --git a/gen/Amazonka/Personalize/Types/EventTrackerSummary.hs b/gen/Amazonka/Personalize/Types/EventTrackerSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/EventTrackerSummary.hs
@@ -0,0 +1,145 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.EventTrackerSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.EventTrackerSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of an event tracker. For a complete
+-- listing, call the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeEventTracker.html DescribeEventTracker>
+-- API.
+--
+-- /See:/ 'newEventTrackerSummary' smart constructor.
+data EventTrackerSummary = EventTrackerSummary'
+  { -- | The date and time (in Unix time) that the event tracker was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the event tracker.
+    eventTrackerArn :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) that the event tracker was last
+    -- updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the event tracker.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The status of the event tracker.
+    --
+    -- An event tracker can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   DELETE PENDING > DELETE IN_PROGRESS
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'EventTrackerSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'eventTrackerSummary_creationDateTime' - The date and time (in Unix time) that the event tracker was created.
+--
+-- 'eventTrackerArn', 'eventTrackerSummary_eventTrackerArn' - The Amazon Resource Name (ARN) of the event tracker.
+--
+-- 'lastUpdatedDateTime', 'eventTrackerSummary_lastUpdatedDateTime' - The date and time (in Unix time) that the event tracker was last
+-- updated.
+--
+-- 'name', 'eventTrackerSummary_name' - The name of the event tracker.
+--
+-- 'status', 'eventTrackerSummary_status' - The status of the event tracker.
+--
+-- An event tracker can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+newEventTrackerSummary ::
+  EventTrackerSummary
+newEventTrackerSummary =
+  EventTrackerSummary'
+    { creationDateTime =
+        Prelude.Nothing,
+      eventTrackerArn = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix time) that the event tracker was created.
+eventTrackerSummary_creationDateTime :: Lens.Lens' EventTrackerSummary (Prelude.Maybe Prelude.UTCTime)
+eventTrackerSummary_creationDateTime = Lens.lens (\EventTrackerSummary' {creationDateTime} -> creationDateTime) (\s@EventTrackerSummary' {} a -> s {creationDateTime = a} :: EventTrackerSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the event tracker.
+eventTrackerSummary_eventTrackerArn :: Lens.Lens' EventTrackerSummary (Prelude.Maybe Prelude.Text)
+eventTrackerSummary_eventTrackerArn = Lens.lens (\EventTrackerSummary' {eventTrackerArn} -> eventTrackerArn) (\s@EventTrackerSummary' {} a -> s {eventTrackerArn = a} :: EventTrackerSummary)
+
+-- | The date and time (in Unix time) that the event tracker was last
+-- updated.
+eventTrackerSummary_lastUpdatedDateTime :: Lens.Lens' EventTrackerSummary (Prelude.Maybe Prelude.UTCTime)
+eventTrackerSummary_lastUpdatedDateTime = Lens.lens (\EventTrackerSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@EventTrackerSummary' {} a -> s {lastUpdatedDateTime = a} :: EventTrackerSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the event tracker.
+eventTrackerSummary_name :: Lens.Lens' EventTrackerSummary (Prelude.Maybe Prelude.Text)
+eventTrackerSummary_name = Lens.lens (\EventTrackerSummary' {name} -> name) (\s@EventTrackerSummary' {} a -> s {name = a} :: EventTrackerSummary)
+
+-- | The status of the event tracker.
+--
+-- An event tracker can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+eventTrackerSummary_status :: Lens.Lens' EventTrackerSummary (Prelude.Maybe Prelude.Text)
+eventTrackerSummary_status = Lens.lens (\EventTrackerSummary' {status} -> status) (\s@EventTrackerSummary' {} a -> s {status = a} :: EventTrackerSummary)
+
+instance Data.FromJSON EventTrackerSummary where
+  parseJSON =
+    Data.withObject
+      "EventTrackerSummary"
+      ( \x ->
+          EventTrackerSummary'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "eventTrackerArn")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable EventTrackerSummary where
+  hashWithSalt _salt EventTrackerSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` eventTrackerArn
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData EventTrackerSummary where
+  rnf EventTrackerSummary' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf eventTrackerArn
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/FeatureTransformation.hs b/gen/Amazonka/Personalize/Types/FeatureTransformation.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/FeatureTransformation.hs
@@ -0,0 +1,153 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.FeatureTransformation
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.FeatureTransformation where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides feature transformation information. Feature transformation is
+-- the process of modifying raw input data into a form more suitable for
+-- model training.
+--
+-- /See:/ 'newFeatureTransformation' smart constructor.
+data FeatureTransformation = FeatureTransformation'
+  { -- | The creation date and time (in Unix time) of the feature transformation.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | Provides the default parameters for feature transformation.
+    defaultParameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The Amazon Resource Name (ARN) of the FeatureTransformation object.
+    featureTransformationArn :: Prelude.Maybe Prelude.Text,
+    -- | The last update date and time (in Unix time) of the feature
+    -- transformation.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the feature transformation.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The status of the feature transformation.
+    --
+    -- A feature transformation can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FeatureTransformation' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'featureTransformation_creationDateTime' - The creation date and time (in Unix time) of the feature transformation.
+--
+-- 'defaultParameters', 'featureTransformation_defaultParameters' - Provides the default parameters for feature transformation.
+--
+-- 'featureTransformationArn', 'featureTransformation_featureTransformationArn' - The Amazon Resource Name (ARN) of the FeatureTransformation object.
+--
+-- 'lastUpdatedDateTime', 'featureTransformation_lastUpdatedDateTime' - The last update date and time (in Unix time) of the feature
+-- transformation.
+--
+-- 'name', 'featureTransformation_name' - The name of the feature transformation.
+--
+-- 'status', 'featureTransformation_status' - The status of the feature transformation.
+--
+-- A feature transformation can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+newFeatureTransformation ::
+  FeatureTransformation
+newFeatureTransformation =
+  FeatureTransformation'
+    { creationDateTime =
+        Prelude.Nothing,
+      defaultParameters = Prelude.Nothing,
+      featureTransformationArn = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The creation date and time (in Unix time) of the feature transformation.
+featureTransformation_creationDateTime :: Lens.Lens' FeatureTransformation (Prelude.Maybe Prelude.UTCTime)
+featureTransformation_creationDateTime = Lens.lens (\FeatureTransformation' {creationDateTime} -> creationDateTime) (\s@FeatureTransformation' {} a -> s {creationDateTime = a} :: FeatureTransformation) Prelude.. Lens.mapping Data._Time
+
+-- | Provides the default parameters for feature transformation.
+featureTransformation_defaultParameters :: Lens.Lens' FeatureTransformation (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+featureTransformation_defaultParameters = Lens.lens (\FeatureTransformation' {defaultParameters} -> defaultParameters) (\s@FeatureTransformation' {} a -> s {defaultParameters = a} :: FeatureTransformation) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Name (ARN) of the FeatureTransformation object.
+featureTransformation_featureTransformationArn :: Lens.Lens' FeatureTransformation (Prelude.Maybe Prelude.Text)
+featureTransformation_featureTransformationArn = Lens.lens (\FeatureTransformation' {featureTransformationArn} -> featureTransformationArn) (\s@FeatureTransformation' {} a -> s {featureTransformationArn = a} :: FeatureTransformation)
+
+-- | The last update date and time (in Unix time) of the feature
+-- transformation.
+featureTransformation_lastUpdatedDateTime :: Lens.Lens' FeatureTransformation (Prelude.Maybe Prelude.UTCTime)
+featureTransformation_lastUpdatedDateTime = Lens.lens (\FeatureTransformation' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@FeatureTransformation' {} a -> s {lastUpdatedDateTime = a} :: FeatureTransformation) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the feature transformation.
+featureTransformation_name :: Lens.Lens' FeatureTransformation (Prelude.Maybe Prelude.Text)
+featureTransformation_name = Lens.lens (\FeatureTransformation' {name} -> name) (\s@FeatureTransformation' {} a -> s {name = a} :: FeatureTransformation)
+
+-- | The status of the feature transformation.
+--
+-- A feature transformation can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+featureTransformation_status :: Lens.Lens' FeatureTransformation (Prelude.Maybe Prelude.Text)
+featureTransformation_status = Lens.lens (\FeatureTransformation' {status} -> status) (\s@FeatureTransformation' {} a -> s {status = a} :: FeatureTransformation)
+
+instance Data.FromJSON FeatureTransformation where
+  parseJSON =
+    Data.withObject
+      "FeatureTransformation"
+      ( \x ->
+          FeatureTransformation'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> ( x
+                            Data..:? "defaultParameters"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "featureTransformationArn")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable FeatureTransformation where
+  hashWithSalt _salt FeatureTransformation' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` defaultParameters
+      `Prelude.hashWithSalt` featureTransformationArn
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData FeatureTransformation where
+  rnf FeatureTransformation' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf defaultParameters
+      `Prelude.seq` Prelude.rnf featureTransformationArn
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/Filter.hs b/gen/Amazonka/Personalize/Types/Filter.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/Filter.hs
@@ -0,0 +1,166 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.Filter
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.Filter where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information on a recommendation filter, including its ARN,
+-- status, and filter expression.
+--
+-- /See:/ 'newFilter' smart constructor.
+data Filter = Filter'
+  { -- | The time at which the filter was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The ARN of the dataset group to which the filter belongs.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | If the filter failed, the reason for its failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the filter.
+    filterArn :: Prelude.Maybe Prelude.Text,
+    -- | Specifies the type of item interactions to filter out of recommendation
+    -- results. The filter expression must follow specific format rules. For
+    -- information about filter expression structure and syntax, see
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/filter-expressions.html Filter expressions>.
+    filterExpression :: Prelude.Maybe (Data.Sensitive Prelude.Text),
+    -- | The time at which the filter was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the filter.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The status of the filter.
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Filter' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'filter_creationDateTime' - The time at which the filter was created.
+--
+-- 'datasetGroupArn', 'filter_datasetGroupArn' - The ARN of the dataset group to which the filter belongs.
+--
+-- 'failureReason', 'filter_failureReason' - If the filter failed, the reason for its failure.
+--
+-- 'filterArn', 'filter_filterArn' - The ARN of the filter.
+--
+-- 'filterExpression', 'filter_filterExpression' - Specifies the type of item interactions to filter out of recommendation
+-- results. The filter expression must follow specific format rules. For
+-- information about filter expression structure and syntax, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/filter-expressions.html Filter expressions>.
+--
+-- 'lastUpdatedDateTime', 'filter_lastUpdatedDateTime' - The time at which the filter was last updated.
+--
+-- 'name', 'filter_name' - The name of the filter.
+--
+-- 'status', 'filter_status' - The status of the filter.
+newFilter ::
+  Filter
+newFilter =
+  Filter'
+    { creationDateTime = Prelude.Nothing,
+      datasetGroupArn = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      filterArn = Prelude.Nothing,
+      filterExpression = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The time at which the filter was created.
+filter_creationDateTime :: Lens.Lens' Filter (Prelude.Maybe Prelude.UTCTime)
+filter_creationDateTime = Lens.lens (\Filter' {creationDateTime} -> creationDateTime) (\s@Filter' {} a -> s {creationDateTime = a} :: Filter) Prelude.. Lens.mapping Data._Time
+
+-- | The ARN of the dataset group to which the filter belongs.
+filter_datasetGroupArn :: Lens.Lens' Filter (Prelude.Maybe Prelude.Text)
+filter_datasetGroupArn = Lens.lens (\Filter' {datasetGroupArn} -> datasetGroupArn) (\s@Filter' {} a -> s {datasetGroupArn = a} :: Filter)
+
+-- | If the filter failed, the reason for its failure.
+filter_failureReason :: Lens.Lens' Filter (Prelude.Maybe Prelude.Text)
+filter_failureReason = Lens.lens (\Filter' {failureReason} -> failureReason) (\s@Filter' {} a -> s {failureReason = a} :: Filter)
+
+-- | The ARN of the filter.
+filter_filterArn :: Lens.Lens' Filter (Prelude.Maybe Prelude.Text)
+filter_filterArn = Lens.lens (\Filter' {filterArn} -> filterArn) (\s@Filter' {} a -> s {filterArn = a} :: Filter)
+
+-- | Specifies the type of item interactions to filter out of recommendation
+-- results. The filter expression must follow specific format rules. For
+-- information about filter expression structure and syntax, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/filter-expressions.html Filter expressions>.
+filter_filterExpression :: Lens.Lens' Filter (Prelude.Maybe Prelude.Text)
+filter_filterExpression = Lens.lens (\Filter' {filterExpression} -> filterExpression) (\s@Filter' {} a -> s {filterExpression = a} :: Filter) Prelude.. Lens.mapping Data._Sensitive
+
+-- | The time at which the filter was last updated.
+filter_lastUpdatedDateTime :: Lens.Lens' Filter (Prelude.Maybe Prelude.UTCTime)
+filter_lastUpdatedDateTime = Lens.lens (\Filter' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@Filter' {} a -> s {lastUpdatedDateTime = a} :: Filter) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the filter.
+filter_name :: Lens.Lens' Filter (Prelude.Maybe Prelude.Text)
+filter_name = Lens.lens (\Filter' {name} -> name) (\s@Filter' {} a -> s {name = a} :: Filter)
+
+-- | The status of the filter.
+filter_status :: Lens.Lens' Filter (Prelude.Maybe Prelude.Text)
+filter_status = Lens.lens (\Filter' {status} -> status) (\s@Filter' {} a -> s {status = a} :: Filter)
+
+instance Data.FromJSON Filter where
+  parseJSON =
+    Data.withObject
+      "Filter"
+      ( \x ->
+          Filter'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetGroupArn")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "filterArn")
+            Prelude.<*> (x Data..:? "filterExpression")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable Filter where
+  hashWithSalt _salt Filter' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` filterArn
+      `Prelude.hashWithSalt` filterExpression
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData Filter where
+  rnf Filter' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf filterArn
+      `Prelude.seq` Prelude.rnf filterExpression
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/FilterSummary.hs b/gen/Amazonka/Personalize/Types/FilterSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/FilterSummary.hs
@@ -0,0 +1,144 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.FilterSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.FilterSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | A short summary of a filter\'s attributes.
+--
+-- /See:/ 'newFilterSummary' smart constructor.
+data FilterSummary = FilterSummary'
+  { -- | The time at which the filter was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The ARN of the dataset group to which the filter belongs.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | If the filter failed, the reason for the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the filter.
+    filterArn :: Prelude.Maybe Prelude.Text,
+    -- | The time at which the filter was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the filter.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The status of the filter.
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'FilterSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'filterSummary_creationDateTime' - The time at which the filter was created.
+--
+-- 'datasetGroupArn', 'filterSummary_datasetGroupArn' - The ARN of the dataset group to which the filter belongs.
+--
+-- 'failureReason', 'filterSummary_failureReason' - If the filter failed, the reason for the failure.
+--
+-- 'filterArn', 'filterSummary_filterArn' - The ARN of the filter.
+--
+-- 'lastUpdatedDateTime', 'filterSummary_lastUpdatedDateTime' - The time at which the filter was last updated.
+--
+-- 'name', 'filterSummary_name' - The name of the filter.
+--
+-- 'status', 'filterSummary_status' - The status of the filter.
+newFilterSummary ::
+  FilterSummary
+newFilterSummary =
+  FilterSummary'
+    { creationDateTime = Prelude.Nothing,
+      datasetGroupArn = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      filterArn = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The time at which the filter was created.
+filterSummary_creationDateTime :: Lens.Lens' FilterSummary (Prelude.Maybe Prelude.UTCTime)
+filterSummary_creationDateTime = Lens.lens (\FilterSummary' {creationDateTime} -> creationDateTime) (\s@FilterSummary' {} a -> s {creationDateTime = a} :: FilterSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The ARN of the dataset group to which the filter belongs.
+filterSummary_datasetGroupArn :: Lens.Lens' FilterSummary (Prelude.Maybe Prelude.Text)
+filterSummary_datasetGroupArn = Lens.lens (\FilterSummary' {datasetGroupArn} -> datasetGroupArn) (\s@FilterSummary' {} a -> s {datasetGroupArn = a} :: FilterSummary)
+
+-- | If the filter failed, the reason for the failure.
+filterSummary_failureReason :: Lens.Lens' FilterSummary (Prelude.Maybe Prelude.Text)
+filterSummary_failureReason = Lens.lens (\FilterSummary' {failureReason} -> failureReason) (\s@FilterSummary' {} a -> s {failureReason = a} :: FilterSummary)
+
+-- | The ARN of the filter.
+filterSummary_filterArn :: Lens.Lens' FilterSummary (Prelude.Maybe Prelude.Text)
+filterSummary_filterArn = Lens.lens (\FilterSummary' {filterArn} -> filterArn) (\s@FilterSummary' {} a -> s {filterArn = a} :: FilterSummary)
+
+-- | The time at which the filter was last updated.
+filterSummary_lastUpdatedDateTime :: Lens.Lens' FilterSummary (Prelude.Maybe Prelude.UTCTime)
+filterSummary_lastUpdatedDateTime = Lens.lens (\FilterSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@FilterSummary' {} a -> s {lastUpdatedDateTime = a} :: FilterSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the filter.
+filterSummary_name :: Lens.Lens' FilterSummary (Prelude.Maybe Prelude.Text)
+filterSummary_name = Lens.lens (\FilterSummary' {name} -> name) (\s@FilterSummary' {} a -> s {name = a} :: FilterSummary)
+
+-- | The status of the filter.
+filterSummary_status :: Lens.Lens' FilterSummary (Prelude.Maybe Prelude.Text)
+filterSummary_status = Lens.lens (\FilterSummary' {status} -> status) (\s@FilterSummary' {} a -> s {status = a} :: FilterSummary)
+
+instance Data.FromJSON FilterSummary where
+  parseJSON =
+    Data.withObject
+      "FilterSummary"
+      ( \x ->
+          FilterSummary'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetGroupArn")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "filterArn")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable FilterSummary where
+  hashWithSalt _salt FilterSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` filterArn
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData FilterSummary where
+  rnf FilterSummary' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf filterArn
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/HPOConfig.hs b/gen/Amazonka/Personalize/Types/HPOConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/HPOConfig.hs
@@ -0,0 +1,121 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.HPOConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.HPOConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.HPOObjective
+import Amazonka.Personalize.Types.HPOResourceConfig
+import Amazonka.Personalize.Types.HyperParameterRanges
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the properties for hyperparameter optimization (HPO).
+--
+-- /See:/ 'newHPOConfig' smart constructor.
+data HPOConfig = HPOConfig'
+  { -- | The hyperparameters and their allowable ranges.
+    algorithmHyperParameterRanges :: Prelude.Maybe HyperParameterRanges,
+    -- | The metric to optimize during HPO.
+    --
+    -- Amazon Personalize doesn\'t support configuring the @hpoObjective@ at
+    -- this time.
+    hpoObjective :: Prelude.Maybe HPOObjective,
+    -- | Describes the resource configuration for HPO.
+    hpoResourceConfig :: Prelude.Maybe HPOResourceConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HPOConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'algorithmHyperParameterRanges', 'hPOConfig_algorithmHyperParameterRanges' - The hyperparameters and their allowable ranges.
+--
+-- 'hpoObjective', 'hPOConfig_hpoObjective' - The metric to optimize during HPO.
+--
+-- Amazon Personalize doesn\'t support configuring the @hpoObjective@ at
+-- this time.
+--
+-- 'hpoResourceConfig', 'hPOConfig_hpoResourceConfig' - Describes the resource configuration for HPO.
+newHPOConfig ::
+  HPOConfig
+newHPOConfig =
+  HPOConfig'
+    { algorithmHyperParameterRanges =
+        Prelude.Nothing,
+      hpoObjective = Prelude.Nothing,
+      hpoResourceConfig = Prelude.Nothing
+    }
+
+-- | The hyperparameters and their allowable ranges.
+hPOConfig_algorithmHyperParameterRanges :: Lens.Lens' HPOConfig (Prelude.Maybe HyperParameterRanges)
+hPOConfig_algorithmHyperParameterRanges = Lens.lens (\HPOConfig' {algorithmHyperParameterRanges} -> algorithmHyperParameterRanges) (\s@HPOConfig' {} a -> s {algorithmHyperParameterRanges = a} :: HPOConfig)
+
+-- | The metric to optimize during HPO.
+--
+-- Amazon Personalize doesn\'t support configuring the @hpoObjective@ at
+-- this time.
+hPOConfig_hpoObjective :: Lens.Lens' HPOConfig (Prelude.Maybe HPOObjective)
+hPOConfig_hpoObjective = Lens.lens (\HPOConfig' {hpoObjective} -> hpoObjective) (\s@HPOConfig' {} a -> s {hpoObjective = a} :: HPOConfig)
+
+-- | Describes the resource configuration for HPO.
+hPOConfig_hpoResourceConfig :: Lens.Lens' HPOConfig (Prelude.Maybe HPOResourceConfig)
+hPOConfig_hpoResourceConfig = Lens.lens (\HPOConfig' {hpoResourceConfig} -> hpoResourceConfig) (\s@HPOConfig' {} a -> s {hpoResourceConfig = a} :: HPOConfig)
+
+instance Data.FromJSON HPOConfig where
+  parseJSON =
+    Data.withObject
+      "HPOConfig"
+      ( \x ->
+          HPOConfig'
+            Prelude.<$> (x Data..:? "algorithmHyperParameterRanges")
+            Prelude.<*> (x Data..:? "hpoObjective")
+            Prelude.<*> (x Data..:? "hpoResourceConfig")
+      )
+
+instance Prelude.Hashable HPOConfig where
+  hashWithSalt _salt HPOConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` algorithmHyperParameterRanges
+      `Prelude.hashWithSalt` hpoObjective
+      `Prelude.hashWithSalt` hpoResourceConfig
+
+instance Prelude.NFData HPOConfig where
+  rnf HPOConfig' {..} =
+    Prelude.rnf algorithmHyperParameterRanges
+      `Prelude.seq` Prelude.rnf hpoObjective
+      `Prelude.seq` Prelude.rnf hpoResourceConfig
+
+instance Data.ToJSON HPOConfig where
+  toJSON HPOConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("algorithmHyperParameterRanges" Data..=)
+              Prelude.<$> algorithmHyperParameterRanges,
+            ("hpoObjective" Data..=) Prelude.<$> hpoObjective,
+            ("hpoResourceConfig" Data..=)
+              Prelude.<$> hpoResourceConfig
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/HPOObjective.hs b/gen/Amazonka/Personalize/Types/HPOObjective.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/HPOObjective.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.HPOObjective
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.HPOObjective where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The metric to optimize during hyperparameter optimization (HPO).
+--
+-- Amazon Personalize doesn\'t support configuring the @hpoObjective@ at
+-- this time.
+--
+-- /See:/ 'newHPOObjective' smart constructor.
+data HPOObjective = HPOObjective'
+  { -- | The name of the metric.
+    metricName :: Prelude.Maybe Prelude.Text,
+    -- | A regular expression for finding the metric in the training job logs.
+    metricRegex :: Prelude.Maybe Prelude.Text,
+    -- | The type of the metric. Valid values are @Maximize@ and @Minimize@.
+    type' :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HPOObjective' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metricName', 'hPOObjective_metricName' - The name of the metric.
+--
+-- 'metricRegex', 'hPOObjective_metricRegex' - A regular expression for finding the metric in the training job logs.
+--
+-- 'type'', 'hPOObjective_type' - The type of the metric. Valid values are @Maximize@ and @Minimize@.
+newHPOObjective ::
+  HPOObjective
+newHPOObjective =
+  HPOObjective'
+    { metricName = Prelude.Nothing,
+      metricRegex = Prelude.Nothing,
+      type' = Prelude.Nothing
+    }
+
+-- | The name of the metric.
+hPOObjective_metricName :: Lens.Lens' HPOObjective (Prelude.Maybe Prelude.Text)
+hPOObjective_metricName = Lens.lens (\HPOObjective' {metricName} -> metricName) (\s@HPOObjective' {} a -> s {metricName = a} :: HPOObjective)
+
+-- | A regular expression for finding the metric in the training job logs.
+hPOObjective_metricRegex :: Lens.Lens' HPOObjective (Prelude.Maybe Prelude.Text)
+hPOObjective_metricRegex = Lens.lens (\HPOObjective' {metricRegex} -> metricRegex) (\s@HPOObjective' {} a -> s {metricRegex = a} :: HPOObjective)
+
+-- | The type of the metric. Valid values are @Maximize@ and @Minimize@.
+hPOObjective_type :: Lens.Lens' HPOObjective (Prelude.Maybe Prelude.Text)
+hPOObjective_type = Lens.lens (\HPOObjective' {type'} -> type') (\s@HPOObjective' {} a -> s {type' = a} :: HPOObjective)
+
+instance Data.FromJSON HPOObjective where
+  parseJSON =
+    Data.withObject
+      "HPOObjective"
+      ( \x ->
+          HPOObjective'
+            Prelude.<$> (x Data..:? "metricName")
+            Prelude.<*> (x Data..:? "metricRegex")
+            Prelude.<*> (x Data..:? "type")
+      )
+
+instance Prelude.Hashable HPOObjective where
+  hashWithSalt _salt HPOObjective' {..} =
+    _salt
+      `Prelude.hashWithSalt` metricName
+      `Prelude.hashWithSalt` metricRegex
+      `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData HPOObjective where
+  rnf HPOObjective' {..} =
+    Prelude.rnf metricName
+      `Prelude.seq` Prelude.rnf metricRegex
+      `Prelude.seq` Prelude.rnf type'
+
+instance Data.ToJSON HPOObjective where
+  toJSON HPOObjective' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("metricName" Data..=) Prelude.<$> metricName,
+            ("metricRegex" Data..=) Prelude.<$> metricRegex,
+            ("type" Data..=) Prelude.<$> type'
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/HPOResourceConfig.hs b/gen/Amazonka/Personalize/Types/HPOResourceConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/HPOResourceConfig.hs
@@ -0,0 +1,103 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.HPOResourceConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.HPOResourceConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the resource configuration for hyperparameter optimization
+-- (HPO).
+--
+-- /See:/ 'newHPOResourceConfig' smart constructor.
+data HPOResourceConfig = HPOResourceConfig'
+  { -- | The maximum number of training jobs when you create a solution version.
+    -- The maximum value for @maxNumberOfTrainingJobs@ is @40@.
+    maxNumberOfTrainingJobs :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of parallel training jobs when you create a solution
+    -- version. The maximum value for @maxParallelTrainingJobs@ is @10@.
+    maxParallelTrainingJobs :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HPOResourceConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxNumberOfTrainingJobs', 'hPOResourceConfig_maxNumberOfTrainingJobs' - The maximum number of training jobs when you create a solution version.
+-- The maximum value for @maxNumberOfTrainingJobs@ is @40@.
+--
+-- 'maxParallelTrainingJobs', 'hPOResourceConfig_maxParallelTrainingJobs' - The maximum number of parallel training jobs when you create a solution
+-- version. The maximum value for @maxParallelTrainingJobs@ is @10@.
+newHPOResourceConfig ::
+  HPOResourceConfig
+newHPOResourceConfig =
+  HPOResourceConfig'
+    { maxNumberOfTrainingJobs =
+        Prelude.Nothing,
+      maxParallelTrainingJobs = Prelude.Nothing
+    }
+
+-- | The maximum number of training jobs when you create a solution version.
+-- The maximum value for @maxNumberOfTrainingJobs@ is @40@.
+hPOResourceConfig_maxNumberOfTrainingJobs :: Lens.Lens' HPOResourceConfig (Prelude.Maybe Prelude.Text)
+hPOResourceConfig_maxNumberOfTrainingJobs = Lens.lens (\HPOResourceConfig' {maxNumberOfTrainingJobs} -> maxNumberOfTrainingJobs) (\s@HPOResourceConfig' {} a -> s {maxNumberOfTrainingJobs = a} :: HPOResourceConfig)
+
+-- | The maximum number of parallel training jobs when you create a solution
+-- version. The maximum value for @maxParallelTrainingJobs@ is @10@.
+hPOResourceConfig_maxParallelTrainingJobs :: Lens.Lens' HPOResourceConfig (Prelude.Maybe Prelude.Text)
+hPOResourceConfig_maxParallelTrainingJobs = Lens.lens (\HPOResourceConfig' {maxParallelTrainingJobs} -> maxParallelTrainingJobs) (\s@HPOResourceConfig' {} a -> s {maxParallelTrainingJobs = a} :: HPOResourceConfig)
+
+instance Data.FromJSON HPOResourceConfig where
+  parseJSON =
+    Data.withObject
+      "HPOResourceConfig"
+      ( \x ->
+          HPOResourceConfig'
+            Prelude.<$> (x Data..:? "maxNumberOfTrainingJobs")
+            Prelude.<*> (x Data..:? "maxParallelTrainingJobs")
+      )
+
+instance Prelude.Hashable HPOResourceConfig where
+  hashWithSalt _salt HPOResourceConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxNumberOfTrainingJobs
+      `Prelude.hashWithSalt` maxParallelTrainingJobs
+
+instance Prelude.NFData HPOResourceConfig where
+  rnf HPOResourceConfig' {..} =
+    Prelude.rnf maxNumberOfTrainingJobs
+      `Prelude.seq` Prelude.rnf maxParallelTrainingJobs
+
+instance Data.ToJSON HPOResourceConfig where
+  toJSON HPOResourceConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxNumberOfTrainingJobs" Data..=)
+              Prelude.<$> maxNumberOfTrainingJobs,
+            ("maxParallelTrainingJobs" Data..=)
+              Prelude.<$> maxParallelTrainingJobs
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/HyperParameterRanges.hs b/gen/Amazonka/Personalize/Types/HyperParameterRanges.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/HyperParameterRanges.hs
@@ -0,0 +1,123 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.HyperParameterRanges
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.HyperParameterRanges where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.CategoricalHyperParameterRange
+import Amazonka.Personalize.Types.ContinuousHyperParameterRange
+import Amazonka.Personalize.Types.IntegerHyperParameterRange
+import qualified Amazonka.Prelude as Prelude
+
+-- | Specifies the hyperparameters and their ranges. Hyperparameters can be
+-- categorical, continuous, or integer-valued.
+--
+-- /See:/ 'newHyperParameterRanges' smart constructor.
+data HyperParameterRanges = HyperParameterRanges'
+  { -- | The categorical hyperparameters and their ranges.
+    categoricalHyperParameterRanges :: Prelude.Maybe [CategoricalHyperParameterRange],
+    -- | The continuous hyperparameters and their ranges.
+    continuousHyperParameterRanges :: Prelude.Maybe [ContinuousHyperParameterRange],
+    -- | The integer-valued hyperparameters and their ranges.
+    integerHyperParameterRanges :: Prelude.Maybe [IntegerHyperParameterRange]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'HyperParameterRanges' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'categoricalHyperParameterRanges', 'hyperParameterRanges_categoricalHyperParameterRanges' - The categorical hyperparameters and their ranges.
+--
+-- 'continuousHyperParameterRanges', 'hyperParameterRanges_continuousHyperParameterRanges' - The continuous hyperparameters and their ranges.
+--
+-- 'integerHyperParameterRanges', 'hyperParameterRanges_integerHyperParameterRanges' - The integer-valued hyperparameters and their ranges.
+newHyperParameterRanges ::
+  HyperParameterRanges
+newHyperParameterRanges =
+  HyperParameterRanges'
+    { categoricalHyperParameterRanges =
+        Prelude.Nothing,
+      continuousHyperParameterRanges = Prelude.Nothing,
+      integerHyperParameterRanges = Prelude.Nothing
+    }
+
+-- | The categorical hyperparameters and their ranges.
+hyperParameterRanges_categoricalHyperParameterRanges :: Lens.Lens' HyperParameterRanges (Prelude.Maybe [CategoricalHyperParameterRange])
+hyperParameterRanges_categoricalHyperParameterRanges = Lens.lens (\HyperParameterRanges' {categoricalHyperParameterRanges} -> categoricalHyperParameterRanges) (\s@HyperParameterRanges' {} a -> s {categoricalHyperParameterRanges = a} :: HyperParameterRanges) Prelude.. Lens.mapping Lens.coerced
+
+-- | The continuous hyperparameters and their ranges.
+hyperParameterRanges_continuousHyperParameterRanges :: Lens.Lens' HyperParameterRanges (Prelude.Maybe [ContinuousHyperParameterRange])
+hyperParameterRanges_continuousHyperParameterRanges = Lens.lens (\HyperParameterRanges' {continuousHyperParameterRanges} -> continuousHyperParameterRanges) (\s@HyperParameterRanges' {} a -> s {continuousHyperParameterRanges = a} :: HyperParameterRanges) Prelude.. Lens.mapping Lens.coerced
+
+-- | The integer-valued hyperparameters and their ranges.
+hyperParameterRanges_integerHyperParameterRanges :: Lens.Lens' HyperParameterRanges (Prelude.Maybe [IntegerHyperParameterRange])
+hyperParameterRanges_integerHyperParameterRanges = Lens.lens (\HyperParameterRanges' {integerHyperParameterRanges} -> integerHyperParameterRanges) (\s@HyperParameterRanges' {} a -> s {integerHyperParameterRanges = a} :: HyperParameterRanges) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON HyperParameterRanges where
+  parseJSON =
+    Data.withObject
+      "HyperParameterRanges"
+      ( \x ->
+          HyperParameterRanges'
+            Prelude.<$> ( x
+                            Data..:? "categoricalHyperParameterRanges"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..:? "continuousHyperParameterRanges"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> ( x
+                            Data..:? "integerHyperParameterRanges"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable HyperParameterRanges where
+  hashWithSalt _salt HyperParameterRanges' {..} =
+    _salt
+      `Prelude.hashWithSalt` categoricalHyperParameterRanges
+      `Prelude.hashWithSalt` continuousHyperParameterRanges
+      `Prelude.hashWithSalt` integerHyperParameterRanges
+
+instance Prelude.NFData HyperParameterRanges where
+  rnf HyperParameterRanges' {..} =
+    Prelude.rnf categoricalHyperParameterRanges
+      `Prelude.seq` Prelude.rnf continuousHyperParameterRanges
+      `Prelude.seq` Prelude.rnf integerHyperParameterRanges
+
+instance Data.ToJSON HyperParameterRanges where
+  toJSON HyperParameterRanges' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("categoricalHyperParameterRanges" Data..=)
+              Prelude.<$> categoricalHyperParameterRanges,
+            ("continuousHyperParameterRanges" Data..=)
+              Prelude.<$> continuousHyperParameterRanges,
+            ("integerHyperParameterRanges" Data..=)
+              Prelude.<$> integerHyperParameterRanges
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/ImportMode.hs b/gen/Amazonka/Personalize/Types/ImportMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/ImportMode.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.ImportMode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.ImportMode
+  ( ImportMode
+      ( ..,
+        ImportMode_FULL,
+        ImportMode_INCREMENTAL
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ImportMode = ImportMode'
+  { fromImportMode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ImportMode_FULL :: ImportMode
+pattern ImportMode_FULL = ImportMode' "FULL"
+
+pattern ImportMode_INCREMENTAL :: ImportMode
+pattern ImportMode_INCREMENTAL = ImportMode' "INCREMENTAL"
+
+{-# COMPLETE
+  ImportMode_FULL,
+  ImportMode_INCREMENTAL,
+  ImportMode'
+  #-}
diff --git a/gen/Amazonka/Personalize/Types/IngestionMode.hs b/gen/Amazonka/Personalize/Types/IngestionMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/IngestionMode.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.IngestionMode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.IngestionMode
+  ( IngestionMode
+      ( ..,
+        IngestionMode_ALL,
+        IngestionMode_BULK,
+        IngestionMode_PUT
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype IngestionMode = IngestionMode'
+  { fromIngestionMode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern IngestionMode_ALL :: IngestionMode
+pattern IngestionMode_ALL = IngestionMode' "ALL"
+
+pattern IngestionMode_BULK :: IngestionMode
+pattern IngestionMode_BULK = IngestionMode' "BULK"
+
+pattern IngestionMode_PUT :: IngestionMode
+pattern IngestionMode_PUT = IngestionMode' "PUT"
+
+{-# COMPLETE
+  IngestionMode_ALL,
+  IngestionMode_BULK,
+  IngestionMode_PUT,
+  IngestionMode'
+  #-}
diff --git a/gen/Amazonka/Personalize/Types/IntegerHyperParameterRange.hs b/gen/Amazonka/Personalize/Types/IntegerHyperParameterRange.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/IntegerHyperParameterRange.hs
@@ -0,0 +1,107 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.IntegerHyperParameterRange
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.IntegerHyperParameterRange where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides the name and range of an integer-valued hyperparameter.
+--
+-- /See:/ 'newIntegerHyperParameterRange' smart constructor.
+data IntegerHyperParameterRange = IntegerHyperParameterRange'
+  { -- | The maximum allowable value for the hyperparameter.
+    maxValue :: Prelude.Maybe Prelude.Int,
+    -- | The minimum allowable value for the hyperparameter.
+    minValue :: Prelude.Maybe Prelude.Int,
+    -- | The name of the hyperparameter.
+    name :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'IntegerHyperParameterRange' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'maxValue', 'integerHyperParameterRange_maxValue' - The maximum allowable value for the hyperparameter.
+--
+-- 'minValue', 'integerHyperParameterRange_minValue' - The minimum allowable value for the hyperparameter.
+--
+-- 'name', 'integerHyperParameterRange_name' - The name of the hyperparameter.
+newIntegerHyperParameterRange ::
+  IntegerHyperParameterRange
+newIntegerHyperParameterRange =
+  IntegerHyperParameterRange'
+    { maxValue =
+        Prelude.Nothing,
+      minValue = Prelude.Nothing,
+      name = Prelude.Nothing
+    }
+
+-- | The maximum allowable value for the hyperparameter.
+integerHyperParameterRange_maxValue :: Lens.Lens' IntegerHyperParameterRange (Prelude.Maybe Prelude.Int)
+integerHyperParameterRange_maxValue = Lens.lens (\IntegerHyperParameterRange' {maxValue} -> maxValue) (\s@IntegerHyperParameterRange' {} a -> s {maxValue = a} :: IntegerHyperParameterRange)
+
+-- | The minimum allowable value for the hyperparameter.
+integerHyperParameterRange_minValue :: Lens.Lens' IntegerHyperParameterRange (Prelude.Maybe Prelude.Int)
+integerHyperParameterRange_minValue = Lens.lens (\IntegerHyperParameterRange' {minValue} -> minValue) (\s@IntegerHyperParameterRange' {} a -> s {minValue = a} :: IntegerHyperParameterRange)
+
+-- | The name of the hyperparameter.
+integerHyperParameterRange_name :: Lens.Lens' IntegerHyperParameterRange (Prelude.Maybe Prelude.Text)
+integerHyperParameterRange_name = Lens.lens (\IntegerHyperParameterRange' {name} -> name) (\s@IntegerHyperParameterRange' {} a -> s {name = a} :: IntegerHyperParameterRange)
+
+instance Data.FromJSON IntegerHyperParameterRange where
+  parseJSON =
+    Data.withObject
+      "IntegerHyperParameterRange"
+      ( \x ->
+          IntegerHyperParameterRange'
+            Prelude.<$> (x Data..:? "maxValue")
+            Prelude.<*> (x Data..:? "minValue")
+            Prelude.<*> (x Data..:? "name")
+      )
+
+instance Prelude.Hashable IntegerHyperParameterRange where
+  hashWithSalt _salt IntegerHyperParameterRange' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxValue
+      `Prelude.hashWithSalt` minValue
+      `Prelude.hashWithSalt` name
+
+instance Prelude.NFData IntegerHyperParameterRange where
+  rnf IntegerHyperParameterRange' {..} =
+    Prelude.rnf maxValue
+      `Prelude.seq` Prelude.rnf minValue
+      `Prelude.seq` Prelude.rnf name
+
+instance Data.ToJSON IntegerHyperParameterRange where
+  toJSON IntegerHyperParameterRange' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("maxValue" Data..=) Prelude.<$> maxValue,
+            ("minValue" Data..=) Prelude.<$> minValue,
+            ("name" Data..=) Prelude.<$> name
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/MetricAttribute.hs b/gen/Amazonka/Personalize/Types/MetricAttribute.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/MetricAttribute.hs
@@ -0,0 +1,129 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.MetricAttribute
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.MetricAttribute where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information on a metric that a metric attribution reports on.
+-- For more information, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/measuring-recommendation-impact.html Measuring impact of recommendations>.
+--
+-- /See:/ 'newMetricAttribute' smart constructor.
+data MetricAttribute = MetricAttribute'
+  { -- | The metric\'s event type.
+    eventType :: Prelude.Text,
+    -- | The metric\'s name. The name helps you identify the metric in Amazon
+    -- CloudWatch or Amazon S3.
+    metricName :: Prelude.Text,
+    -- | The attribute\'s expression. Available functions are @SUM()@ or
+    -- @SAMPLECOUNT()@. For SUM() functions, provide the dataset type (either
+    -- Interactions or Items) and column to sum as a parameter. For example
+    -- SUM(Items.PRICE).
+    expression :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MetricAttribute' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'eventType', 'metricAttribute_eventType' - The metric\'s event type.
+--
+-- 'metricName', 'metricAttribute_metricName' - The metric\'s name. The name helps you identify the metric in Amazon
+-- CloudWatch or Amazon S3.
+--
+-- 'expression', 'metricAttribute_expression' - The attribute\'s expression. Available functions are @SUM()@ or
+-- @SAMPLECOUNT()@. For SUM() functions, provide the dataset type (either
+-- Interactions or Items) and column to sum as a parameter. For example
+-- SUM(Items.PRICE).
+newMetricAttribute ::
+  -- | 'eventType'
+  Prelude.Text ->
+  -- | 'metricName'
+  Prelude.Text ->
+  -- | 'expression'
+  Prelude.Text ->
+  MetricAttribute
+newMetricAttribute
+  pEventType_
+  pMetricName_
+  pExpression_ =
+    MetricAttribute'
+      { eventType = pEventType_,
+        metricName = pMetricName_,
+        expression = pExpression_
+      }
+
+-- | The metric\'s event type.
+metricAttribute_eventType :: Lens.Lens' MetricAttribute Prelude.Text
+metricAttribute_eventType = Lens.lens (\MetricAttribute' {eventType} -> eventType) (\s@MetricAttribute' {} a -> s {eventType = a} :: MetricAttribute)
+
+-- | The metric\'s name. The name helps you identify the metric in Amazon
+-- CloudWatch or Amazon S3.
+metricAttribute_metricName :: Lens.Lens' MetricAttribute Prelude.Text
+metricAttribute_metricName = Lens.lens (\MetricAttribute' {metricName} -> metricName) (\s@MetricAttribute' {} a -> s {metricName = a} :: MetricAttribute)
+
+-- | The attribute\'s expression. Available functions are @SUM()@ or
+-- @SAMPLECOUNT()@. For SUM() functions, provide the dataset type (either
+-- Interactions or Items) and column to sum as a parameter. For example
+-- SUM(Items.PRICE).
+metricAttribute_expression :: Lens.Lens' MetricAttribute Prelude.Text
+metricAttribute_expression = Lens.lens (\MetricAttribute' {expression} -> expression) (\s@MetricAttribute' {} a -> s {expression = a} :: MetricAttribute)
+
+instance Data.FromJSON MetricAttribute where
+  parseJSON =
+    Data.withObject
+      "MetricAttribute"
+      ( \x ->
+          MetricAttribute'
+            Prelude.<$> (x Data..: "eventType")
+            Prelude.<*> (x Data..: "metricName")
+            Prelude.<*> (x Data..: "expression")
+      )
+
+instance Prelude.Hashable MetricAttribute where
+  hashWithSalt _salt MetricAttribute' {..} =
+    _salt
+      `Prelude.hashWithSalt` eventType
+      `Prelude.hashWithSalt` metricName
+      `Prelude.hashWithSalt` expression
+
+instance Prelude.NFData MetricAttribute where
+  rnf MetricAttribute' {..} =
+    Prelude.rnf eventType
+      `Prelude.seq` Prelude.rnf metricName
+      `Prelude.seq` Prelude.rnf expression
+
+instance Data.ToJSON MetricAttribute where
+  toJSON MetricAttribute' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("eventType" Data..= eventType),
+            Prelude.Just ("metricName" Data..= metricName),
+            Prelude.Just ("expression" Data..= expression)
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/MetricAttribution.hs b/gen/Amazonka/Personalize/Types/MetricAttribution.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/MetricAttribution.hs
@@ -0,0 +1,162 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.MetricAttribution
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.MetricAttribution where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.MetricAttributionOutput
+import qualified Amazonka.Prelude as Prelude
+
+-- | Contains information on a metric attribution. A metric attribution
+-- creates reports on the data that you import into Amazon Personalize.
+-- Depending on how you import the data, you can view reports in Amazon
+-- CloudWatch or Amazon S3. For more information, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/measuring-recommendation-impact.html Measuring impact of recommendations>.
+--
+-- /See:/ 'newMetricAttribution' smart constructor.
+data MetricAttribution = MetricAttribution'
+  { -- | The metric attribution\'s creation date time.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The metric attribution\'s dataset group Amazon Resource Name (ARN).
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The metric attribution\'s failure reason.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The metric attribution\'s last updated date time.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The metric attribution\'s Amazon Resource Name (ARN).
+    metricAttributionArn :: Prelude.Maybe Prelude.Text,
+    -- | The metric attribution\'s output configuration.
+    metricsOutputConfig :: Prelude.Maybe MetricAttributionOutput,
+    -- | The metric attribution\'s name.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The metric attribution\'s status.
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MetricAttribution' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'metricAttribution_creationDateTime' - The metric attribution\'s creation date time.
+--
+-- 'datasetGroupArn', 'metricAttribution_datasetGroupArn' - The metric attribution\'s dataset group Amazon Resource Name (ARN).
+--
+-- 'failureReason', 'metricAttribution_failureReason' - The metric attribution\'s failure reason.
+--
+-- 'lastUpdatedDateTime', 'metricAttribution_lastUpdatedDateTime' - The metric attribution\'s last updated date time.
+--
+-- 'metricAttributionArn', 'metricAttribution_metricAttributionArn' - The metric attribution\'s Amazon Resource Name (ARN).
+--
+-- 'metricsOutputConfig', 'metricAttribution_metricsOutputConfig' - The metric attribution\'s output configuration.
+--
+-- 'name', 'metricAttribution_name' - The metric attribution\'s name.
+--
+-- 'status', 'metricAttribution_status' - The metric attribution\'s status.
+newMetricAttribution ::
+  MetricAttribution
+newMetricAttribution =
+  MetricAttribution'
+    { creationDateTime =
+        Prelude.Nothing,
+      datasetGroupArn = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      metricAttributionArn = Prelude.Nothing,
+      metricsOutputConfig = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The metric attribution\'s creation date time.
+metricAttribution_creationDateTime :: Lens.Lens' MetricAttribution (Prelude.Maybe Prelude.UTCTime)
+metricAttribution_creationDateTime = Lens.lens (\MetricAttribution' {creationDateTime} -> creationDateTime) (\s@MetricAttribution' {} a -> s {creationDateTime = a} :: MetricAttribution) Prelude.. Lens.mapping Data._Time
+
+-- | The metric attribution\'s dataset group Amazon Resource Name (ARN).
+metricAttribution_datasetGroupArn :: Lens.Lens' MetricAttribution (Prelude.Maybe Prelude.Text)
+metricAttribution_datasetGroupArn = Lens.lens (\MetricAttribution' {datasetGroupArn} -> datasetGroupArn) (\s@MetricAttribution' {} a -> s {datasetGroupArn = a} :: MetricAttribution)
+
+-- | The metric attribution\'s failure reason.
+metricAttribution_failureReason :: Lens.Lens' MetricAttribution (Prelude.Maybe Prelude.Text)
+metricAttribution_failureReason = Lens.lens (\MetricAttribution' {failureReason} -> failureReason) (\s@MetricAttribution' {} a -> s {failureReason = a} :: MetricAttribution)
+
+-- | The metric attribution\'s last updated date time.
+metricAttribution_lastUpdatedDateTime :: Lens.Lens' MetricAttribution (Prelude.Maybe Prelude.UTCTime)
+metricAttribution_lastUpdatedDateTime = Lens.lens (\MetricAttribution' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@MetricAttribution' {} a -> s {lastUpdatedDateTime = a} :: MetricAttribution) Prelude.. Lens.mapping Data._Time
+
+-- | The metric attribution\'s Amazon Resource Name (ARN).
+metricAttribution_metricAttributionArn :: Lens.Lens' MetricAttribution (Prelude.Maybe Prelude.Text)
+metricAttribution_metricAttributionArn = Lens.lens (\MetricAttribution' {metricAttributionArn} -> metricAttributionArn) (\s@MetricAttribution' {} a -> s {metricAttributionArn = a} :: MetricAttribution)
+
+-- | The metric attribution\'s output configuration.
+metricAttribution_metricsOutputConfig :: Lens.Lens' MetricAttribution (Prelude.Maybe MetricAttributionOutput)
+metricAttribution_metricsOutputConfig = Lens.lens (\MetricAttribution' {metricsOutputConfig} -> metricsOutputConfig) (\s@MetricAttribution' {} a -> s {metricsOutputConfig = a} :: MetricAttribution)
+
+-- | The metric attribution\'s name.
+metricAttribution_name :: Lens.Lens' MetricAttribution (Prelude.Maybe Prelude.Text)
+metricAttribution_name = Lens.lens (\MetricAttribution' {name} -> name) (\s@MetricAttribution' {} a -> s {name = a} :: MetricAttribution)
+
+-- | The metric attribution\'s status.
+metricAttribution_status :: Lens.Lens' MetricAttribution (Prelude.Maybe Prelude.Text)
+metricAttribution_status = Lens.lens (\MetricAttribution' {status} -> status) (\s@MetricAttribution' {} a -> s {status = a} :: MetricAttribution)
+
+instance Data.FromJSON MetricAttribution where
+  parseJSON =
+    Data.withObject
+      "MetricAttribution"
+      ( \x ->
+          MetricAttribution'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetGroupArn")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "metricAttributionArn")
+            Prelude.<*> (x Data..:? "metricsOutputConfig")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable MetricAttribution where
+  hashWithSalt _salt MetricAttribution' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` metricAttributionArn
+      `Prelude.hashWithSalt` metricsOutputConfig
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData MetricAttribution where
+  rnf MetricAttribution' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf metricAttributionArn
+      `Prelude.seq` Prelude.rnf metricsOutputConfig
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/MetricAttributionOutput.hs b/gen/Amazonka/Personalize/Types/MetricAttributionOutput.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/MetricAttributionOutput.hs
@@ -0,0 +1,106 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.MetricAttributionOutput
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.MetricAttributionOutput where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.S3DataConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | The output configuration details for a metric attribution.
+--
+-- /See:/ 'newMetricAttributionOutput' smart constructor.
+data MetricAttributionOutput = MetricAttributionOutput'
+  { s3DataDestination :: Prelude.Maybe S3DataConfig,
+    -- | The Amazon Resource Name (ARN) of the IAM service role that has
+    -- permissions to add data to your output Amazon S3 bucket and add metrics
+    -- to Amazon CloudWatch. For more information, see
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/measuring-recommendation-impact.html Measuring impact of recommendations>.
+    roleArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MetricAttributionOutput' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 's3DataDestination', 'metricAttributionOutput_s3DataDestination' - Undocumented member.
+--
+-- 'roleArn', 'metricAttributionOutput_roleArn' - The Amazon Resource Name (ARN) of the IAM service role that has
+-- permissions to add data to your output Amazon S3 bucket and add metrics
+-- to Amazon CloudWatch. For more information, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/measuring-recommendation-impact.html Measuring impact of recommendations>.
+newMetricAttributionOutput ::
+  -- | 'roleArn'
+  Prelude.Text ->
+  MetricAttributionOutput
+newMetricAttributionOutput pRoleArn_ =
+  MetricAttributionOutput'
+    { s3DataDestination =
+        Prelude.Nothing,
+      roleArn = pRoleArn_
+    }
+
+-- | Undocumented member.
+metricAttributionOutput_s3DataDestination :: Lens.Lens' MetricAttributionOutput (Prelude.Maybe S3DataConfig)
+metricAttributionOutput_s3DataDestination = Lens.lens (\MetricAttributionOutput' {s3DataDestination} -> s3DataDestination) (\s@MetricAttributionOutput' {} a -> s {s3DataDestination = a} :: MetricAttributionOutput)
+
+-- | The Amazon Resource Name (ARN) of the IAM service role that has
+-- permissions to add data to your output Amazon S3 bucket and add metrics
+-- to Amazon CloudWatch. For more information, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/measuring-recommendation-impact.html Measuring impact of recommendations>.
+metricAttributionOutput_roleArn :: Lens.Lens' MetricAttributionOutput Prelude.Text
+metricAttributionOutput_roleArn = Lens.lens (\MetricAttributionOutput' {roleArn} -> roleArn) (\s@MetricAttributionOutput' {} a -> s {roleArn = a} :: MetricAttributionOutput)
+
+instance Data.FromJSON MetricAttributionOutput where
+  parseJSON =
+    Data.withObject
+      "MetricAttributionOutput"
+      ( \x ->
+          MetricAttributionOutput'
+            Prelude.<$> (x Data..:? "s3DataDestination")
+            Prelude.<*> (x Data..: "roleArn")
+      )
+
+instance Prelude.Hashable MetricAttributionOutput where
+  hashWithSalt _salt MetricAttributionOutput' {..} =
+    _salt
+      `Prelude.hashWithSalt` s3DataDestination
+      `Prelude.hashWithSalt` roleArn
+
+instance Prelude.NFData MetricAttributionOutput where
+  rnf MetricAttributionOutput' {..} =
+    Prelude.rnf s3DataDestination
+      `Prelude.seq` Prelude.rnf roleArn
+
+instance Data.ToJSON MetricAttributionOutput where
+  toJSON MetricAttributionOutput' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("s3DataDestination" Data..=)
+              Prelude.<$> s3DataDestination,
+            Prelude.Just ("roleArn" Data..= roleArn)
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/MetricAttributionSummary.hs b/gen/Amazonka/Personalize/Types/MetricAttributionSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/MetricAttributionSummary.hs
@@ -0,0 +1,135 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.MetricAttributionSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.MetricAttributionSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of a metric attribution. For a
+-- complete listing, call the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeMetricAttribution.html DescribeMetricAttribution>.
+--
+-- /See:/ 'newMetricAttributionSummary' smart constructor.
+data MetricAttributionSummary = MetricAttributionSummary'
+  { -- | The metric attribution\'s creation date time.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The metric attribution\'s failure reason.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The metric attribution\'s last updated date time.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The metric attribution\'s Amazon Resource Name (ARN).
+    metricAttributionArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the metric attribution.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The metric attribution\'s status.
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'MetricAttributionSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'metricAttributionSummary_creationDateTime' - The metric attribution\'s creation date time.
+--
+-- 'failureReason', 'metricAttributionSummary_failureReason' - The metric attribution\'s failure reason.
+--
+-- 'lastUpdatedDateTime', 'metricAttributionSummary_lastUpdatedDateTime' - The metric attribution\'s last updated date time.
+--
+-- 'metricAttributionArn', 'metricAttributionSummary_metricAttributionArn' - The metric attribution\'s Amazon Resource Name (ARN).
+--
+-- 'name', 'metricAttributionSummary_name' - The name of the metric attribution.
+--
+-- 'status', 'metricAttributionSummary_status' - The metric attribution\'s status.
+newMetricAttributionSummary ::
+  MetricAttributionSummary
+newMetricAttributionSummary =
+  MetricAttributionSummary'
+    { creationDateTime =
+        Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      metricAttributionArn = Prelude.Nothing,
+      name = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The metric attribution\'s creation date time.
+metricAttributionSummary_creationDateTime :: Lens.Lens' MetricAttributionSummary (Prelude.Maybe Prelude.UTCTime)
+metricAttributionSummary_creationDateTime = Lens.lens (\MetricAttributionSummary' {creationDateTime} -> creationDateTime) (\s@MetricAttributionSummary' {} a -> s {creationDateTime = a} :: MetricAttributionSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The metric attribution\'s failure reason.
+metricAttributionSummary_failureReason :: Lens.Lens' MetricAttributionSummary (Prelude.Maybe Prelude.Text)
+metricAttributionSummary_failureReason = Lens.lens (\MetricAttributionSummary' {failureReason} -> failureReason) (\s@MetricAttributionSummary' {} a -> s {failureReason = a} :: MetricAttributionSummary)
+
+-- | The metric attribution\'s last updated date time.
+metricAttributionSummary_lastUpdatedDateTime :: Lens.Lens' MetricAttributionSummary (Prelude.Maybe Prelude.UTCTime)
+metricAttributionSummary_lastUpdatedDateTime = Lens.lens (\MetricAttributionSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@MetricAttributionSummary' {} a -> s {lastUpdatedDateTime = a} :: MetricAttributionSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The metric attribution\'s Amazon Resource Name (ARN).
+metricAttributionSummary_metricAttributionArn :: Lens.Lens' MetricAttributionSummary (Prelude.Maybe Prelude.Text)
+metricAttributionSummary_metricAttributionArn = Lens.lens (\MetricAttributionSummary' {metricAttributionArn} -> metricAttributionArn) (\s@MetricAttributionSummary' {} a -> s {metricAttributionArn = a} :: MetricAttributionSummary)
+
+-- | The name of the metric attribution.
+metricAttributionSummary_name :: Lens.Lens' MetricAttributionSummary (Prelude.Maybe Prelude.Text)
+metricAttributionSummary_name = Lens.lens (\MetricAttributionSummary' {name} -> name) (\s@MetricAttributionSummary' {} a -> s {name = a} :: MetricAttributionSummary)
+
+-- | The metric attribution\'s status.
+metricAttributionSummary_status :: Lens.Lens' MetricAttributionSummary (Prelude.Maybe Prelude.Text)
+metricAttributionSummary_status = Lens.lens (\MetricAttributionSummary' {status} -> status) (\s@MetricAttributionSummary' {} a -> s {status = a} :: MetricAttributionSummary)
+
+instance Data.FromJSON MetricAttributionSummary where
+  parseJSON =
+    Data.withObject
+      "MetricAttributionSummary"
+      ( \x ->
+          MetricAttributionSummary'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "metricAttributionArn")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable MetricAttributionSummary where
+  hashWithSalt _salt MetricAttributionSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` metricAttributionArn
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData MetricAttributionSummary where
+  rnf MetricAttributionSummary' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf metricAttributionArn
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/ObjectiveSensitivity.hs b/gen/Amazonka/Personalize/Types/ObjectiveSensitivity.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/ObjectiveSensitivity.hs
@@ -0,0 +1,81 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.ObjectiveSensitivity
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.ObjectiveSensitivity
+  ( ObjectiveSensitivity
+      ( ..,
+        ObjectiveSensitivity_HIGH,
+        ObjectiveSensitivity_LOW,
+        ObjectiveSensitivity_MEDIUM,
+        ObjectiveSensitivity_OFF
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ObjectiveSensitivity = ObjectiveSensitivity'
+  { fromObjectiveSensitivity ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern ObjectiveSensitivity_HIGH :: ObjectiveSensitivity
+pattern ObjectiveSensitivity_HIGH = ObjectiveSensitivity' "HIGH"
+
+pattern ObjectiveSensitivity_LOW :: ObjectiveSensitivity
+pattern ObjectiveSensitivity_LOW = ObjectiveSensitivity' "LOW"
+
+pattern ObjectiveSensitivity_MEDIUM :: ObjectiveSensitivity
+pattern ObjectiveSensitivity_MEDIUM = ObjectiveSensitivity' "MEDIUM"
+
+pattern ObjectiveSensitivity_OFF :: ObjectiveSensitivity
+pattern ObjectiveSensitivity_OFF = ObjectiveSensitivity' "OFF"
+
+{-# COMPLETE
+  ObjectiveSensitivity_HIGH,
+  ObjectiveSensitivity_LOW,
+  ObjectiveSensitivity_MEDIUM,
+  ObjectiveSensitivity_OFF,
+  ObjectiveSensitivity'
+  #-}
diff --git a/gen/Amazonka/Personalize/Types/OptimizationObjective.hs b/gen/Amazonka/Personalize/Types/OptimizationObjective.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/OptimizationObjective.hs
@@ -0,0 +1,107 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.OptimizationObjective
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.OptimizationObjective where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.ObjectiveSensitivity
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the additional objective for the solution, such as maximizing
+-- streaming minutes or increasing revenue. For more information see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/optimizing-solution-for-objective.html Optimizing a solution>.
+--
+-- /See:/ 'newOptimizationObjective' smart constructor.
+data OptimizationObjective = OptimizationObjective'
+  { -- | The numerical metadata column in an Items dataset related to the
+    -- optimization objective. For example, VIDEO_LENGTH (to maximize streaming
+    -- minutes), or PRICE (to maximize revenue).
+    itemAttribute :: Prelude.Maybe Prelude.Text,
+    -- | Specifies how Amazon Personalize balances the importance of your
+    -- optimization objective versus relevance.
+    objectiveSensitivity :: Prelude.Maybe ObjectiveSensitivity
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OptimizationObjective' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'itemAttribute', 'optimizationObjective_itemAttribute' - The numerical metadata column in an Items dataset related to the
+-- optimization objective. For example, VIDEO_LENGTH (to maximize streaming
+-- minutes), or PRICE (to maximize revenue).
+--
+-- 'objectiveSensitivity', 'optimizationObjective_objectiveSensitivity' - Specifies how Amazon Personalize balances the importance of your
+-- optimization objective versus relevance.
+newOptimizationObjective ::
+  OptimizationObjective
+newOptimizationObjective =
+  OptimizationObjective'
+    { itemAttribute =
+        Prelude.Nothing,
+      objectiveSensitivity = Prelude.Nothing
+    }
+
+-- | The numerical metadata column in an Items dataset related to the
+-- optimization objective. For example, VIDEO_LENGTH (to maximize streaming
+-- minutes), or PRICE (to maximize revenue).
+optimizationObjective_itemAttribute :: Lens.Lens' OptimizationObjective (Prelude.Maybe Prelude.Text)
+optimizationObjective_itemAttribute = Lens.lens (\OptimizationObjective' {itemAttribute} -> itemAttribute) (\s@OptimizationObjective' {} a -> s {itemAttribute = a} :: OptimizationObjective)
+
+-- | Specifies how Amazon Personalize balances the importance of your
+-- optimization objective versus relevance.
+optimizationObjective_objectiveSensitivity :: Lens.Lens' OptimizationObjective (Prelude.Maybe ObjectiveSensitivity)
+optimizationObjective_objectiveSensitivity = Lens.lens (\OptimizationObjective' {objectiveSensitivity} -> objectiveSensitivity) (\s@OptimizationObjective' {} a -> s {objectiveSensitivity = a} :: OptimizationObjective)
+
+instance Data.FromJSON OptimizationObjective where
+  parseJSON =
+    Data.withObject
+      "OptimizationObjective"
+      ( \x ->
+          OptimizationObjective'
+            Prelude.<$> (x Data..:? "itemAttribute")
+            Prelude.<*> (x Data..:? "objectiveSensitivity")
+      )
+
+instance Prelude.Hashable OptimizationObjective where
+  hashWithSalt _salt OptimizationObjective' {..} =
+    _salt
+      `Prelude.hashWithSalt` itemAttribute
+      `Prelude.hashWithSalt` objectiveSensitivity
+
+instance Prelude.NFData OptimizationObjective where
+  rnf OptimizationObjective' {..} =
+    Prelude.rnf itemAttribute
+      `Prelude.seq` Prelude.rnf objectiveSensitivity
+
+instance Data.ToJSON OptimizationObjective where
+  toJSON OptimizationObjective' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("itemAttribute" Data..=) Prelude.<$> itemAttribute,
+            ("objectiveSensitivity" Data..=)
+              Prelude.<$> objectiveSensitivity
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/Recipe.hs b/gen/Amazonka/Personalize/Types/Recipe.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/Recipe.hs
@@ -0,0 +1,192 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.Recipe
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.Recipe where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides information about a recipe. Each recipe provides an algorithm
+-- that Amazon Personalize uses in model training when you use the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateSolution.html CreateSolution>
+-- operation.
+--
+-- /See:/ 'newRecipe' smart constructor.
+data Recipe = Recipe'
+  { -- | The Amazon Resource Name (ARN) of the algorithm that Amazon Personalize
+    -- uses to train the model.
+    algorithmArn :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix format) that the recipe was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The description of the recipe.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the FeatureTransformation object.
+    featureTransformationArn :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix format) that the recipe was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the recipe.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the recipe.
+    recipeArn :: Prelude.Maybe Prelude.Text,
+    -- | One of the following values:
+    --
+    -- -   PERSONALIZED_RANKING
+    --
+    -- -   RELATED_ITEMS
+    --
+    -- -   USER_PERSONALIZATION
+    recipeType :: Prelude.Maybe Prelude.Text,
+    -- | The status of the recipe.
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Recipe' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'algorithmArn', 'recipe_algorithmArn' - The Amazon Resource Name (ARN) of the algorithm that Amazon Personalize
+-- uses to train the model.
+--
+-- 'creationDateTime', 'recipe_creationDateTime' - The date and time (in Unix format) that the recipe was created.
+--
+-- 'description', 'recipe_description' - The description of the recipe.
+--
+-- 'featureTransformationArn', 'recipe_featureTransformationArn' - The ARN of the FeatureTransformation object.
+--
+-- 'lastUpdatedDateTime', 'recipe_lastUpdatedDateTime' - The date and time (in Unix format) that the recipe was last updated.
+--
+-- 'name', 'recipe_name' - The name of the recipe.
+--
+-- 'recipeArn', 'recipe_recipeArn' - The Amazon Resource Name (ARN) of the recipe.
+--
+-- 'recipeType', 'recipe_recipeType' - One of the following values:
+--
+-- -   PERSONALIZED_RANKING
+--
+-- -   RELATED_ITEMS
+--
+-- -   USER_PERSONALIZATION
+--
+-- 'status', 'recipe_status' - The status of the recipe.
+newRecipe ::
+  Recipe
+newRecipe =
+  Recipe'
+    { algorithmArn = Prelude.Nothing,
+      creationDateTime = Prelude.Nothing,
+      description = Prelude.Nothing,
+      featureTransformationArn = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      recipeArn = Prelude.Nothing,
+      recipeType = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The Amazon Resource Name (ARN) of the algorithm that Amazon Personalize
+-- uses to train the model.
+recipe_algorithmArn :: Lens.Lens' Recipe (Prelude.Maybe Prelude.Text)
+recipe_algorithmArn = Lens.lens (\Recipe' {algorithmArn} -> algorithmArn) (\s@Recipe' {} a -> s {algorithmArn = a} :: Recipe)
+
+-- | The date and time (in Unix format) that the recipe was created.
+recipe_creationDateTime :: Lens.Lens' Recipe (Prelude.Maybe Prelude.UTCTime)
+recipe_creationDateTime = Lens.lens (\Recipe' {creationDateTime} -> creationDateTime) (\s@Recipe' {} a -> s {creationDateTime = a} :: Recipe) Prelude.. Lens.mapping Data._Time
+
+-- | The description of the recipe.
+recipe_description :: Lens.Lens' Recipe (Prelude.Maybe Prelude.Text)
+recipe_description = Lens.lens (\Recipe' {description} -> description) (\s@Recipe' {} a -> s {description = a} :: Recipe)
+
+-- | The ARN of the FeatureTransformation object.
+recipe_featureTransformationArn :: Lens.Lens' Recipe (Prelude.Maybe Prelude.Text)
+recipe_featureTransformationArn = Lens.lens (\Recipe' {featureTransformationArn} -> featureTransformationArn) (\s@Recipe' {} a -> s {featureTransformationArn = a} :: Recipe)
+
+-- | The date and time (in Unix format) that the recipe was last updated.
+recipe_lastUpdatedDateTime :: Lens.Lens' Recipe (Prelude.Maybe Prelude.UTCTime)
+recipe_lastUpdatedDateTime = Lens.lens (\Recipe' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@Recipe' {} a -> s {lastUpdatedDateTime = a} :: Recipe) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the recipe.
+recipe_name :: Lens.Lens' Recipe (Prelude.Maybe Prelude.Text)
+recipe_name = Lens.lens (\Recipe' {name} -> name) (\s@Recipe' {} a -> s {name = a} :: Recipe)
+
+-- | The Amazon Resource Name (ARN) of the recipe.
+recipe_recipeArn :: Lens.Lens' Recipe (Prelude.Maybe Prelude.Text)
+recipe_recipeArn = Lens.lens (\Recipe' {recipeArn} -> recipeArn) (\s@Recipe' {} a -> s {recipeArn = a} :: Recipe)
+
+-- | One of the following values:
+--
+-- -   PERSONALIZED_RANKING
+--
+-- -   RELATED_ITEMS
+--
+-- -   USER_PERSONALIZATION
+recipe_recipeType :: Lens.Lens' Recipe (Prelude.Maybe Prelude.Text)
+recipe_recipeType = Lens.lens (\Recipe' {recipeType} -> recipeType) (\s@Recipe' {} a -> s {recipeType = a} :: Recipe)
+
+-- | The status of the recipe.
+recipe_status :: Lens.Lens' Recipe (Prelude.Maybe Prelude.Text)
+recipe_status = Lens.lens (\Recipe' {status} -> status) (\s@Recipe' {} a -> s {status = a} :: Recipe)
+
+instance Data.FromJSON Recipe where
+  parseJSON =
+    Data.withObject
+      "Recipe"
+      ( \x ->
+          Recipe'
+            Prelude.<$> (x Data..:? "algorithmArn")
+            Prelude.<*> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "description")
+            Prelude.<*> (x Data..:? "featureTransformationArn")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "recipeArn")
+            Prelude.<*> (x Data..:? "recipeType")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable Recipe where
+  hashWithSalt _salt Recipe' {..} =
+    _salt
+      `Prelude.hashWithSalt` algorithmArn
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` featureTransformationArn
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` recipeArn
+      `Prelude.hashWithSalt` recipeType
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData Recipe where
+  rnf Recipe' {..} =
+    Prelude.rnf algorithmArn
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf featureTransformationArn
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf recipeArn
+      `Prelude.seq` Prelude.rnf recipeType
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/RecipeProvider.hs b/gen/Amazonka/Personalize/Types/RecipeProvider.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/RecipeProvider.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.RecipeProvider
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.RecipeProvider
+  ( RecipeProvider
+      ( ..,
+        RecipeProvider_SERVICE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype RecipeProvider = RecipeProvider'
+  { fromRecipeProvider ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern RecipeProvider_SERVICE :: RecipeProvider
+pattern RecipeProvider_SERVICE = RecipeProvider' "SERVICE"
+
+{-# COMPLETE
+  RecipeProvider_SERVICE,
+  RecipeProvider'
+  #-}
diff --git a/gen/Amazonka/Personalize/Types/RecipeSummary.hs b/gen/Amazonka/Personalize/Types/RecipeSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/RecipeSummary.hs
@@ -0,0 +1,139 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.RecipeSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.RecipeSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.Domain
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of a recipe. For a complete
+-- listing, call the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeRecipe.html DescribeRecipe>
+-- API.
+--
+-- /See:/ 'newRecipeSummary' smart constructor.
+data RecipeSummary = RecipeSummary'
+  { -- | The date and time (in Unix time) that the recipe was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The domain of the recipe (if the recipe is a Domain dataset group use
+    -- case).
+    domain :: Prelude.Maybe Domain,
+    -- | The date and time (in Unix time) that the recipe was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the recipe.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the recipe.
+    recipeArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the recipe.
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RecipeSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'recipeSummary_creationDateTime' - The date and time (in Unix time) that the recipe was created.
+--
+-- 'domain', 'recipeSummary_domain' - The domain of the recipe (if the recipe is a Domain dataset group use
+-- case).
+--
+-- 'lastUpdatedDateTime', 'recipeSummary_lastUpdatedDateTime' - The date and time (in Unix time) that the recipe was last updated.
+--
+-- 'name', 'recipeSummary_name' - The name of the recipe.
+--
+-- 'recipeArn', 'recipeSummary_recipeArn' - The Amazon Resource Name (ARN) of the recipe.
+--
+-- 'status', 'recipeSummary_status' - The status of the recipe.
+newRecipeSummary ::
+  RecipeSummary
+newRecipeSummary =
+  RecipeSummary'
+    { creationDateTime = Prelude.Nothing,
+      domain = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      recipeArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix time) that the recipe was created.
+recipeSummary_creationDateTime :: Lens.Lens' RecipeSummary (Prelude.Maybe Prelude.UTCTime)
+recipeSummary_creationDateTime = Lens.lens (\RecipeSummary' {creationDateTime} -> creationDateTime) (\s@RecipeSummary' {} a -> s {creationDateTime = a} :: RecipeSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The domain of the recipe (if the recipe is a Domain dataset group use
+-- case).
+recipeSummary_domain :: Lens.Lens' RecipeSummary (Prelude.Maybe Domain)
+recipeSummary_domain = Lens.lens (\RecipeSummary' {domain} -> domain) (\s@RecipeSummary' {} a -> s {domain = a} :: RecipeSummary)
+
+-- | The date and time (in Unix time) that the recipe was last updated.
+recipeSummary_lastUpdatedDateTime :: Lens.Lens' RecipeSummary (Prelude.Maybe Prelude.UTCTime)
+recipeSummary_lastUpdatedDateTime = Lens.lens (\RecipeSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@RecipeSummary' {} a -> s {lastUpdatedDateTime = a} :: RecipeSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the recipe.
+recipeSummary_name :: Lens.Lens' RecipeSummary (Prelude.Maybe Prelude.Text)
+recipeSummary_name = Lens.lens (\RecipeSummary' {name} -> name) (\s@RecipeSummary' {} a -> s {name = a} :: RecipeSummary)
+
+-- | The Amazon Resource Name (ARN) of the recipe.
+recipeSummary_recipeArn :: Lens.Lens' RecipeSummary (Prelude.Maybe Prelude.Text)
+recipeSummary_recipeArn = Lens.lens (\RecipeSummary' {recipeArn} -> recipeArn) (\s@RecipeSummary' {} a -> s {recipeArn = a} :: RecipeSummary)
+
+-- | The status of the recipe.
+recipeSummary_status :: Lens.Lens' RecipeSummary (Prelude.Maybe Prelude.Text)
+recipeSummary_status = Lens.lens (\RecipeSummary' {status} -> status) (\s@RecipeSummary' {} a -> s {status = a} :: RecipeSummary)
+
+instance Data.FromJSON RecipeSummary where
+  parseJSON =
+    Data.withObject
+      "RecipeSummary"
+      ( \x ->
+          RecipeSummary'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "domain")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "recipeArn")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable RecipeSummary where
+  hashWithSalt _salt RecipeSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` domain
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` recipeArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData RecipeSummary where
+  rnf RecipeSummary' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf domain
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf recipeArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/Recommender.hs b/gen/Amazonka/Personalize/Types/Recommender.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/Recommender.hs
@@ -0,0 +1,240 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.Recommender
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.Recommender where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.RecommenderConfig
+import Amazonka.Personalize.Types.RecommenderUpdateSummary
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes a recommendation generator for a Domain dataset group. You
+-- create a recommender in a Domain dataset group for a specific domain use
+-- case (domain recipe), and specify the recommender in a
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_RS_GetRecommendations.html GetRecommendations>
+-- request.
+--
+-- /See:/ 'newRecommender' smart constructor.
+data Recommender = Recommender'
+  { -- | The date and time (in Unix format) that the recommender was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the Domain dataset group that contains
+    -- the recommender.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | If a recommender fails, the reason behind the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix format) that the recommender was last
+    -- updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | Provides a summary of the latest updates to the recommender.
+    latestRecommenderUpdate :: Prelude.Maybe RecommenderUpdateSummary,
+    -- | Provides evaluation metrics that help you determine the performance of a
+    -- recommender. For more information, see
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/evaluating-recommenders.html Evaluating a recommender>.
+    modelMetrics :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Double),
+    -- | The name of the recommender.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the recipe (Domain dataset group use
+    -- case) that the recommender was created for.
+    recipeArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the recommender.
+    recommenderArn :: Prelude.Maybe Prelude.Text,
+    -- | The configuration details of the recommender.
+    recommenderConfig :: Prelude.Maybe RecommenderConfig,
+    -- | The status of the recommender.
+    --
+    -- A recommender can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   STOP PENDING > STOP IN_PROGRESS > INACTIVE > START PENDING > START
+    --     IN_PROGRESS > ACTIVE
+    --
+    -- -   DELETE PENDING > DELETE IN_PROGRESS
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Recommender' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'recommender_creationDateTime' - The date and time (in Unix format) that the recommender was created.
+--
+-- 'datasetGroupArn', 'recommender_datasetGroupArn' - The Amazon Resource Name (ARN) of the Domain dataset group that contains
+-- the recommender.
+--
+-- 'failureReason', 'recommender_failureReason' - If a recommender fails, the reason behind the failure.
+--
+-- 'lastUpdatedDateTime', 'recommender_lastUpdatedDateTime' - The date and time (in Unix format) that the recommender was last
+-- updated.
+--
+-- 'latestRecommenderUpdate', 'recommender_latestRecommenderUpdate' - Provides a summary of the latest updates to the recommender.
+--
+-- 'modelMetrics', 'recommender_modelMetrics' - Provides evaluation metrics that help you determine the performance of a
+-- recommender. For more information, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/evaluating-recommenders.html Evaluating a recommender>.
+--
+-- 'name', 'recommender_name' - The name of the recommender.
+--
+-- 'recipeArn', 'recommender_recipeArn' - The Amazon Resource Name (ARN) of the recipe (Domain dataset group use
+-- case) that the recommender was created for.
+--
+-- 'recommenderArn', 'recommender_recommenderArn' - The Amazon Resource Name (ARN) of the recommender.
+--
+-- 'recommenderConfig', 'recommender_recommenderConfig' - The configuration details of the recommender.
+--
+-- 'status', 'recommender_status' - The status of the recommender.
+--
+-- A recommender can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   STOP PENDING > STOP IN_PROGRESS > INACTIVE > START PENDING > START
+--     IN_PROGRESS > ACTIVE
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+newRecommender ::
+  Recommender
+newRecommender =
+  Recommender'
+    { creationDateTime = Prelude.Nothing,
+      datasetGroupArn = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      latestRecommenderUpdate = Prelude.Nothing,
+      modelMetrics = Prelude.Nothing,
+      name = Prelude.Nothing,
+      recipeArn = Prelude.Nothing,
+      recommenderArn = Prelude.Nothing,
+      recommenderConfig = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix format) that the recommender was created.
+recommender_creationDateTime :: Lens.Lens' Recommender (Prelude.Maybe Prelude.UTCTime)
+recommender_creationDateTime = Lens.lens (\Recommender' {creationDateTime} -> creationDateTime) (\s@Recommender' {} a -> s {creationDateTime = a} :: Recommender) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the Domain dataset group that contains
+-- the recommender.
+recommender_datasetGroupArn :: Lens.Lens' Recommender (Prelude.Maybe Prelude.Text)
+recommender_datasetGroupArn = Lens.lens (\Recommender' {datasetGroupArn} -> datasetGroupArn) (\s@Recommender' {} a -> s {datasetGroupArn = a} :: Recommender)
+
+-- | If a recommender fails, the reason behind the failure.
+recommender_failureReason :: Lens.Lens' Recommender (Prelude.Maybe Prelude.Text)
+recommender_failureReason = Lens.lens (\Recommender' {failureReason} -> failureReason) (\s@Recommender' {} a -> s {failureReason = a} :: Recommender)
+
+-- | The date and time (in Unix format) that the recommender was last
+-- updated.
+recommender_lastUpdatedDateTime :: Lens.Lens' Recommender (Prelude.Maybe Prelude.UTCTime)
+recommender_lastUpdatedDateTime = Lens.lens (\Recommender' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@Recommender' {} a -> s {lastUpdatedDateTime = a} :: Recommender) Prelude.. Lens.mapping Data._Time
+
+-- | Provides a summary of the latest updates to the recommender.
+recommender_latestRecommenderUpdate :: Lens.Lens' Recommender (Prelude.Maybe RecommenderUpdateSummary)
+recommender_latestRecommenderUpdate = Lens.lens (\Recommender' {latestRecommenderUpdate} -> latestRecommenderUpdate) (\s@Recommender' {} a -> s {latestRecommenderUpdate = a} :: Recommender)
+
+-- | Provides evaluation metrics that help you determine the performance of a
+-- recommender. For more information, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/evaluating-recommenders.html Evaluating a recommender>.
+recommender_modelMetrics :: Lens.Lens' Recommender (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Double))
+recommender_modelMetrics = Lens.lens (\Recommender' {modelMetrics} -> modelMetrics) (\s@Recommender' {} a -> s {modelMetrics = a} :: Recommender) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the recommender.
+recommender_name :: Lens.Lens' Recommender (Prelude.Maybe Prelude.Text)
+recommender_name = Lens.lens (\Recommender' {name} -> name) (\s@Recommender' {} a -> s {name = a} :: Recommender)
+
+-- | The Amazon Resource Name (ARN) of the recipe (Domain dataset group use
+-- case) that the recommender was created for.
+recommender_recipeArn :: Lens.Lens' Recommender (Prelude.Maybe Prelude.Text)
+recommender_recipeArn = Lens.lens (\Recommender' {recipeArn} -> recipeArn) (\s@Recommender' {} a -> s {recipeArn = a} :: Recommender)
+
+-- | The Amazon Resource Name (ARN) of the recommender.
+recommender_recommenderArn :: Lens.Lens' Recommender (Prelude.Maybe Prelude.Text)
+recommender_recommenderArn = Lens.lens (\Recommender' {recommenderArn} -> recommenderArn) (\s@Recommender' {} a -> s {recommenderArn = a} :: Recommender)
+
+-- | The configuration details of the recommender.
+recommender_recommenderConfig :: Lens.Lens' Recommender (Prelude.Maybe RecommenderConfig)
+recommender_recommenderConfig = Lens.lens (\Recommender' {recommenderConfig} -> recommenderConfig) (\s@Recommender' {} a -> s {recommenderConfig = a} :: Recommender)
+
+-- | The status of the recommender.
+--
+-- A recommender can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   STOP PENDING > STOP IN_PROGRESS > INACTIVE > START PENDING > START
+--     IN_PROGRESS > ACTIVE
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+recommender_status :: Lens.Lens' Recommender (Prelude.Maybe Prelude.Text)
+recommender_status = Lens.lens (\Recommender' {status} -> status) (\s@Recommender' {} a -> s {status = a} :: Recommender)
+
+instance Data.FromJSON Recommender where
+  parseJSON =
+    Data.withObject
+      "Recommender"
+      ( \x ->
+          Recommender'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetGroupArn")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "latestRecommenderUpdate")
+            Prelude.<*> (x Data..:? "modelMetrics" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "recipeArn")
+            Prelude.<*> (x Data..:? "recommenderArn")
+            Prelude.<*> (x Data..:? "recommenderConfig")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable Recommender where
+  hashWithSalt _salt Recommender' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` latestRecommenderUpdate
+      `Prelude.hashWithSalt` modelMetrics
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` recipeArn
+      `Prelude.hashWithSalt` recommenderArn
+      `Prelude.hashWithSalt` recommenderConfig
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData Recommender where
+  rnf Recommender' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf latestRecommenderUpdate
+      `Prelude.seq` Prelude.rnf modelMetrics
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf recipeArn
+      `Prelude.seq` Prelude.rnf recommenderArn
+      `Prelude.seq` Prelude.rnf recommenderConfig
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/RecommenderConfig.hs b/gen/Amazonka/Personalize/Types/RecommenderConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/RecommenderConfig.hs
@@ -0,0 +1,117 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.RecommenderConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.RecommenderConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The configuration details of the recommender.
+--
+-- /See:/ 'newRecommenderConfig' smart constructor.
+data RecommenderConfig = RecommenderConfig'
+  { -- | Specifies the exploration configuration hyperparameters, including
+    -- @explorationWeight@ and @explorationItemAgeCutOff@, you want to use to
+    -- configure the amount of item exploration Amazon Personalize uses when
+    -- recommending items. Provide @itemExplorationConfig@ data only if your
+    -- recommenders generate personalized recommendations for a user (not
+    -- popular items or similar items).
+    itemExplorationConfig :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Specifies the requested minimum provisioned recommendation requests per
+    -- second that Amazon Personalize will support.
+    minRecommendationRequestsPerSecond :: Prelude.Maybe Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RecommenderConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'itemExplorationConfig', 'recommenderConfig_itemExplorationConfig' - Specifies the exploration configuration hyperparameters, including
+-- @explorationWeight@ and @explorationItemAgeCutOff@, you want to use to
+-- configure the amount of item exploration Amazon Personalize uses when
+-- recommending items. Provide @itemExplorationConfig@ data only if your
+-- recommenders generate personalized recommendations for a user (not
+-- popular items or similar items).
+--
+-- 'minRecommendationRequestsPerSecond', 'recommenderConfig_minRecommendationRequestsPerSecond' - Specifies the requested minimum provisioned recommendation requests per
+-- second that Amazon Personalize will support.
+newRecommenderConfig ::
+  RecommenderConfig
+newRecommenderConfig =
+  RecommenderConfig'
+    { itemExplorationConfig =
+        Prelude.Nothing,
+      minRecommendationRequestsPerSecond = Prelude.Nothing
+    }
+
+-- | Specifies the exploration configuration hyperparameters, including
+-- @explorationWeight@ and @explorationItemAgeCutOff@, you want to use to
+-- configure the amount of item exploration Amazon Personalize uses when
+-- recommending items. Provide @itemExplorationConfig@ data only if your
+-- recommenders generate personalized recommendations for a user (not
+-- popular items or similar items).
+recommenderConfig_itemExplorationConfig :: Lens.Lens' RecommenderConfig (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+recommenderConfig_itemExplorationConfig = Lens.lens (\RecommenderConfig' {itemExplorationConfig} -> itemExplorationConfig) (\s@RecommenderConfig' {} a -> s {itemExplorationConfig = a} :: RecommenderConfig) Prelude.. Lens.mapping Lens.coerced
+
+-- | Specifies the requested minimum provisioned recommendation requests per
+-- second that Amazon Personalize will support.
+recommenderConfig_minRecommendationRequestsPerSecond :: Lens.Lens' RecommenderConfig (Prelude.Maybe Prelude.Natural)
+recommenderConfig_minRecommendationRequestsPerSecond = Lens.lens (\RecommenderConfig' {minRecommendationRequestsPerSecond} -> minRecommendationRequestsPerSecond) (\s@RecommenderConfig' {} a -> s {minRecommendationRequestsPerSecond = a} :: RecommenderConfig)
+
+instance Data.FromJSON RecommenderConfig where
+  parseJSON =
+    Data.withObject
+      "RecommenderConfig"
+      ( \x ->
+          RecommenderConfig'
+            Prelude.<$> ( x
+                            Data..:? "itemExplorationConfig"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "minRecommendationRequestsPerSecond")
+      )
+
+instance Prelude.Hashable RecommenderConfig where
+  hashWithSalt _salt RecommenderConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` itemExplorationConfig
+      `Prelude.hashWithSalt` minRecommendationRequestsPerSecond
+
+instance Prelude.NFData RecommenderConfig where
+  rnf RecommenderConfig' {..} =
+    Prelude.rnf itemExplorationConfig
+      `Prelude.seq` Prelude.rnf minRecommendationRequestsPerSecond
+
+instance Data.ToJSON RecommenderConfig where
+  toJSON RecommenderConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("itemExplorationConfig" Data..=)
+              Prelude.<$> itemExplorationConfig,
+            ("minRecommendationRequestsPerSecond" Data..=)
+              Prelude.<$> minRecommendationRequestsPerSecond
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/RecommenderSummary.hs b/gen/Amazonka/Personalize/Types/RecommenderSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/RecommenderSummary.hs
@@ -0,0 +1,191 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.RecommenderSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.RecommenderSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.RecommenderConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of the recommender.
+--
+-- /See:/ 'newRecommenderSummary' smart constructor.
+data RecommenderSummary = RecommenderSummary'
+  { -- | The date and time (in Unix format) that the recommender was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the Domain dataset group that contains
+    -- the recommender.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix format) that the recommender was last
+    -- updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the recommender.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the recipe (Domain dataset group use
+    -- case) that the recommender was created for.
+    recipeArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the recommender.
+    recommenderArn :: Prelude.Maybe Prelude.Text,
+    -- | The configuration details of the recommender.
+    recommenderConfig :: Prelude.Maybe RecommenderConfig,
+    -- | The status of the recommender. A recommender can be in one of the
+    -- following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   STOP PENDING > STOP IN_PROGRESS > INACTIVE > START PENDING > START
+    --     IN_PROGRESS > ACTIVE
+    --
+    -- -   DELETE PENDING > DELETE IN_PROGRESS
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RecommenderSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'recommenderSummary_creationDateTime' - The date and time (in Unix format) that the recommender was created.
+--
+-- 'datasetGroupArn', 'recommenderSummary_datasetGroupArn' - The Amazon Resource Name (ARN) of the Domain dataset group that contains
+-- the recommender.
+--
+-- 'lastUpdatedDateTime', 'recommenderSummary_lastUpdatedDateTime' - The date and time (in Unix format) that the recommender was last
+-- updated.
+--
+-- 'name', 'recommenderSummary_name' - The name of the recommender.
+--
+-- 'recipeArn', 'recommenderSummary_recipeArn' - The Amazon Resource Name (ARN) of the recipe (Domain dataset group use
+-- case) that the recommender was created for.
+--
+-- 'recommenderArn', 'recommenderSummary_recommenderArn' - The Amazon Resource Name (ARN) of the recommender.
+--
+-- 'recommenderConfig', 'recommenderSummary_recommenderConfig' - The configuration details of the recommender.
+--
+-- 'status', 'recommenderSummary_status' - The status of the recommender. A recommender can be in one of the
+-- following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   STOP PENDING > STOP IN_PROGRESS > INACTIVE > START PENDING > START
+--     IN_PROGRESS > ACTIVE
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+newRecommenderSummary ::
+  RecommenderSummary
+newRecommenderSummary =
+  RecommenderSummary'
+    { creationDateTime =
+        Prelude.Nothing,
+      datasetGroupArn = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      recipeArn = Prelude.Nothing,
+      recommenderArn = Prelude.Nothing,
+      recommenderConfig = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix format) that the recommender was created.
+recommenderSummary_creationDateTime :: Lens.Lens' RecommenderSummary (Prelude.Maybe Prelude.UTCTime)
+recommenderSummary_creationDateTime = Lens.lens (\RecommenderSummary' {creationDateTime} -> creationDateTime) (\s@RecommenderSummary' {} a -> s {creationDateTime = a} :: RecommenderSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the Domain dataset group that contains
+-- the recommender.
+recommenderSummary_datasetGroupArn :: Lens.Lens' RecommenderSummary (Prelude.Maybe Prelude.Text)
+recommenderSummary_datasetGroupArn = Lens.lens (\RecommenderSummary' {datasetGroupArn} -> datasetGroupArn) (\s@RecommenderSummary' {} a -> s {datasetGroupArn = a} :: RecommenderSummary)
+
+-- | The date and time (in Unix format) that the recommender was last
+-- updated.
+recommenderSummary_lastUpdatedDateTime :: Lens.Lens' RecommenderSummary (Prelude.Maybe Prelude.UTCTime)
+recommenderSummary_lastUpdatedDateTime = Lens.lens (\RecommenderSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@RecommenderSummary' {} a -> s {lastUpdatedDateTime = a} :: RecommenderSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the recommender.
+recommenderSummary_name :: Lens.Lens' RecommenderSummary (Prelude.Maybe Prelude.Text)
+recommenderSummary_name = Lens.lens (\RecommenderSummary' {name} -> name) (\s@RecommenderSummary' {} a -> s {name = a} :: RecommenderSummary)
+
+-- | The Amazon Resource Name (ARN) of the recipe (Domain dataset group use
+-- case) that the recommender was created for.
+recommenderSummary_recipeArn :: Lens.Lens' RecommenderSummary (Prelude.Maybe Prelude.Text)
+recommenderSummary_recipeArn = Lens.lens (\RecommenderSummary' {recipeArn} -> recipeArn) (\s@RecommenderSummary' {} a -> s {recipeArn = a} :: RecommenderSummary)
+
+-- | The Amazon Resource Name (ARN) of the recommender.
+recommenderSummary_recommenderArn :: Lens.Lens' RecommenderSummary (Prelude.Maybe Prelude.Text)
+recommenderSummary_recommenderArn = Lens.lens (\RecommenderSummary' {recommenderArn} -> recommenderArn) (\s@RecommenderSummary' {} a -> s {recommenderArn = a} :: RecommenderSummary)
+
+-- | The configuration details of the recommender.
+recommenderSummary_recommenderConfig :: Lens.Lens' RecommenderSummary (Prelude.Maybe RecommenderConfig)
+recommenderSummary_recommenderConfig = Lens.lens (\RecommenderSummary' {recommenderConfig} -> recommenderConfig) (\s@RecommenderSummary' {} a -> s {recommenderConfig = a} :: RecommenderSummary)
+
+-- | The status of the recommender. A recommender can be in one of the
+-- following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   STOP PENDING > STOP IN_PROGRESS > INACTIVE > START PENDING > START
+--     IN_PROGRESS > ACTIVE
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+recommenderSummary_status :: Lens.Lens' RecommenderSummary (Prelude.Maybe Prelude.Text)
+recommenderSummary_status = Lens.lens (\RecommenderSummary' {status} -> status) (\s@RecommenderSummary' {} a -> s {status = a} :: RecommenderSummary)
+
+instance Data.FromJSON RecommenderSummary where
+  parseJSON =
+    Data.withObject
+      "RecommenderSummary"
+      ( \x ->
+          RecommenderSummary'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetGroupArn")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "recipeArn")
+            Prelude.<*> (x Data..:? "recommenderArn")
+            Prelude.<*> (x Data..:? "recommenderConfig")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable RecommenderSummary where
+  hashWithSalt _salt RecommenderSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` recipeArn
+      `Prelude.hashWithSalt` recommenderArn
+      `Prelude.hashWithSalt` recommenderConfig
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData RecommenderSummary where
+  rnf RecommenderSummary' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf recipeArn
+      `Prelude.seq` Prelude.rnf recommenderArn
+      `Prelude.seq` Prelude.rnf recommenderConfig
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/RecommenderUpdateSummary.hs b/gen/Amazonka/Personalize/Types/RecommenderUpdateSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/RecommenderUpdateSummary.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.RecommenderUpdateSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.RecommenderUpdateSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.RecommenderConfig
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of a recommender update. For a
+-- complete listing, call the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeRecommender.html DescribeRecommender>
+-- API.
+--
+-- /See:/ 'newRecommenderUpdateSummary' smart constructor.
+data RecommenderUpdateSummary = RecommenderUpdateSummary'
+  { -- | The date and time (in Unix format) that the recommender update was
+    -- created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | If a recommender update fails, the reason behind the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) that the recommender update was last
+    -- updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The configuration details of the recommender update.
+    recommenderConfig :: Prelude.Maybe RecommenderConfig,
+    -- | The status of the recommender update.
+    --
+    -- A recommender can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   STOP PENDING > STOP IN_PROGRESS > INACTIVE > START PENDING > START
+    --     IN_PROGRESS > ACTIVE
+    --
+    -- -   DELETE PENDING > DELETE IN_PROGRESS
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'RecommenderUpdateSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'recommenderUpdateSummary_creationDateTime' - The date and time (in Unix format) that the recommender update was
+-- created.
+--
+-- 'failureReason', 'recommenderUpdateSummary_failureReason' - If a recommender update fails, the reason behind the failure.
+--
+-- 'lastUpdatedDateTime', 'recommenderUpdateSummary_lastUpdatedDateTime' - The date and time (in Unix time) that the recommender update was last
+-- updated.
+--
+-- 'recommenderConfig', 'recommenderUpdateSummary_recommenderConfig' - The configuration details of the recommender update.
+--
+-- 'status', 'recommenderUpdateSummary_status' - The status of the recommender update.
+--
+-- A recommender can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   STOP PENDING > STOP IN_PROGRESS > INACTIVE > START PENDING > START
+--     IN_PROGRESS > ACTIVE
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+newRecommenderUpdateSummary ::
+  RecommenderUpdateSummary
+newRecommenderUpdateSummary =
+  RecommenderUpdateSummary'
+    { creationDateTime =
+        Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      recommenderConfig = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix format) that the recommender update was
+-- created.
+recommenderUpdateSummary_creationDateTime :: Lens.Lens' RecommenderUpdateSummary (Prelude.Maybe Prelude.UTCTime)
+recommenderUpdateSummary_creationDateTime = Lens.lens (\RecommenderUpdateSummary' {creationDateTime} -> creationDateTime) (\s@RecommenderUpdateSummary' {} a -> s {creationDateTime = a} :: RecommenderUpdateSummary) Prelude.. Lens.mapping Data._Time
+
+-- | If a recommender update fails, the reason behind the failure.
+recommenderUpdateSummary_failureReason :: Lens.Lens' RecommenderUpdateSummary (Prelude.Maybe Prelude.Text)
+recommenderUpdateSummary_failureReason = Lens.lens (\RecommenderUpdateSummary' {failureReason} -> failureReason) (\s@RecommenderUpdateSummary' {} a -> s {failureReason = a} :: RecommenderUpdateSummary)
+
+-- | The date and time (in Unix time) that the recommender update was last
+-- updated.
+recommenderUpdateSummary_lastUpdatedDateTime :: Lens.Lens' RecommenderUpdateSummary (Prelude.Maybe Prelude.UTCTime)
+recommenderUpdateSummary_lastUpdatedDateTime = Lens.lens (\RecommenderUpdateSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@RecommenderUpdateSummary' {} a -> s {lastUpdatedDateTime = a} :: RecommenderUpdateSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The configuration details of the recommender update.
+recommenderUpdateSummary_recommenderConfig :: Lens.Lens' RecommenderUpdateSummary (Prelude.Maybe RecommenderConfig)
+recommenderUpdateSummary_recommenderConfig = Lens.lens (\RecommenderUpdateSummary' {recommenderConfig} -> recommenderConfig) (\s@RecommenderUpdateSummary' {} a -> s {recommenderConfig = a} :: RecommenderUpdateSummary)
+
+-- | The status of the recommender update.
+--
+-- A recommender can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   STOP PENDING > STOP IN_PROGRESS > INACTIVE > START PENDING > START
+--     IN_PROGRESS > ACTIVE
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+recommenderUpdateSummary_status :: Lens.Lens' RecommenderUpdateSummary (Prelude.Maybe Prelude.Text)
+recommenderUpdateSummary_status = Lens.lens (\RecommenderUpdateSummary' {status} -> status) (\s@RecommenderUpdateSummary' {} a -> s {status = a} :: RecommenderUpdateSummary)
+
+instance Data.FromJSON RecommenderUpdateSummary where
+  parseJSON =
+    Data.withObject
+      "RecommenderUpdateSummary"
+      ( \x ->
+          RecommenderUpdateSummary'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "recommenderConfig")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable RecommenderUpdateSummary where
+  hashWithSalt _salt RecommenderUpdateSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` recommenderConfig
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData RecommenderUpdateSummary where
+  rnf RecommenderUpdateSummary' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf recommenderConfig
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/S3DataConfig.hs b/gen/Amazonka/Personalize/Types/S3DataConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/S3DataConfig.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.S3DataConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.S3DataConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The configuration details of an Amazon S3 input or output bucket.
+--
+-- /See:/ 'newS3DataConfig' smart constructor.
+data S3DataConfig = S3DataConfig'
+  { -- | The Amazon Resource Name (ARN) of the Key Management Service (KMS) key
+    -- that Amazon Personalize uses to encrypt or decrypt the input and output
+    -- files.
+    kmsKeyArn :: Prelude.Maybe Prelude.Text,
+    -- | The file path of the Amazon S3 bucket.
+    path :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'S3DataConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'kmsKeyArn', 's3DataConfig_kmsKeyArn' - The Amazon Resource Name (ARN) of the Key Management Service (KMS) key
+-- that Amazon Personalize uses to encrypt or decrypt the input and output
+-- files.
+--
+-- 'path', 's3DataConfig_path' - The file path of the Amazon S3 bucket.
+newS3DataConfig ::
+  -- | 'path'
+  Prelude.Text ->
+  S3DataConfig
+newS3DataConfig pPath_ =
+  S3DataConfig'
+    { kmsKeyArn = Prelude.Nothing,
+      path = pPath_
+    }
+
+-- | The Amazon Resource Name (ARN) of the Key Management Service (KMS) key
+-- that Amazon Personalize uses to encrypt or decrypt the input and output
+-- files.
+s3DataConfig_kmsKeyArn :: Lens.Lens' S3DataConfig (Prelude.Maybe Prelude.Text)
+s3DataConfig_kmsKeyArn = Lens.lens (\S3DataConfig' {kmsKeyArn} -> kmsKeyArn) (\s@S3DataConfig' {} a -> s {kmsKeyArn = a} :: S3DataConfig)
+
+-- | The file path of the Amazon S3 bucket.
+s3DataConfig_path :: Lens.Lens' S3DataConfig Prelude.Text
+s3DataConfig_path = Lens.lens (\S3DataConfig' {path} -> path) (\s@S3DataConfig' {} a -> s {path = a} :: S3DataConfig)
+
+instance Data.FromJSON S3DataConfig where
+  parseJSON =
+    Data.withObject
+      "S3DataConfig"
+      ( \x ->
+          S3DataConfig'
+            Prelude.<$> (x Data..:? "kmsKeyArn")
+            Prelude.<*> (x Data..: "path")
+      )
+
+instance Prelude.Hashable S3DataConfig where
+  hashWithSalt _salt S3DataConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` kmsKeyArn
+      `Prelude.hashWithSalt` path
+
+instance Prelude.NFData S3DataConfig where
+  rnf S3DataConfig' {..} =
+    Prelude.rnf kmsKeyArn
+      `Prelude.seq` Prelude.rnf path
+
+instance Data.ToJSON S3DataConfig where
+  toJSON S3DataConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("kmsKeyArn" Data..=) Prelude.<$> kmsKeyArn,
+            Prelude.Just ("path" Data..= path)
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/Solution.hs b/gen/Amazonka/Personalize/Types/Solution.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/Solution.hs
@@ -0,0 +1,262 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.Solution
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.Solution where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.AutoMLResult
+import Amazonka.Personalize.Types.SolutionConfig
+import Amazonka.Personalize.Types.SolutionVersionSummary
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that provides information about a solution. A solution is a
+-- trained model that can be deployed as a campaign.
+--
+-- /See:/ 'newSolution' smart constructor.
+data Solution = Solution'
+  { -- | When @performAutoML@ is true, specifies the best recipe found.
+    autoMLResult :: Prelude.Maybe AutoMLResult,
+    -- | The creation date and time (in Unix time) of the solution.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the dataset group that provides the
+    -- training data.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The event type (for example, \'click\' or \'like\') that is used for
+    -- training the model. If no @eventType@ is provided, Amazon Personalize
+    -- uses all interactions for training with equal weight regardless of type.
+    eventType :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) that the solution was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | Describes the latest version of the solution, including the status and
+    -- the ARN.
+    latestSolutionVersion :: Prelude.Maybe SolutionVersionSummary,
+    -- | The name of the solution.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | When true, Amazon Personalize performs a search for the best
+    -- USER_PERSONALIZATION recipe from the list specified in the solution
+    -- configuration (@recipeArn@ must not be specified). When false (the
+    -- default), Amazon Personalize uses @recipeArn@ for training.
+    performAutoML :: Prelude.Maybe Prelude.Bool,
+    -- | Whether to perform hyperparameter optimization (HPO) on the chosen
+    -- recipe. The default is @false@.
+    performHPO :: Prelude.Maybe Prelude.Bool,
+    -- | The ARN of the recipe used to create the solution.
+    recipeArn :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the solution.
+    solutionArn :: Prelude.Maybe Prelude.Text,
+    -- | Describes the configuration properties for the solution.
+    solutionConfig :: Prelude.Maybe SolutionConfig,
+    -- | The status of the solution.
+    --
+    -- A solution can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   DELETE PENDING > DELETE IN_PROGRESS
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Solution' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'autoMLResult', 'solution_autoMLResult' - When @performAutoML@ is true, specifies the best recipe found.
+--
+-- 'creationDateTime', 'solution_creationDateTime' - The creation date and time (in Unix time) of the solution.
+--
+-- 'datasetGroupArn', 'solution_datasetGroupArn' - The Amazon Resource Name (ARN) of the dataset group that provides the
+-- training data.
+--
+-- 'eventType', 'solution_eventType' - The event type (for example, \'click\' or \'like\') that is used for
+-- training the model. If no @eventType@ is provided, Amazon Personalize
+-- uses all interactions for training with equal weight regardless of type.
+--
+-- 'lastUpdatedDateTime', 'solution_lastUpdatedDateTime' - The date and time (in Unix time) that the solution was last updated.
+--
+-- 'latestSolutionVersion', 'solution_latestSolutionVersion' - Describes the latest version of the solution, including the status and
+-- the ARN.
+--
+-- 'name', 'solution_name' - The name of the solution.
+--
+-- 'performAutoML', 'solution_performAutoML' - When true, Amazon Personalize performs a search for the best
+-- USER_PERSONALIZATION recipe from the list specified in the solution
+-- configuration (@recipeArn@ must not be specified). When false (the
+-- default), Amazon Personalize uses @recipeArn@ for training.
+--
+-- 'performHPO', 'solution_performHPO' - Whether to perform hyperparameter optimization (HPO) on the chosen
+-- recipe. The default is @false@.
+--
+-- 'recipeArn', 'solution_recipeArn' - The ARN of the recipe used to create the solution.
+--
+-- 'solutionArn', 'solution_solutionArn' - The ARN of the solution.
+--
+-- 'solutionConfig', 'solution_solutionConfig' - Describes the configuration properties for the solution.
+--
+-- 'status', 'solution_status' - The status of the solution.
+--
+-- A solution can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+newSolution ::
+  Solution
+newSolution =
+  Solution'
+    { autoMLResult = Prelude.Nothing,
+      creationDateTime = Prelude.Nothing,
+      datasetGroupArn = Prelude.Nothing,
+      eventType = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      latestSolutionVersion = Prelude.Nothing,
+      name = Prelude.Nothing,
+      performAutoML = Prelude.Nothing,
+      performHPO = Prelude.Nothing,
+      recipeArn = Prelude.Nothing,
+      solutionArn = Prelude.Nothing,
+      solutionConfig = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | When @performAutoML@ is true, specifies the best recipe found.
+solution_autoMLResult :: Lens.Lens' Solution (Prelude.Maybe AutoMLResult)
+solution_autoMLResult = Lens.lens (\Solution' {autoMLResult} -> autoMLResult) (\s@Solution' {} a -> s {autoMLResult = a} :: Solution)
+
+-- | The creation date and time (in Unix time) of the solution.
+solution_creationDateTime :: Lens.Lens' Solution (Prelude.Maybe Prelude.UTCTime)
+solution_creationDateTime = Lens.lens (\Solution' {creationDateTime} -> creationDateTime) (\s@Solution' {} a -> s {creationDateTime = a} :: Solution) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the dataset group that provides the
+-- training data.
+solution_datasetGroupArn :: Lens.Lens' Solution (Prelude.Maybe Prelude.Text)
+solution_datasetGroupArn = Lens.lens (\Solution' {datasetGroupArn} -> datasetGroupArn) (\s@Solution' {} a -> s {datasetGroupArn = a} :: Solution)
+
+-- | The event type (for example, \'click\' or \'like\') that is used for
+-- training the model. If no @eventType@ is provided, Amazon Personalize
+-- uses all interactions for training with equal weight regardless of type.
+solution_eventType :: Lens.Lens' Solution (Prelude.Maybe Prelude.Text)
+solution_eventType = Lens.lens (\Solution' {eventType} -> eventType) (\s@Solution' {} a -> s {eventType = a} :: Solution)
+
+-- | The date and time (in Unix time) that the solution was last updated.
+solution_lastUpdatedDateTime :: Lens.Lens' Solution (Prelude.Maybe Prelude.UTCTime)
+solution_lastUpdatedDateTime = Lens.lens (\Solution' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@Solution' {} a -> s {lastUpdatedDateTime = a} :: Solution) Prelude.. Lens.mapping Data._Time
+
+-- | Describes the latest version of the solution, including the status and
+-- the ARN.
+solution_latestSolutionVersion :: Lens.Lens' Solution (Prelude.Maybe SolutionVersionSummary)
+solution_latestSolutionVersion = Lens.lens (\Solution' {latestSolutionVersion} -> latestSolutionVersion) (\s@Solution' {} a -> s {latestSolutionVersion = a} :: Solution)
+
+-- | The name of the solution.
+solution_name :: Lens.Lens' Solution (Prelude.Maybe Prelude.Text)
+solution_name = Lens.lens (\Solution' {name} -> name) (\s@Solution' {} a -> s {name = a} :: Solution)
+
+-- | When true, Amazon Personalize performs a search for the best
+-- USER_PERSONALIZATION recipe from the list specified in the solution
+-- configuration (@recipeArn@ must not be specified). When false (the
+-- default), Amazon Personalize uses @recipeArn@ for training.
+solution_performAutoML :: Lens.Lens' Solution (Prelude.Maybe Prelude.Bool)
+solution_performAutoML = Lens.lens (\Solution' {performAutoML} -> performAutoML) (\s@Solution' {} a -> s {performAutoML = a} :: Solution)
+
+-- | Whether to perform hyperparameter optimization (HPO) on the chosen
+-- recipe. The default is @false@.
+solution_performHPO :: Lens.Lens' Solution (Prelude.Maybe Prelude.Bool)
+solution_performHPO = Lens.lens (\Solution' {performHPO} -> performHPO) (\s@Solution' {} a -> s {performHPO = a} :: Solution)
+
+-- | The ARN of the recipe used to create the solution.
+solution_recipeArn :: Lens.Lens' Solution (Prelude.Maybe Prelude.Text)
+solution_recipeArn = Lens.lens (\Solution' {recipeArn} -> recipeArn) (\s@Solution' {} a -> s {recipeArn = a} :: Solution)
+
+-- | The ARN of the solution.
+solution_solutionArn :: Lens.Lens' Solution (Prelude.Maybe Prelude.Text)
+solution_solutionArn = Lens.lens (\Solution' {solutionArn} -> solutionArn) (\s@Solution' {} a -> s {solutionArn = a} :: Solution)
+
+-- | Describes the configuration properties for the solution.
+solution_solutionConfig :: Lens.Lens' Solution (Prelude.Maybe SolutionConfig)
+solution_solutionConfig = Lens.lens (\Solution' {solutionConfig} -> solutionConfig) (\s@Solution' {} a -> s {solutionConfig = a} :: Solution)
+
+-- | The status of the solution.
+--
+-- A solution can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+solution_status :: Lens.Lens' Solution (Prelude.Maybe Prelude.Text)
+solution_status = Lens.lens (\Solution' {status} -> status) (\s@Solution' {} a -> s {status = a} :: Solution)
+
+instance Data.FromJSON Solution where
+  parseJSON =
+    Data.withObject
+      "Solution"
+      ( \x ->
+          Solution'
+            Prelude.<$> (x Data..:? "autoMLResult")
+            Prelude.<*> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetGroupArn")
+            Prelude.<*> (x Data..:? "eventType")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "latestSolutionVersion")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "performAutoML")
+            Prelude.<*> (x Data..:? "performHPO")
+            Prelude.<*> (x Data..:? "recipeArn")
+            Prelude.<*> (x Data..:? "solutionArn")
+            Prelude.<*> (x Data..:? "solutionConfig")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable Solution where
+  hashWithSalt _salt Solution' {..} =
+    _salt
+      `Prelude.hashWithSalt` autoMLResult
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` eventType
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` latestSolutionVersion
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` performAutoML
+      `Prelude.hashWithSalt` performHPO
+      `Prelude.hashWithSalt` recipeArn
+      `Prelude.hashWithSalt` solutionArn
+      `Prelude.hashWithSalt` solutionConfig
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData Solution where
+  rnf Solution' {..} =
+    Prelude.rnf autoMLResult
+      `Prelude.seq` Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf eventType
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf latestSolutionVersion
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf performAutoML
+      `Prelude.seq` Prelude.rnf performHPO
+      `Prelude.seq` Prelude.rnf recipeArn
+      `Prelude.seq` Prelude.rnf solutionArn
+      `Prelude.seq` Prelude.rnf solutionConfig
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/SolutionConfig.hs b/gen/Amazonka/Personalize/Types/SolutionConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/SolutionConfig.hs
@@ -0,0 +1,174 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.SolutionConfig
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.SolutionConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.AutoMLConfig
+import Amazonka.Personalize.Types.HPOConfig
+import Amazonka.Personalize.Types.OptimizationObjective
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes the configuration properties for the solution.
+--
+-- /See:/ 'newSolutionConfig' smart constructor.
+data SolutionConfig = SolutionConfig'
+  { -- | Lists the hyperparameter names and ranges.
+    algorithmHyperParameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | The
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/API_AutoMLConfig.html AutoMLConfig>
+    -- object containing a list of recipes to search when AutoML is performed.
+    autoMLConfig :: Prelude.Maybe AutoMLConfig,
+    -- | Only events with a value greater than or equal to this threshold are
+    -- used for training a model.
+    eventValueThreshold :: Prelude.Maybe Prelude.Text,
+    -- | Lists the feature transformation parameters.
+    featureTransformationParameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text),
+    -- | Describes the properties for hyperparameter optimization (HPO).
+    hpoConfig :: Prelude.Maybe HPOConfig,
+    -- | Describes the additional objective for the solution, such as maximizing
+    -- streaming minutes or increasing revenue. For more information see
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/optimizing-solution-for-objective.html Optimizing a solution>.
+    optimizationObjective :: Prelude.Maybe OptimizationObjective
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SolutionConfig' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'algorithmHyperParameters', 'solutionConfig_algorithmHyperParameters' - Lists the hyperparameter names and ranges.
+--
+-- 'autoMLConfig', 'solutionConfig_autoMLConfig' - The
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_AutoMLConfig.html AutoMLConfig>
+-- object containing a list of recipes to search when AutoML is performed.
+--
+-- 'eventValueThreshold', 'solutionConfig_eventValueThreshold' - Only events with a value greater than or equal to this threshold are
+-- used for training a model.
+--
+-- 'featureTransformationParameters', 'solutionConfig_featureTransformationParameters' - Lists the feature transformation parameters.
+--
+-- 'hpoConfig', 'solutionConfig_hpoConfig' - Describes the properties for hyperparameter optimization (HPO).
+--
+-- 'optimizationObjective', 'solutionConfig_optimizationObjective' - Describes the additional objective for the solution, such as maximizing
+-- streaming minutes or increasing revenue. For more information see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/optimizing-solution-for-objective.html Optimizing a solution>.
+newSolutionConfig ::
+  SolutionConfig
+newSolutionConfig =
+  SolutionConfig'
+    { algorithmHyperParameters =
+        Prelude.Nothing,
+      autoMLConfig = Prelude.Nothing,
+      eventValueThreshold = Prelude.Nothing,
+      featureTransformationParameters = Prelude.Nothing,
+      hpoConfig = Prelude.Nothing,
+      optimizationObjective = Prelude.Nothing
+    }
+
+-- | Lists the hyperparameter names and ranges.
+solutionConfig_algorithmHyperParameters :: Lens.Lens' SolutionConfig (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+solutionConfig_algorithmHyperParameters = Lens.lens (\SolutionConfig' {algorithmHyperParameters} -> algorithmHyperParameters) (\s@SolutionConfig' {} a -> s {algorithmHyperParameters = a} :: SolutionConfig) Prelude.. Lens.mapping Lens.coerced
+
+-- | The
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_AutoMLConfig.html AutoMLConfig>
+-- object containing a list of recipes to search when AutoML is performed.
+solutionConfig_autoMLConfig :: Lens.Lens' SolutionConfig (Prelude.Maybe AutoMLConfig)
+solutionConfig_autoMLConfig = Lens.lens (\SolutionConfig' {autoMLConfig} -> autoMLConfig) (\s@SolutionConfig' {} a -> s {autoMLConfig = a} :: SolutionConfig)
+
+-- | Only events with a value greater than or equal to this threshold are
+-- used for training a model.
+solutionConfig_eventValueThreshold :: Lens.Lens' SolutionConfig (Prelude.Maybe Prelude.Text)
+solutionConfig_eventValueThreshold = Lens.lens (\SolutionConfig' {eventValueThreshold} -> eventValueThreshold) (\s@SolutionConfig' {} a -> s {eventValueThreshold = a} :: SolutionConfig)
+
+-- | Lists the feature transformation parameters.
+solutionConfig_featureTransformationParameters :: Lens.Lens' SolutionConfig (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+solutionConfig_featureTransformationParameters = Lens.lens (\SolutionConfig' {featureTransformationParameters} -> featureTransformationParameters) (\s@SolutionConfig' {} a -> s {featureTransformationParameters = a} :: SolutionConfig) Prelude.. Lens.mapping Lens.coerced
+
+-- | Describes the properties for hyperparameter optimization (HPO).
+solutionConfig_hpoConfig :: Lens.Lens' SolutionConfig (Prelude.Maybe HPOConfig)
+solutionConfig_hpoConfig = Lens.lens (\SolutionConfig' {hpoConfig} -> hpoConfig) (\s@SolutionConfig' {} a -> s {hpoConfig = a} :: SolutionConfig)
+
+-- | Describes the additional objective for the solution, such as maximizing
+-- streaming minutes or increasing revenue. For more information see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/optimizing-solution-for-objective.html Optimizing a solution>.
+solutionConfig_optimizationObjective :: Lens.Lens' SolutionConfig (Prelude.Maybe OptimizationObjective)
+solutionConfig_optimizationObjective = Lens.lens (\SolutionConfig' {optimizationObjective} -> optimizationObjective) (\s@SolutionConfig' {} a -> s {optimizationObjective = a} :: SolutionConfig)
+
+instance Data.FromJSON SolutionConfig where
+  parseJSON =
+    Data.withObject
+      "SolutionConfig"
+      ( \x ->
+          SolutionConfig'
+            Prelude.<$> ( x
+                            Data..:? "algorithmHyperParameters"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "autoMLConfig")
+            Prelude.<*> (x Data..:? "eventValueThreshold")
+            Prelude.<*> ( x
+                            Data..:? "featureTransformationParameters"
+                            Data..!= Prelude.mempty
+                        )
+            Prelude.<*> (x Data..:? "hpoConfig")
+            Prelude.<*> (x Data..:? "optimizationObjective")
+      )
+
+instance Prelude.Hashable SolutionConfig where
+  hashWithSalt _salt SolutionConfig' {..} =
+    _salt
+      `Prelude.hashWithSalt` algorithmHyperParameters
+      `Prelude.hashWithSalt` autoMLConfig
+      `Prelude.hashWithSalt` eventValueThreshold
+      `Prelude.hashWithSalt` featureTransformationParameters
+      `Prelude.hashWithSalt` hpoConfig
+      `Prelude.hashWithSalt` optimizationObjective
+
+instance Prelude.NFData SolutionConfig where
+  rnf SolutionConfig' {..} =
+    Prelude.rnf algorithmHyperParameters
+      `Prelude.seq` Prelude.rnf autoMLConfig
+      `Prelude.seq` Prelude.rnf eventValueThreshold
+      `Prelude.seq` Prelude.rnf featureTransformationParameters
+      `Prelude.seq` Prelude.rnf hpoConfig
+      `Prelude.seq` Prelude.rnf optimizationObjective
+
+instance Data.ToJSON SolutionConfig where
+  toJSON SolutionConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("algorithmHyperParameters" Data..=)
+              Prelude.<$> algorithmHyperParameters,
+            ("autoMLConfig" Data..=) Prelude.<$> autoMLConfig,
+            ("eventValueThreshold" Data..=)
+              Prelude.<$> eventValueThreshold,
+            ("featureTransformationParameters" Data..=)
+              Prelude.<$> featureTransformationParameters,
+            ("hpoConfig" Data..=) Prelude.<$> hpoConfig,
+            ("optimizationObjective" Data..=)
+              Prelude.<$> optimizationObjective
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/SolutionSummary.hs b/gen/Amazonka/Personalize/Types/SolutionSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/SolutionSummary.hs
@@ -0,0 +1,154 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.SolutionSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.SolutionSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of a solution. For a complete
+-- listing, call the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSolution.html DescribeSolution>
+-- API.
+--
+-- /See:/ 'newSolutionSummary' smart constructor.
+data SolutionSummary = SolutionSummary'
+  { -- | The date and time (in Unix time) that the solution was created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The date and time (in Unix time) that the solution was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the solution.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the recipe used by the solution.
+    recipeArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the solution.
+    solutionArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the solution.
+    --
+    -- A solution can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    --
+    -- -   DELETE PENDING > DELETE IN_PROGRESS
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SolutionSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'solutionSummary_creationDateTime' - The date and time (in Unix time) that the solution was created.
+--
+-- 'lastUpdatedDateTime', 'solutionSummary_lastUpdatedDateTime' - The date and time (in Unix time) that the solution was last updated.
+--
+-- 'name', 'solutionSummary_name' - The name of the solution.
+--
+-- 'recipeArn', 'solutionSummary_recipeArn' - The Amazon Resource Name (ARN) of the recipe used by the solution.
+--
+-- 'solutionArn', 'solutionSummary_solutionArn' - The Amazon Resource Name (ARN) of the solution.
+--
+-- 'status', 'solutionSummary_status' - The status of the solution.
+--
+-- A solution can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+newSolutionSummary ::
+  SolutionSummary
+newSolutionSummary =
+  SolutionSummary'
+    { creationDateTime =
+        Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      recipeArn = Prelude.Nothing,
+      solutionArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix time) that the solution was created.
+solutionSummary_creationDateTime :: Lens.Lens' SolutionSummary (Prelude.Maybe Prelude.UTCTime)
+solutionSummary_creationDateTime = Lens.lens (\SolutionSummary' {creationDateTime} -> creationDateTime) (\s@SolutionSummary' {} a -> s {creationDateTime = a} :: SolutionSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The date and time (in Unix time) that the solution was last updated.
+solutionSummary_lastUpdatedDateTime :: Lens.Lens' SolutionSummary (Prelude.Maybe Prelude.UTCTime)
+solutionSummary_lastUpdatedDateTime = Lens.lens (\SolutionSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@SolutionSummary' {} a -> s {lastUpdatedDateTime = a} :: SolutionSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the solution.
+solutionSummary_name :: Lens.Lens' SolutionSummary (Prelude.Maybe Prelude.Text)
+solutionSummary_name = Lens.lens (\SolutionSummary' {name} -> name) (\s@SolutionSummary' {} a -> s {name = a} :: SolutionSummary)
+
+-- | The Amazon Resource Name (ARN) of the recipe used by the solution.
+solutionSummary_recipeArn :: Lens.Lens' SolutionSummary (Prelude.Maybe Prelude.Text)
+solutionSummary_recipeArn = Lens.lens (\SolutionSummary' {recipeArn} -> recipeArn) (\s@SolutionSummary' {} a -> s {recipeArn = a} :: SolutionSummary)
+
+-- | The Amazon Resource Name (ARN) of the solution.
+solutionSummary_solutionArn :: Lens.Lens' SolutionSummary (Prelude.Maybe Prelude.Text)
+solutionSummary_solutionArn = Lens.lens (\SolutionSummary' {solutionArn} -> solutionArn) (\s@SolutionSummary' {} a -> s {solutionArn = a} :: SolutionSummary)
+
+-- | The status of the solution.
+--
+-- A solution can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+--
+-- -   DELETE PENDING > DELETE IN_PROGRESS
+solutionSummary_status :: Lens.Lens' SolutionSummary (Prelude.Maybe Prelude.Text)
+solutionSummary_status = Lens.lens (\SolutionSummary' {status} -> status) (\s@SolutionSummary' {} a -> s {status = a} :: SolutionSummary)
+
+instance Data.FromJSON SolutionSummary where
+  parseJSON =
+    Data.withObject
+      "SolutionSummary"
+      ( \x ->
+          SolutionSummary'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "recipeArn")
+            Prelude.<*> (x Data..:? "solutionArn")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable SolutionSummary where
+  hashWithSalt _salt SolutionSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` recipeArn
+      `Prelude.hashWithSalt` solutionArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData SolutionSummary where
+  rnf SolutionSummary' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf recipeArn
+      `Prelude.seq` Prelude.rnf solutionArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/SolutionVersion.hs b/gen/Amazonka/Personalize/Types/SolutionVersion.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/SolutionVersion.hs
@@ -0,0 +1,366 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.SolutionVersion
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.SolutionVersion where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types.SolutionConfig
+import Amazonka.Personalize.Types.TrainingMode
+import Amazonka.Personalize.Types.TunedHPOParams
+import qualified Amazonka.Prelude as Prelude
+
+-- | An object that provides information about a specific version of a
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_Solution.html Solution>
+-- in a Custom dataset group.
+--
+-- /See:/ 'newSolutionVersion' smart constructor.
+data SolutionVersion = SolutionVersion'
+  { -- | The date and time (in Unix time) that this version of the solution was
+    -- created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the dataset group providing the
+    -- training data.
+    datasetGroupArn :: Prelude.Maybe Prelude.Text,
+    -- | The event type (for example, \'click\' or \'like\') that is used for
+    -- training the model.
+    eventType :: Prelude.Maybe Prelude.Text,
+    -- | If training a solution version fails, the reason for the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) that the solution was last updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The name of the solution version.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | When true, Amazon Personalize searches for the most optimal recipe
+    -- according to the solution configuration. When false (the default),
+    -- Amazon Personalize uses @recipeArn@.
+    performAutoML :: Prelude.Maybe Prelude.Bool,
+    -- | Whether to perform hyperparameter optimization (HPO) on the chosen
+    -- recipe. The default is @false@.
+    performHPO :: Prelude.Maybe Prelude.Bool,
+    -- | The ARN of the recipe used in the solution.
+    recipeArn :: Prelude.Maybe Prelude.Text,
+    -- | The ARN of the solution.
+    solutionArn :: Prelude.Maybe Prelude.Text,
+    -- | Describes the configuration properties for the solution.
+    solutionConfig :: Prelude.Maybe SolutionConfig,
+    -- | The ARN of the solution version.
+    solutionVersionArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the solution version.
+    --
+    -- A solution version can be in one of the following states:
+    --
+    -- -   CREATE PENDING
+    --
+    -- -   CREATE IN_PROGRESS
+    --
+    -- -   ACTIVE
+    --
+    -- -   CREATE FAILED
+    --
+    -- -   CREATE STOPPING
+    --
+    -- -   CREATE STOPPED
+    status :: Prelude.Maybe Prelude.Text,
+    -- | The time used to train the model. You are billed for the time it takes
+    -- to train a model. This field is visible only after Amazon Personalize
+    -- successfully trains a model.
+    trainingHours :: Prelude.Maybe Prelude.Double,
+    -- | The scope of training to be performed when creating the solution
+    -- version. The @FULL@ option trains the solution version based on the
+    -- entirety of the input solution\'s training data, while the @UPDATE@
+    -- option processes only the data that has changed in comparison to the
+    -- input solution. Choose @UPDATE@ when you want to incrementally update
+    -- your solution version instead of creating an entirely new one.
+    --
+    -- The @UPDATE@ option can only be used when you already have an active
+    -- solution version created from the input solution using the @FULL@ option
+    -- and the input solution was trained with the
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html User-Personalization>
+    -- recipe or the
+    -- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-hrnn-coldstart.html HRNN-Coldstart>
+    -- recipe.
+    trainingMode :: Prelude.Maybe TrainingMode,
+    -- | If hyperparameter optimization was performed, contains the
+    -- hyperparameter values of the best performing model.
+    tunedHPOParams :: Prelude.Maybe TunedHPOParams
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SolutionVersion' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'solutionVersion_creationDateTime' - The date and time (in Unix time) that this version of the solution was
+-- created.
+--
+-- 'datasetGroupArn', 'solutionVersion_datasetGroupArn' - The Amazon Resource Name (ARN) of the dataset group providing the
+-- training data.
+--
+-- 'eventType', 'solutionVersion_eventType' - The event type (for example, \'click\' or \'like\') that is used for
+-- training the model.
+--
+-- 'failureReason', 'solutionVersion_failureReason' - If training a solution version fails, the reason for the failure.
+--
+-- 'lastUpdatedDateTime', 'solutionVersion_lastUpdatedDateTime' - The date and time (in Unix time) that the solution was last updated.
+--
+-- 'name', 'solutionVersion_name' - The name of the solution version.
+--
+-- 'performAutoML', 'solutionVersion_performAutoML' - When true, Amazon Personalize searches for the most optimal recipe
+-- according to the solution configuration. When false (the default),
+-- Amazon Personalize uses @recipeArn@.
+--
+-- 'performHPO', 'solutionVersion_performHPO' - Whether to perform hyperparameter optimization (HPO) on the chosen
+-- recipe. The default is @false@.
+--
+-- 'recipeArn', 'solutionVersion_recipeArn' - The ARN of the recipe used in the solution.
+--
+-- 'solutionArn', 'solutionVersion_solutionArn' - The ARN of the solution.
+--
+-- 'solutionConfig', 'solutionVersion_solutionConfig' - Describes the configuration properties for the solution.
+--
+-- 'solutionVersionArn', 'solutionVersion_solutionVersionArn' - The ARN of the solution version.
+--
+-- 'status', 'solutionVersion_status' - The status of the solution version.
+--
+-- A solution version can be in one of the following states:
+--
+-- -   CREATE PENDING
+--
+-- -   CREATE IN_PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+--
+-- -   CREATE STOPPING
+--
+-- -   CREATE STOPPED
+--
+-- 'trainingHours', 'solutionVersion_trainingHours' - The time used to train the model. You are billed for the time it takes
+-- to train a model. This field is visible only after Amazon Personalize
+-- successfully trains a model.
+--
+-- 'trainingMode', 'solutionVersion_trainingMode' - The scope of training to be performed when creating the solution
+-- version. The @FULL@ option trains the solution version based on the
+-- entirety of the input solution\'s training data, while the @UPDATE@
+-- option processes only the data that has changed in comparison to the
+-- input solution. Choose @UPDATE@ when you want to incrementally update
+-- your solution version instead of creating an entirely new one.
+--
+-- The @UPDATE@ option can only be used when you already have an active
+-- solution version created from the input solution using the @FULL@ option
+-- and the input solution was trained with the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html User-Personalization>
+-- recipe or the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-hrnn-coldstart.html HRNN-Coldstart>
+-- recipe.
+--
+-- 'tunedHPOParams', 'solutionVersion_tunedHPOParams' - If hyperparameter optimization was performed, contains the
+-- hyperparameter values of the best performing model.
+newSolutionVersion ::
+  SolutionVersion
+newSolutionVersion =
+  SolutionVersion'
+    { creationDateTime =
+        Prelude.Nothing,
+      datasetGroupArn = Prelude.Nothing,
+      eventType = Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      name = Prelude.Nothing,
+      performAutoML = Prelude.Nothing,
+      performHPO = Prelude.Nothing,
+      recipeArn = Prelude.Nothing,
+      solutionArn = Prelude.Nothing,
+      solutionConfig = Prelude.Nothing,
+      solutionVersionArn = Prelude.Nothing,
+      status = Prelude.Nothing,
+      trainingHours = Prelude.Nothing,
+      trainingMode = Prelude.Nothing,
+      tunedHPOParams = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix time) that this version of the solution was
+-- created.
+solutionVersion_creationDateTime :: Lens.Lens' SolutionVersion (Prelude.Maybe Prelude.UTCTime)
+solutionVersion_creationDateTime = Lens.lens (\SolutionVersion' {creationDateTime} -> creationDateTime) (\s@SolutionVersion' {} a -> s {creationDateTime = a} :: SolutionVersion) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the dataset group providing the
+-- training data.
+solutionVersion_datasetGroupArn :: Lens.Lens' SolutionVersion (Prelude.Maybe Prelude.Text)
+solutionVersion_datasetGroupArn = Lens.lens (\SolutionVersion' {datasetGroupArn} -> datasetGroupArn) (\s@SolutionVersion' {} a -> s {datasetGroupArn = a} :: SolutionVersion)
+
+-- | The event type (for example, \'click\' or \'like\') that is used for
+-- training the model.
+solutionVersion_eventType :: Lens.Lens' SolutionVersion (Prelude.Maybe Prelude.Text)
+solutionVersion_eventType = Lens.lens (\SolutionVersion' {eventType} -> eventType) (\s@SolutionVersion' {} a -> s {eventType = a} :: SolutionVersion)
+
+-- | If training a solution version fails, the reason for the failure.
+solutionVersion_failureReason :: Lens.Lens' SolutionVersion (Prelude.Maybe Prelude.Text)
+solutionVersion_failureReason = Lens.lens (\SolutionVersion' {failureReason} -> failureReason) (\s@SolutionVersion' {} a -> s {failureReason = a} :: SolutionVersion)
+
+-- | The date and time (in Unix time) that the solution was last updated.
+solutionVersion_lastUpdatedDateTime :: Lens.Lens' SolutionVersion (Prelude.Maybe Prelude.UTCTime)
+solutionVersion_lastUpdatedDateTime = Lens.lens (\SolutionVersion' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@SolutionVersion' {} a -> s {lastUpdatedDateTime = a} :: SolutionVersion) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the solution version.
+solutionVersion_name :: Lens.Lens' SolutionVersion (Prelude.Maybe Prelude.Text)
+solutionVersion_name = Lens.lens (\SolutionVersion' {name} -> name) (\s@SolutionVersion' {} a -> s {name = a} :: SolutionVersion)
+
+-- | When true, Amazon Personalize searches for the most optimal recipe
+-- according to the solution configuration. When false (the default),
+-- Amazon Personalize uses @recipeArn@.
+solutionVersion_performAutoML :: Lens.Lens' SolutionVersion (Prelude.Maybe Prelude.Bool)
+solutionVersion_performAutoML = Lens.lens (\SolutionVersion' {performAutoML} -> performAutoML) (\s@SolutionVersion' {} a -> s {performAutoML = a} :: SolutionVersion)
+
+-- | Whether to perform hyperparameter optimization (HPO) on the chosen
+-- recipe. The default is @false@.
+solutionVersion_performHPO :: Lens.Lens' SolutionVersion (Prelude.Maybe Prelude.Bool)
+solutionVersion_performHPO = Lens.lens (\SolutionVersion' {performHPO} -> performHPO) (\s@SolutionVersion' {} a -> s {performHPO = a} :: SolutionVersion)
+
+-- | The ARN of the recipe used in the solution.
+solutionVersion_recipeArn :: Lens.Lens' SolutionVersion (Prelude.Maybe Prelude.Text)
+solutionVersion_recipeArn = Lens.lens (\SolutionVersion' {recipeArn} -> recipeArn) (\s@SolutionVersion' {} a -> s {recipeArn = a} :: SolutionVersion)
+
+-- | The ARN of the solution.
+solutionVersion_solutionArn :: Lens.Lens' SolutionVersion (Prelude.Maybe Prelude.Text)
+solutionVersion_solutionArn = Lens.lens (\SolutionVersion' {solutionArn} -> solutionArn) (\s@SolutionVersion' {} a -> s {solutionArn = a} :: SolutionVersion)
+
+-- | Describes the configuration properties for the solution.
+solutionVersion_solutionConfig :: Lens.Lens' SolutionVersion (Prelude.Maybe SolutionConfig)
+solutionVersion_solutionConfig = Lens.lens (\SolutionVersion' {solutionConfig} -> solutionConfig) (\s@SolutionVersion' {} a -> s {solutionConfig = a} :: SolutionVersion)
+
+-- | The ARN of the solution version.
+solutionVersion_solutionVersionArn :: Lens.Lens' SolutionVersion (Prelude.Maybe Prelude.Text)
+solutionVersion_solutionVersionArn = Lens.lens (\SolutionVersion' {solutionVersionArn} -> solutionVersionArn) (\s@SolutionVersion' {} a -> s {solutionVersionArn = a} :: SolutionVersion)
+
+-- | The status of the solution version.
+--
+-- A solution version can be in one of the following states:
+--
+-- -   CREATE PENDING
+--
+-- -   CREATE IN_PROGRESS
+--
+-- -   ACTIVE
+--
+-- -   CREATE FAILED
+--
+-- -   CREATE STOPPING
+--
+-- -   CREATE STOPPED
+solutionVersion_status :: Lens.Lens' SolutionVersion (Prelude.Maybe Prelude.Text)
+solutionVersion_status = Lens.lens (\SolutionVersion' {status} -> status) (\s@SolutionVersion' {} a -> s {status = a} :: SolutionVersion)
+
+-- | The time used to train the model. You are billed for the time it takes
+-- to train a model. This field is visible only after Amazon Personalize
+-- successfully trains a model.
+solutionVersion_trainingHours :: Lens.Lens' SolutionVersion (Prelude.Maybe Prelude.Double)
+solutionVersion_trainingHours = Lens.lens (\SolutionVersion' {trainingHours} -> trainingHours) (\s@SolutionVersion' {} a -> s {trainingHours = a} :: SolutionVersion)
+
+-- | The scope of training to be performed when creating the solution
+-- version. The @FULL@ option trains the solution version based on the
+-- entirety of the input solution\'s training data, while the @UPDATE@
+-- option processes only the data that has changed in comparison to the
+-- input solution. Choose @UPDATE@ when you want to incrementally update
+-- your solution version instead of creating an entirely new one.
+--
+-- The @UPDATE@ option can only be used when you already have an active
+-- solution version created from the input solution using the @FULL@ option
+-- and the input solution was trained with the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-new-item-USER_PERSONALIZATION.html User-Personalization>
+-- recipe or the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/native-recipe-hrnn-coldstart.html HRNN-Coldstart>
+-- recipe.
+solutionVersion_trainingMode :: Lens.Lens' SolutionVersion (Prelude.Maybe TrainingMode)
+solutionVersion_trainingMode = Lens.lens (\SolutionVersion' {trainingMode} -> trainingMode) (\s@SolutionVersion' {} a -> s {trainingMode = a} :: SolutionVersion)
+
+-- | If hyperparameter optimization was performed, contains the
+-- hyperparameter values of the best performing model.
+solutionVersion_tunedHPOParams :: Lens.Lens' SolutionVersion (Prelude.Maybe TunedHPOParams)
+solutionVersion_tunedHPOParams = Lens.lens (\SolutionVersion' {tunedHPOParams} -> tunedHPOParams) (\s@SolutionVersion' {} a -> s {tunedHPOParams = a} :: SolutionVersion)
+
+instance Data.FromJSON SolutionVersion where
+  parseJSON =
+    Data.withObject
+      "SolutionVersion"
+      ( \x ->
+          SolutionVersion'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "datasetGroupArn")
+            Prelude.<*> (x Data..:? "eventType")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "name")
+            Prelude.<*> (x Data..:? "performAutoML")
+            Prelude.<*> (x Data..:? "performHPO")
+            Prelude.<*> (x Data..:? "recipeArn")
+            Prelude.<*> (x Data..:? "solutionArn")
+            Prelude.<*> (x Data..:? "solutionConfig")
+            Prelude.<*> (x Data..:? "solutionVersionArn")
+            Prelude.<*> (x Data..:? "status")
+            Prelude.<*> (x Data..:? "trainingHours")
+            Prelude.<*> (x Data..:? "trainingMode")
+            Prelude.<*> (x Data..:? "tunedHPOParams")
+      )
+
+instance Prelude.Hashable SolutionVersion where
+  hashWithSalt _salt SolutionVersion' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` datasetGroupArn
+      `Prelude.hashWithSalt` eventType
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` performAutoML
+      `Prelude.hashWithSalt` performHPO
+      `Prelude.hashWithSalt` recipeArn
+      `Prelude.hashWithSalt` solutionArn
+      `Prelude.hashWithSalt` solutionConfig
+      `Prelude.hashWithSalt` solutionVersionArn
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` trainingHours
+      `Prelude.hashWithSalt` trainingMode
+      `Prelude.hashWithSalt` tunedHPOParams
+
+instance Prelude.NFData SolutionVersion where
+  rnf SolutionVersion' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf datasetGroupArn
+      `Prelude.seq` Prelude.rnf eventType
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf name
+      `Prelude.seq` Prelude.rnf performAutoML
+      `Prelude.seq` Prelude.rnf performHPO
+      `Prelude.seq` Prelude.rnf recipeArn
+      `Prelude.seq` Prelude.rnf solutionArn
+      `Prelude.seq` Prelude.rnf solutionConfig
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf trainingHours
+      `Prelude.seq` Prelude.rnf trainingMode
+      `Prelude.seq` Prelude.rnf tunedHPOParams
diff --git a/gen/Amazonka/Personalize/Types/SolutionVersionSummary.hs b/gen/Amazonka/Personalize/Types/SolutionVersionSummary.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/SolutionVersionSummary.hs
@@ -0,0 +1,142 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.SolutionVersionSummary
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.SolutionVersionSummary where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | Provides a summary of the properties of a solution version. For a
+-- complete listing, call the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeSolutionVersion.html DescribeSolutionVersion>
+-- API.
+--
+-- /See:/ 'newSolutionVersionSummary' smart constructor.
+data SolutionVersionSummary = SolutionVersionSummary'
+  { -- | The date and time (in Unix time) that this version of a solution was
+    -- created.
+    creationDateTime :: Prelude.Maybe Data.POSIX,
+    -- | If a solution version fails, the reason behind the failure.
+    failureReason :: Prelude.Maybe Prelude.Text,
+    -- | The date and time (in Unix time) that the solution version was last
+    -- updated.
+    lastUpdatedDateTime :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the solution version.
+    solutionVersionArn :: Prelude.Maybe Prelude.Text,
+    -- | The status of the solution version.
+    --
+    -- A solution version can be in one of the following states:
+    --
+    -- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+    status :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'SolutionVersionSummary' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'creationDateTime', 'solutionVersionSummary_creationDateTime' - The date and time (in Unix time) that this version of a solution was
+-- created.
+--
+-- 'failureReason', 'solutionVersionSummary_failureReason' - If a solution version fails, the reason behind the failure.
+--
+-- 'lastUpdatedDateTime', 'solutionVersionSummary_lastUpdatedDateTime' - The date and time (in Unix time) that the solution version was last
+-- updated.
+--
+-- 'solutionVersionArn', 'solutionVersionSummary_solutionVersionArn' - The Amazon Resource Name (ARN) of the solution version.
+--
+-- 'status', 'solutionVersionSummary_status' - The status of the solution version.
+--
+-- A solution version can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+newSolutionVersionSummary ::
+  SolutionVersionSummary
+newSolutionVersionSummary =
+  SolutionVersionSummary'
+    { creationDateTime =
+        Prelude.Nothing,
+      failureReason = Prelude.Nothing,
+      lastUpdatedDateTime = Prelude.Nothing,
+      solutionVersionArn = Prelude.Nothing,
+      status = Prelude.Nothing
+    }
+
+-- | The date and time (in Unix time) that this version of a solution was
+-- created.
+solutionVersionSummary_creationDateTime :: Lens.Lens' SolutionVersionSummary (Prelude.Maybe Prelude.UTCTime)
+solutionVersionSummary_creationDateTime = Lens.lens (\SolutionVersionSummary' {creationDateTime} -> creationDateTime) (\s@SolutionVersionSummary' {} a -> s {creationDateTime = a} :: SolutionVersionSummary) Prelude.. Lens.mapping Data._Time
+
+-- | If a solution version fails, the reason behind the failure.
+solutionVersionSummary_failureReason :: Lens.Lens' SolutionVersionSummary (Prelude.Maybe Prelude.Text)
+solutionVersionSummary_failureReason = Lens.lens (\SolutionVersionSummary' {failureReason} -> failureReason) (\s@SolutionVersionSummary' {} a -> s {failureReason = a} :: SolutionVersionSummary)
+
+-- | The date and time (in Unix time) that the solution version was last
+-- updated.
+solutionVersionSummary_lastUpdatedDateTime :: Lens.Lens' SolutionVersionSummary (Prelude.Maybe Prelude.UTCTime)
+solutionVersionSummary_lastUpdatedDateTime = Lens.lens (\SolutionVersionSummary' {lastUpdatedDateTime} -> lastUpdatedDateTime) (\s@SolutionVersionSummary' {} a -> s {lastUpdatedDateTime = a} :: SolutionVersionSummary) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the solution version.
+solutionVersionSummary_solutionVersionArn :: Lens.Lens' SolutionVersionSummary (Prelude.Maybe Prelude.Text)
+solutionVersionSummary_solutionVersionArn = Lens.lens (\SolutionVersionSummary' {solutionVersionArn} -> solutionVersionArn) (\s@SolutionVersionSummary' {} a -> s {solutionVersionArn = a} :: SolutionVersionSummary)
+
+-- | The status of the solution version.
+--
+-- A solution version can be in one of the following states:
+--
+-- -   CREATE PENDING > CREATE IN_PROGRESS > ACTIVE -or- CREATE FAILED
+solutionVersionSummary_status :: Lens.Lens' SolutionVersionSummary (Prelude.Maybe Prelude.Text)
+solutionVersionSummary_status = Lens.lens (\SolutionVersionSummary' {status} -> status) (\s@SolutionVersionSummary' {} a -> s {status = a} :: SolutionVersionSummary)
+
+instance Data.FromJSON SolutionVersionSummary where
+  parseJSON =
+    Data.withObject
+      "SolutionVersionSummary"
+      ( \x ->
+          SolutionVersionSummary'
+            Prelude.<$> (x Data..:? "creationDateTime")
+            Prelude.<*> (x Data..:? "failureReason")
+            Prelude.<*> (x Data..:? "lastUpdatedDateTime")
+            Prelude.<*> (x Data..:? "solutionVersionArn")
+            Prelude.<*> (x Data..:? "status")
+      )
+
+instance Prelude.Hashable SolutionVersionSummary where
+  hashWithSalt _salt SolutionVersionSummary' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationDateTime
+      `Prelude.hashWithSalt` failureReason
+      `Prelude.hashWithSalt` lastUpdatedDateTime
+      `Prelude.hashWithSalt` solutionVersionArn
+      `Prelude.hashWithSalt` status
+
+instance Prelude.NFData SolutionVersionSummary where
+  rnf SolutionVersionSummary' {..} =
+    Prelude.rnf creationDateTime
+      `Prelude.seq` Prelude.rnf failureReason
+      `Prelude.seq` Prelude.rnf lastUpdatedDateTime
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+      `Prelude.seq` Prelude.rnf status
diff --git a/gen/Amazonka/Personalize/Types/Tag.hs b/gen/Amazonka/Personalize/Types/Tag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/Tag.hs
@@ -0,0 +1,103 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.Tag
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.Tag where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | The optional metadata that you apply to resources to help you categorize
+-- and organize them. Each tag consists of a key and an optional value,
+-- both of which you define. For more information see
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html Tagging Personalize resources>.
+--
+-- /See:/ 'newTag' smart constructor.
+data Tag = Tag'
+  { -- | One part of a key-value pair that makes up a tag. A key is a general
+    -- label that acts like a category for more specific tag values.
+    tagKey :: Prelude.Text,
+    -- | The optional part of a key-value pair that makes up a tag. A value acts
+    -- as a descriptor within a tag category (key).
+    tagValue :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Tag' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'tagKey', 'tag_tagKey' - One part of a key-value pair that makes up a tag. A key is a general
+-- label that acts like a category for more specific tag values.
+--
+-- 'tagValue', 'tag_tagValue' - The optional part of a key-value pair that makes up a tag. A value acts
+-- as a descriptor within a tag category (key).
+newTag ::
+  -- | 'tagKey'
+  Prelude.Text ->
+  -- | 'tagValue'
+  Prelude.Text ->
+  Tag
+newTag pTagKey_ pTagValue_ =
+  Tag' {tagKey = pTagKey_, tagValue = pTagValue_}
+
+-- | One part of a key-value pair that makes up a tag. A key is a general
+-- label that acts like a category for more specific tag values.
+tag_tagKey :: Lens.Lens' Tag Prelude.Text
+tag_tagKey = Lens.lens (\Tag' {tagKey} -> tagKey) (\s@Tag' {} a -> s {tagKey = a} :: Tag)
+
+-- | The optional part of a key-value pair that makes up a tag. A value acts
+-- as a descriptor within a tag category (key).
+tag_tagValue :: Lens.Lens' Tag Prelude.Text
+tag_tagValue = Lens.lens (\Tag' {tagValue} -> tagValue) (\s@Tag' {} a -> s {tagValue = a} :: Tag)
+
+instance Data.FromJSON Tag where
+  parseJSON =
+    Data.withObject
+      "Tag"
+      ( \x ->
+          Tag'
+            Prelude.<$> (x Data..: "tagKey")
+            Prelude.<*> (x Data..: "tagValue")
+      )
+
+instance Prelude.Hashable Tag where
+  hashWithSalt _salt Tag' {..} =
+    _salt
+      `Prelude.hashWithSalt` tagKey
+      `Prelude.hashWithSalt` tagValue
+
+instance Prelude.NFData Tag where
+  rnf Tag' {..} =
+    Prelude.rnf tagKey
+      `Prelude.seq` Prelude.rnf tagValue
+
+instance Data.ToJSON Tag where
+  toJSON Tag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("tagKey" Data..= tagKey),
+            Prelude.Just ("tagValue" Data..= tagValue)
+          ]
+      )
diff --git a/gen/Amazonka/Personalize/Types/TrainingMode.hs b/gen/Amazonka/Personalize/Types/TrainingMode.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/TrainingMode.hs
@@ -0,0 +1,71 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.TrainingMode
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.TrainingMode
+  ( TrainingMode
+      ( ..,
+        TrainingMode_FULL,
+        TrainingMode_UPDATE
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TrainingMode = TrainingMode'
+  { fromTrainingMode ::
+      Data.Text
+  }
+  deriving stock
+    ( Prelude.Show,
+      Prelude.Read,
+      Prelude.Eq,
+      Prelude.Ord,
+      Prelude.Generic
+    )
+  deriving newtype
+    ( Prelude.Hashable,
+      Prelude.NFData,
+      Data.FromText,
+      Data.ToText,
+      Data.ToByteString,
+      Data.ToLog,
+      Data.ToHeader,
+      Data.ToQuery,
+      Data.FromJSON,
+      Data.FromJSONKey,
+      Data.ToJSON,
+      Data.ToJSONKey,
+      Data.FromXML,
+      Data.ToXML
+    )
+
+pattern TrainingMode_FULL :: TrainingMode
+pattern TrainingMode_FULL = TrainingMode' "FULL"
+
+pattern TrainingMode_UPDATE :: TrainingMode
+pattern TrainingMode_UPDATE = TrainingMode' "UPDATE"
+
+{-# COMPLETE
+  TrainingMode_FULL,
+  TrainingMode_UPDATE,
+  TrainingMode'
+  #-}
diff --git a/gen/Amazonka/Personalize/Types/TunedHPOParams.hs b/gen/Amazonka/Personalize/Types/TunedHPOParams.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Types/TunedHPOParams.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Types.TunedHPOParams
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Types.TunedHPOParams where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+-- | If hyperparameter optimization (HPO) was performed, contains the
+-- hyperparameter values of the best performing model.
+--
+-- /See:/ 'newTunedHPOParams' smart constructor.
+data TunedHPOParams = TunedHPOParams'
+  { -- | A list of the hyperparameter values of the best performing model.
+    algorithmHyperParameters :: Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text)
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TunedHPOParams' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'algorithmHyperParameters', 'tunedHPOParams_algorithmHyperParameters' - A list of the hyperparameter values of the best performing model.
+newTunedHPOParams ::
+  TunedHPOParams
+newTunedHPOParams =
+  TunedHPOParams'
+    { algorithmHyperParameters =
+        Prelude.Nothing
+    }
+
+-- | A list of the hyperparameter values of the best performing model.
+tunedHPOParams_algorithmHyperParameters :: Lens.Lens' TunedHPOParams (Prelude.Maybe (Prelude.HashMap Prelude.Text Prelude.Text))
+tunedHPOParams_algorithmHyperParameters = Lens.lens (\TunedHPOParams' {algorithmHyperParameters} -> algorithmHyperParameters) (\s@TunedHPOParams' {} a -> s {algorithmHyperParameters = a} :: TunedHPOParams) Prelude.. Lens.mapping Lens.coerced
+
+instance Data.FromJSON TunedHPOParams where
+  parseJSON =
+    Data.withObject
+      "TunedHPOParams"
+      ( \x ->
+          TunedHPOParams'
+            Prelude.<$> ( x
+                            Data..:? "algorithmHyperParameters"
+                            Data..!= Prelude.mempty
+                        )
+      )
+
+instance Prelude.Hashable TunedHPOParams where
+  hashWithSalt _salt TunedHPOParams' {..} =
+    _salt
+      `Prelude.hashWithSalt` algorithmHyperParameters
+
+instance Prelude.NFData TunedHPOParams where
+  rnf TunedHPOParams' {..} =
+    Prelude.rnf algorithmHyperParameters
diff --git a/gen/Amazonka/Personalize/UntagResource.hs b/gen/Amazonka/Personalize/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/UntagResource.hs
@@ -0,0 +1,173 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.UntagResource
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Remove
+-- <https://docs.aws.amazon.com/personalize/latest/dev/tagging-resources.html tags>
+-- that are attached to a resource.
+module Amazonka.Personalize.UntagResource
+  ( -- * Creating a Request
+    UntagResource (..),
+    newUntagResource,
+
+    -- * Request Lenses
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+
+    -- * Destructuring the Response
+    UntagResourceResponse (..),
+    newUntagResourceResponse,
+
+    -- * Response Lenses
+    untagResourceResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUntagResource' smart constructor.
+data UntagResource = UntagResource'
+  { -- | The resource\'s Amazon Resource Name (ARN).
+    resourceArn :: Prelude.Text,
+    -- | Keys to remove from the resource\'s tags.
+    tagKeys :: [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResource' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'resourceArn', 'untagResource_resourceArn' - The resource\'s Amazon Resource Name (ARN).
+--
+-- 'tagKeys', 'untagResource_tagKeys' - Keys to remove from the resource\'s tags.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The resource\'s Amazon Resource Name (ARN).
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | Keys to remove from the resource\'s tags.
+untagResource_tagKeys :: Lens.Lens' UntagResource [Prelude.Text]
+untagResource_tagKeys = Lens.lens (\UntagResource' {tagKeys} -> tagKeys) (\s@UntagResource' {} a -> s {tagKeys = a} :: UntagResource) Prelude.. Lens.coerced
+
+instance Core.AWSRequest UntagResource where
+  type
+    AWSResponse UntagResource =
+      UntagResourceResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          UntagResourceResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UntagResource where
+  hashWithSalt _salt UntagResource' {..} =
+    _salt
+      `Prelude.hashWithSalt` resourceArn
+      `Prelude.hashWithSalt` tagKeys
+
+instance Prelude.NFData UntagResource where
+  rnf UntagResource' {..} =
+    Prelude.rnf resourceArn
+      `Prelude.seq` Prelude.rnf tagKeys
+
+instance Data.ToHeaders UntagResource where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.UntagResource" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UntagResource where
+  toJSON UntagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("resourceArn" Data..= resourceArn),
+            Prelude.Just ("tagKeys" Data..= tagKeys)
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UntagResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUntagResourceResponse' smart constructor.
+data UntagResourceResponse = UntagResourceResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UntagResourceResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'untagResourceResponse_httpStatus' - The response's http status code.
+newUntagResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UntagResourceResponse
+newUntagResourceResponse pHttpStatus_ =
+  UntagResourceResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+untagResourceResponse_httpStatus :: Lens.Lens' UntagResourceResponse Prelude.Int
+untagResourceResponse_httpStatus = Lens.lens (\UntagResourceResponse' {httpStatus} -> httpStatus) (\s@UntagResourceResponse' {} a -> s {httpStatus = a} :: UntagResourceResponse)
+
+instance Prelude.NFData UntagResourceResponse where
+  rnf UntagResourceResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/UpdateCampaign.hs b/gen/Amazonka/Personalize/UpdateCampaign.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/UpdateCampaign.hs
@@ -0,0 +1,232 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.UpdateCampaign
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates a campaign by either deploying a new solution or changing the
+-- value of the campaign\'s @minProvisionedTPS@ parameter.
+--
+-- To update a campaign, the campaign status must be ACTIVE or CREATE
+-- FAILED. Check the campaign status using the
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_DescribeCampaign.html DescribeCampaign>
+-- operation.
+--
+-- You can still get recommendations from a campaign while an update is in
+-- progress. The campaign will use the previous solution version and
+-- campaign configuration to generate recommendations until the latest
+-- campaign update status is @Active@.
+--
+-- For more information on campaigns, see
+-- <https://docs.aws.amazon.com/personalize/latest/dg/API_CreateCampaign.html CreateCampaign>.
+module Amazonka.Personalize.UpdateCampaign
+  ( -- * Creating a Request
+    UpdateCampaign (..),
+    newUpdateCampaign,
+
+    -- * Request Lenses
+    updateCampaign_campaignConfig,
+    updateCampaign_minProvisionedTPS,
+    updateCampaign_solutionVersionArn,
+    updateCampaign_campaignArn,
+
+    -- * Destructuring the Response
+    UpdateCampaignResponse (..),
+    newUpdateCampaignResponse,
+
+    -- * Response Lenses
+    updateCampaignResponse_campaignArn,
+    updateCampaignResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateCampaign' smart constructor.
+data UpdateCampaign = UpdateCampaign'
+  { -- | The configuration details of a campaign.
+    campaignConfig :: Prelude.Maybe CampaignConfig,
+    -- | Specifies the requested minimum provisioned transactions
+    -- (recommendations) per second that Amazon Personalize will support.
+    minProvisionedTPS :: Prelude.Maybe Prelude.Natural,
+    -- | The ARN of a new solution version to deploy.
+    solutionVersionArn :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the campaign.
+    campaignArn :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateCampaign' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'campaignConfig', 'updateCampaign_campaignConfig' - The configuration details of a campaign.
+--
+-- 'minProvisionedTPS', 'updateCampaign_minProvisionedTPS' - Specifies the requested minimum provisioned transactions
+-- (recommendations) per second that Amazon Personalize will support.
+--
+-- 'solutionVersionArn', 'updateCampaign_solutionVersionArn' - The ARN of a new solution version to deploy.
+--
+-- 'campaignArn', 'updateCampaign_campaignArn' - The Amazon Resource Name (ARN) of the campaign.
+newUpdateCampaign ::
+  -- | 'campaignArn'
+  Prelude.Text ->
+  UpdateCampaign
+newUpdateCampaign pCampaignArn_ =
+  UpdateCampaign'
+    { campaignConfig = Prelude.Nothing,
+      minProvisionedTPS = Prelude.Nothing,
+      solutionVersionArn = Prelude.Nothing,
+      campaignArn = pCampaignArn_
+    }
+
+-- | The configuration details of a campaign.
+updateCampaign_campaignConfig :: Lens.Lens' UpdateCampaign (Prelude.Maybe CampaignConfig)
+updateCampaign_campaignConfig = Lens.lens (\UpdateCampaign' {campaignConfig} -> campaignConfig) (\s@UpdateCampaign' {} a -> s {campaignConfig = a} :: UpdateCampaign)
+
+-- | Specifies the requested minimum provisioned transactions
+-- (recommendations) per second that Amazon Personalize will support.
+updateCampaign_minProvisionedTPS :: Lens.Lens' UpdateCampaign (Prelude.Maybe Prelude.Natural)
+updateCampaign_minProvisionedTPS = Lens.lens (\UpdateCampaign' {minProvisionedTPS} -> minProvisionedTPS) (\s@UpdateCampaign' {} a -> s {minProvisionedTPS = a} :: UpdateCampaign)
+
+-- | The ARN of a new solution version to deploy.
+updateCampaign_solutionVersionArn :: Lens.Lens' UpdateCampaign (Prelude.Maybe Prelude.Text)
+updateCampaign_solutionVersionArn = Lens.lens (\UpdateCampaign' {solutionVersionArn} -> solutionVersionArn) (\s@UpdateCampaign' {} a -> s {solutionVersionArn = a} :: UpdateCampaign)
+
+-- | The Amazon Resource Name (ARN) of the campaign.
+updateCampaign_campaignArn :: Lens.Lens' UpdateCampaign Prelude.Text
+updateCampaign_campaignArn = Lens.lens (\UpdateCampaign' {campaignArn} -> campaignArn) (\s@UpdateCampaign' {} a -> s {campaignArn = a} :: UpdateCampaign)
+
+instance Core.AWSRequest UpdateCampaign where
+  type
+    AWSResponse UpdateCampaign =
+      UpdateCampaignResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateCampaignResponse'
+            Prelude.<$> (x Data..?> "campaignArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateCampaign where
+  hashWithSalt _salt UpdateCampaign' {..} =
+    _salt
+      `Prelude.hashWithSalt` campaignConfig
+      `Prelude.hashWithSalt` minProvisionedTPS
+      `Prelude.hashWithSalt` solutionVersionArn
+      `Prelude.hashWithSalt` campaignArn
+
+instance Prelude.NFData UpdateCampaign where
+  rnf UpdateCampaign' {..} =
+    Prelude.rnf campaignConfig
+      `Prelude.seq` Prelude.rnf minProvisionedTPS
+      `Prelude.seq` Prelude.rnf solutionVersionArn
+      `Prelude.seq` Prelude.rnf campaignArn
+
+instance Data.ToHeaders UpdateCampaign where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.UpdateCampaign" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateCampaign where
+  toJSON UpdateCampaign' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("campaignConfig" Data..=)
+              Prelude.<$> campaignConfig,
+            ("minProvisionedTPS" Data..=)
+              Prelude.<$> minProvisionedTPS,
+            ("solutionVersionArn" Data..=)
+              Prelude.<$> solutionVersionArn,
+            Prelude.Just ("campaignArn" Data..= campaignArn)
+          ]
+      )
+
+instance Data.ToPath UpdateCampaign where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateCampaign where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateCampaignResponse' smart constructor.
+data UpdateCampaignResponse = UpdateCampaignResponse'
+  { -- | The same campaign ARN as given in the request.
+    campaignArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateCampaignResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'campaignArn', 'updateCampaignResponse_campaignArn' - The same campaign ARN as given in the request.
+--
+-- 'httpStatus', 'updateCampaignResponse_httpStatus' - The response's http status code.
+newUpdateCampaignResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateCampaignResponse
+newUpdateCampaignResponse pHttpStatus_ =
+  UpdateCampaignResponse'
+    { campaignArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The same campaign ARN as given in the request.
+updateCampaignResponse_campaignArn :: Lens.Lens' UpdateCampaignResponse (Prelude.Maybe Prelude.Text)
+updateCampaignResponse_campaignArn = Lens.lens (\UpdateCampaignResponse' {campaignArn} -> campaignArn) (\s@UpdateCampaignResponse' {} a -> s {campaignArn = a} :: UpdateCampaignResponse)
+
+-- | The response's http status code.
+updateCampaignResponse_httpStatus :: Lens.Lens' UpdateCampaignResponse Prelude.Int
+updateCampaignResponse_httpStatus = Lens.lens (\UpdateCampaignResponse' {httpStatus} -> httpStatus) (\s@UpdateCampaignResponse' {} a -> s {httpStatus = a} :: UpdateCampaignResponse)
+
+instance Prelude.NFData UpdateCampaignResponse where
+  rnf UpdateCampaignResponse' {..} =
+    Prelude.rnf campaignArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/UpdateMetricAttribution.hs b/gen/Amazonka/Personalize/UpdateMetricAttribution.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/UpdateMetricAttribution.hs
@@ -0,0 +1,219 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.UpdateMetricAttribution
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates a metric attribution.
+module Amazonka.Personalize.UpdateMetricAttribution
+  ( -- * Creating a Request
+    UpdateMetricAttribution (..),
+    newUpdateMetricAttribution,
+
+    -- * Request Lenses
+    updateMetricAttribution_addMetrics,
+    updateMetricAttribution_metricAttributionArn,
+    updateMetricAttribution_metricsOutputConfig,
+    updateMetricAttribution_removeMetrics,
+
+    -- * Destructuring the Response
+    UpdateMetricAttributionResponse (..),
+    newUpdateMetricAttributionResponse,
+
+    -- * Response Lenses
+    updateMetricAttributionResponse_metricAttributionArn,
+    updateMetricAttributionResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateMetricAttribution' smart constructor.
+data UpdateMetricAttribution = UpdateMetricAttribution'
+  { -- | Add new metric attributes to the metric attribution.
+    addMetrics :: Prelude.Maybe [MetricAttribute],
+    -- | The Amazon Resource Name (ARN) for the metric attribution to update.
+    metricAttributionArn :: Prelude.Maybe Prelude.Text,
+    -- | An output config for the metric attribution.
+    metricsOutputConfig :: Prelude.Maybe MetricAttributionOutput,
+    -- | Remove metric attributes from the metric attribution.
+    removeMetrics :: Prelude.Maybe [Prelude.Text]
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateMetricAttribution' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'addMetrics', 'updateMetricAttribution_addMetrics' - Add new metric attributes to the metric attribution.
+--
+-- 'metricAttributionArn', 'updateMetricAttribution_metricAttributionArn' - The Amazon Resource Name (ARN) for the metric attribution to update.
+--
+-- 'metricsOutputConfig', 'updateMetricAttribution_metricsOutputConfig' - An output config for the metric attribution.
+--
+-- 'removeMetrics', 'updateMetricAttribution_removeMetrics' - Remove metric attributes from the metric attribution.
+newUpdateMetricAttribution ::
+  UpdateMetricAttribution
+newUpdateMetricAttribution =
+  UpdateMetricAttribution'
+    { addMetrics =
+        Prelude.Nothing,
+      metricAttributionArn = Prelude.Nothing,
+      metricsOutputConfig = Prelude.Nothing,
+      removeMetrics = Prelude.Nothing
+    }
+
+-- | Add new metric attributes to the metric attribution.
+updateMetricAttribution_addMetrics :: Lens.Lens' UpdateMetricAttribution (Prelude.Maybe [MetricAttribute])
+updateMetricAttribution_addMetrics = Lens.lens (\UpdateMetricAttribution' {addMetrics} -> addMetrics) (\s@UpdateMetricAttribution' {} a -> s {addMetrics = a} :: UpdateMetricAttribution) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Name (ARN) for the metric attribution to update.
+updateMetricAttribution_metricAttributionArn :: Lens.Lens' UpdateMetricAttribution (Prelude.Maybe Prelude.Text)
+updateMetricAttribution_metricAttributionArn = Lens.lens (\UpdateMetricAttribution' {metricAttributionArn} -> metricAttributionArn) (\s@UpdateMetricAttribution' {} a -> s {metricAttributionArn = a} :: UpdateMetricAttribution)
+
+-- | An output config for the metric attribution.
+updateMetricAttribution_metricsOutputConfig :: Lens.Lens' UpdateMetricAttribution (Prelude.Maybe MetricAttributionOutput)
+updateMetricAttribution_metricsOutputConfig = Lens.lens (\UpdateMetricAttribution' {metricsOutputConfig} -> metricsOutputConfig) (\s@UpdateMetricAttribution' {} a -> s {metricsOutputConfig = a} :: UpdateMetricAttribution)
+
+-- | Remove metric attributes from the metric attribution.
+updateMetricAttribution_removeMetrics :: Lens.Lens' UpdateMetricAttribution (Prelude.Maybe [Prelude.Text])
+updateMetricAttribution_removeMetrics = Lens.lens (\UpdateMetricAttribution' {removeMetrics} -> removeMetrics) (\s@UpdateMetricAttribution' {} a -> s {removeMetrics = a} :: UpdateMetricAttribution) Prelude.. Lens.mapping Lens.coerced
+
+instance Core.AWSRequest UpdateMetricAttribution where
+  type
+    AWSResponse UpdateMetricAttribution =
+      UpdateMetricAttributionResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateMetricAttributionResponse'
+            Prelude.<$> (x Data..?> "metricAttributionArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateMetricAttribution where
+  hashWithSalt _salt UpdateMetricAttribution' {..} =
+    _salt
+      `Prelude.hashWithSalt` addMetrics
+      `Prelude.hashWithSalt` metricAttributionArn
+      `Prelude.hashWithSalt` metricsOutputConfig
+      `Prelude.hashWithSalt` removeMetrics
+
+instance Prelude.NFData UpdateMetricAttribution where
+  rnf UpdateMetricAttribution' {..} =
+    Prelude.rnf addMetrics
+      `Prelude.seq` Prelude.rnf metricAttributionArn
+      `Prelude.seq` Prelude.rnf metricsOutputConfig
+      `Prelude.seq` Prelude.rnf removeMetrics
+
+instance Data.ToHeaders UpdateMetricAttribution where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.UpdateMetricAttribution" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateMetricAttribution where
+  toJSON UpdateMetricAttribution' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("addMetrics" Data..=) Prelude.<$> addMetrics,
+            ("metricAttributionArn" Data..=)
+              Prelude.<$> metricAttributionArn,
+            ("metricsOutputConfig" Data..=)
+              Prelude.<$> metricsOutputConfig,
+            ("removeMetrics" Data..=) Prelude.<$> removeMetrics
+          ]
+      )
+
+instance Data.ToPath UpdateMetricAttribution where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateMetricAttribution where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateMetricAttributionResponse' smart constructor.
+data UpdateMetricAttributionResponse = UpdateMetricAttributionResponse'
+  { -- | The Amazon Resource Name (ARN) for the metric attribution that you
+    -- updated.
+    metricAttributionArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateMetricAttributionResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'metricAttributionArn', 'updateMetricAttributionResponse_metricAttributionArn' - The Amazon Resource Name (ARN) for the metric attribution that you
+-- updated.
+--
+-- 'httpStatus', 'updateMetricAttributionResponse_httpStatus' - The response's http status code.
+newUpdateMetricAttributionResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateMetricAttributionResponse
+newUpdateMetricAttributionResponse pHttpStatus_ =
+  UpdateMetricAttributionResponse'
+    { metricAttributionArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) for the metric attribution that you
+-- updated.
+updateMetricAttributionResponse_metricAttributionArn :: Lens.Lens' UpdateMetricAttributionResponse (Prelude.Maybe Prelude.Text)
+updateMetricAttributionResponse_metricAttributionArn = Lens.lens (\UpdateMetricAttributionResponse' {metricAttributionArn} -> metricAttributionArn) (\s@UpdateMetricAttributionResponse' {} a -> s {metricAttributionArn = a} :: UpdateMetricAttributionResponse)
+
+-- | The response's http status code.
+updateMetricAttributionResponse_httpStatus :: Lens.Lens' UpdateMetricAttributionResponse Prelude.Int
+updateMetricAttributionResponse_httpStatus = Lens.lens (\UpdateMetricAttributionResponse' {httpStatus} -> httpStatus) (\s@UpdateMetricAttributionResponse' {} a -> s {httpStatus = a} :: UpdateMetricAttributionResponse)
+
+instance
+  Prelude.NFData
+    UpdateMetricAttributionResponse
+  where
+  rnf UpdateMetricAttributionResponse' {..} =
+    Prelude.rnf metricAttributionArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/UpdateRecommender.hs b/gen/Amazonka/Personalize/UpdateRecommender.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/UpdateRecommender.hs
@@ -0,0 +1,193 @@
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE RecordWildCards #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-binds #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+{-# OPTIONS_GHC -fno-warn-unused-matches #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.UpdateRecommender
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Updates the recommender to modify the recommender configuration.
+module Amazonka.Personalize.UpdateRecommender
+  ( -- * Creating a Request
+    UpdateRecommender (..),
+    newUpdateRecommender,
+
+    -- * Request Lenses
+    updateRecommender_recommenderArn,
+    updateRecommender_recommenderConfig,
+
+    -- * Destructuring the Response
+    UpdateRecommenderResponse (..),
+    newUpdateRecommenderResponse,
+
+    -- * Response Lenses
+    updateRecommenderResponse_recommenderArn,
+    updateRecommenderResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateRecommender' smart constructor.
+data UpdateRecommender = UpdateRecommender'
+  { -- | The Amazon Resource Name (ARN) of the recommender to modify.
+    recommenderArn :: Prelude.Text,
+    -- | The configuration details of the recommender.
+    recommenderConfig :: RecommenderConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateRecommender' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recommenderArn', 'updateRecommender_recommenderArn' - The Amazon Resource Name (ARN) of the recommender to modify.
+--
+-- 'recommenderConfig', 'updateRecommender_recommenderConfig' - The configuration details of the recommender.
+newUpdateRecommender ::
+  -- | 'recommenderArn'
+  Prelude.Text ->
+  -- | 'recommenderConfig'
+  RecommenderConfig ->
+  UpdateRecommender
+newUpdateRecommender
+  pRecommenderArn_
+  pRecommenderConfig_ =
+    UpdateRecommender'
+      { recommenderArn =
+          pRecommenderArn_,
+        recommenderConfig = pRecommenderConfig_
+      }
+
+-- | The Amazon Resource Name (ARN) of the recommender to modify.
+updateRecommender_recommenderArn :: Lens.Lens' UpdateRecommender Prelude.Text
+updateRecommender_recommenderArn = Lens.lens (\UpdateRecommender' {recommenderArn} -> recommenderArn) (\s@UpdateRecommender' {} a -> s {recommenderArn = a} :: UpdateRecommender)
+
+-- | The configuration details of the recommender.
+updateRecommender_recommenderConfig :: Lens.Lens' UpdateRecommender RecommenderConfig
+updateRecommender_recommenderConfig = Lens.lens (\UpdateRecommender' {recommenderConfig} -> recommenderConfig) (\s@UpdateRecommender' {} a -> s {recommenderConfig = a} :: UpdateRecommender)
+
+instance Core.AWSRequest UpdateRecommender where
+  type
+    AWSResponse UpdateRecommender =
+      UpdateRecommenderResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateRecommenderResponse'
+            Prelude.<$> (x Data..?> "recommenderArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateRecommender where
+  hashWithSalt _salt UpdateRecommender' {..} =
+    _salt
+      `Prelude.hashWithSalt` recommenderArn
+      `Prelude.hashWithSalt` recommenderConfig
+
+instance Prelude.NFData UpdateRecommender where
+  rnf UpdateRecommender' {..} =
+    Prelude.rnf recommenderArn
+      `Prelude.seq` Prelude.rnf recommenderConfig
+
+instance Data.ToHeaders UpdateRecommender where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "X-Amz-Target"
+              Data.=# ( "AmazonPersonalize.UpdateRecommender" ::
+                          Prelude.ByteString
+                      ),
+            "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON UpdateRecommender where
+  toJSON UpdateRecommender' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just
+              ("recommenderArn" Data..= recommenderArn),
+            Prelude.Just
+              ("recommenderConfig" Data..= recommenderConfig)
+          ]
+      )
+
+instance Data.ToPath UpdateRecommender where
+  toPath = Prelude.const "/"
+
+instance Data.ToQuery UpdateRecommender where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateRecommenderResponse' smart constructor.
+data UpdateRecommenderResponse = UpdateRecommenderResponse'
+  { -- | The same recommender Amazon Resource Name (ARN) as given in the request.
+    recommenderArn :: Prelude.Maybe Prelude.Text,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateRecommenderResponse' with all optional fields omitted.
+--
+-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'recommenderArn', 'updateRecommenderResponse_recommenderArn' - The same recommender Amazon Resource Name (ARN) as given in the request.
+--
+-- 'httpStatus', 'updateRecommenderResponse_httpStatus' - The response's http status code.
+newUpdateRecommenderResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateRecommenderResponse
+newUpdateRecommenderResponse pHttpStatus_ =
+  UpdateRecommenderResponse'
+    { recommenderArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The same recommender Amazon Resource Name (ARN) as given in the request.
+updateRecommenderResponse_recommenderArn :: Lens.Lens' UpdateRecommenderResponse (Prelude.Maybe Prelude.Text)
+updateRecommenderResponse_recommenderArn = Lens.lens (\UpdateRecommenderResponse' {recommenderArn} -> recommenderArn) (\s@UpdateRecommenderResponse' {} a -> s {recommenderArn = a} :: UpdateRecommenderResponse)
+
+-- | The response's http status code.
+updateRecommenderResponse_httpStatus :: Lens.Lens' UpdateRecommenderResponse Prelude.Int
+updateRecommenderResponse_httpStatus = Lens.lens (\UpdateRecommenderResponse' {httpStatus} -> httpStatus) (\s@UpdateRecommenderResponse' {} a -> s {httpStatus = a} :: UpdateRecommenderResponse)
+
+instance Prelude.NFData UpdateRecommenderResponse where
+  rnf UpdateRecommenderResponse' {..} =
+    Prelude.rnf recommenderArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/Personalize/Waiters.hs b/gen/Amazonka/Personalize/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/Personalize/Waiters.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE DisambiguateRecordFields #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE StrictData #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE NoImplicitPrelude #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Amazonka.Personalize.Waiters
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Amazonka.Personalize.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.Personalize.Lens
+import Amazonka.Personalize.Types
+import qualified Amazonka.Prelude as Prelude
diff --git a/src/.gitkeep b/src/.gitkeep
new file mode 100644
--- /dev/null
+++ b/src/.gitkeep
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,23 @@
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Main
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Main (main) where
+
+import Test.Amazonka.Personalize
+import Test.Amazonka.Personalize.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "Personalize"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/Personalize.hs b/test/Test/Amazonka/Gen/Personalize.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/Personalize.hs
@@ -0,0 +1,1358 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- Derived from AWS service descriptions, licensed under Apache 2.0.
+
+-- |
+-- Module      : Test.Amazonka.Gen.Personalize
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Gen.Personalize where
+
+import Amazonka.Personalize
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.Personalize.Internal
+import Test.Amazonka.Prelude
+import Test.Tasty
+
+-- Auto-generated: the actual test selection needs to be manually placed into
+-- the top-level so that real test data can be incrementally added.
+--
+-- This commented snippet is what the entire set should look like:
+
+-- fixtures :: TestTree
+-- fixtures =
+--     [ testGroup "request"
+--         [ requestCreateBatchInferenceJob $
+--             newCreateBatchInferenceJob
+--
+--         , requestCreateBatchSegmentJob $
+--             newCreateBatchSegmentJob
+--
+--         , requestCreateCampaign $
+--             newCreateCampaign
+--
+--         , requestCreateDataset $
+--             newCreateDataset
+--
+--         , requestCreateDatasetExportJob $
+--             newCreateDatasetExportJob
+--
+--         , requestCreateDatasetGroup $
+--             newCreateDatasetGroup
+--
+--         , requestCreateDatasetImportJob $
+--             newCreateDatasetImportJob
+--
+--         , requestCreateEventTracker $
+--             newCreateEventTracker
+--
+--         , requestCreateFilter $
+--             newCreateFilter
+--
+--         , requestCreateMetricAttribution $
+--             newCreateMetricAttribution
+--
+--         , requestCreateRecommender $
+--             newCreateRecommender
+--
+--         , requestCreateSchema $
+--             newCreateSchema
+--
+--         , requestCreateSolution $
+--             newCreateSolution
+--
+--         , requestCreateSolutionVersion $
+--             newCreateSolutionVersion
+--
+--         , requestDeleteCampaign $
+--             newDeleteCampaign
+--
+--         , requestDeleteDataset $
+--             newDeleteDataset
+--
+--         , requestDeleteDatasetGroup $
+--             newDeleteDatasetGroup
+--
+--         , requestDeleteEventTracker $
+--             newDeleteEventTracker
+--
+--         , requestDeleteFilter $
+--             newDeleteFilter
+--
+--         , requestDeleteMetricAttribution $
+--             newDeleteMetricAttribution
+--
+--         , requestDeleteRecommender $
+--             newDeleteRecommender
+--
+--         , requestDeleteSchema $
+--             newDeleteSchema
+--
+--         , requestDeleteSolution $
+--             newDeleteSolution
+--
+--         , requestDescribeAlgorithm $
+--             newDescribeAlgorithm
+--
+--         , requestDescribeBatchInferenceJob $
+--             newDescribeBatchInferenceJob
+--
+--         , requestDescribeBatchSegmentJob $
+--             newDescribeBatchSegmentJob
+--
+--         , requestDescribeCampaign $
+--             newDescribeCampaign
+--
+--         , requestDescribeDataset $
+--             newDescribeDataset
+--
+--         , requestDescribeDatasetExportJob $
+--             newDescribeDatasetExportJob
+--
+--         , requestDescribeDatasetGroup $
+--             newDescribeDatasetGroup
+--
+--         , requestDescribeDatasetImportJob $
+--             newDescribeDatasetImportJob
+--
+--         , requestDescribeEventTracker $
+--             newDescribeEventTracker
+--
+--         , requestDescribeFeatureTransformation $
+--             newDescribeFeatureTransformation
+--
+--         , requestDescribeFilter $
+--             newDescribeFilter
+--
+--         , requestDescribeMetricAttribution $
+--             newDescribeMetricAttribution
+--
+--         , requestDescribeRecipe $
+--             newDescribeRecipe
+--
+--         , requestDescribeRecommender $
+--             newDescribeRecommender
+--
+--         , requestDescribeSchema $
+--             newDescribeSchema
+--
+--         , requestDescribeSolution $
+--             newDescribeSolution
+--
+--         , requestDescribeSolutionVersion $
+--             newDescribeSolutionVersion
+--
+--         , requestGetSolutionMetrics $
+--             newGetSolutionMetrics
+--
+--         , requestListBatchInferenceJobs $
+--             newListBatchInferenceJobs
+--
+--         , requestListBatchSegmentJobs $
+--             newListBatchSegmentJobs
+--
+--         , requestListCampaigns $
+--             newListCampaigns
+--
+--         , requestListDatasetExportJobs $
+--             newListDatasetExportJobs
+--
+--         , requestListDatasetGroups $
+--             newListDatasetGroups
+--
+--         , requestListDatasetImportJobs $
+--             newListDatasetImportJobs
+--
+--         , requestListDatasets $
+--             newListDatasets
+--
+--         , requestListEventTrackers $
+--             newListEventTrackers
+--
+--         , requestListFilters $
+--             newListFilters
+--
+--         , requestListMetricAttributionMetrics $
+--             newListMetricAttributionMetrics
+--
+--         , requestListMetricAttributions $
+--             newListMetricAttributions
+--
+--         , requestListRecipes $
+--             newListRecipes
+--
+--         , requestListRecommenders $
+--             newListRecommenders
+--
+--         , requestListSchemas $
+--             newListSchemas
+--
+--         , requestListSolutionVersions $
+--             newListSolutionVersions
+--
+--         , requestListSolutions $
+--             newListSolutions
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestStartRecommender $
+--             newStartRecommender
+--
+--         , requestStopRecommender $
+--             newStopRecommender
+--
+--         , requestStopSolutionVersionCreation $
+--             newStopSolutionVersionCreation
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateCampaign $
+--             newUpdateCampaign
+--
+--         , requestUpdateMetricAttribution $
+--             newUpdateMetricAttribution
+--
+--         , requestUpdateRecommender $
+--             newUpdateRecommender
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCreateBatchInferenceJob $
+--             newCreateBatchInferenceJobResponse
+--
+--         , responseCreateBatchSegmentJob $
+--             newCreateBatchSegmentJobResponse
+--
+--         , responseCreateCampaign $
+--             newCreateCampaignResponse
+--
+--         , responseCreateDataset $
+--             newCreateDatasetResponse
+--
+--         , responseCreateDatasetExportJob $
+--             newCreateDatasetExportJobResponse
+--
+--         , responseCreateDatasetGroup $
+--             newCreateDatasetGroupResponse
+--
+--         , responseCreateDatasetImportJob $
+--             newCreateDatasetImportJobResponse
+--
+--         , responseCreateEventTracker $
+--             newCreateEventTrackerResponse
+--
+--         , responseCreateFilter $
+--             newCreateFilterResponse
+--
+--         , responseCreateMetricAttribution $
+--             newCreateMetricAttributionResponse
+--
+--         , responseCreateRecommender $
+--             newCreateRecommenderResponse
+--
+--         , responseCreateSchema $
+--             newCreateSchemaResponse
+--
+--         , responseCreateSolution $
+--             newCreateSolutionResponse
+--
+--         , responseCreateSolutionVersion $
+--             newCreateSolutionVersionResponse
+--
+--         , responseDeleteCampaign $
+--             newDeleteCampaignResponse
+--
+--         , responseDeleteDataset $
+--             newDeleteDatasetResponse
+--
+--         , responseDeleteDatasetGroup $
+--             newDeleteDatasetGroupResponse
+--
+--         , responseDeleteEventTracker $
+--             newDeleteEventTrackerResponse
+--
+--         , responseDeleteFilter $
+--             newDeleteFilterResponse
+--
+--         , responseDeleteMetricAttribution $
+--             newDeleteMetricAttributionResponse
+--
+--         , responseDeleteRecommender $
+--             newDeleteRecommenderResponse
+--
+--         , responseDeleteSchema $
+--             newDeleteSchemaResponse
+--
+--         , responseDeleteSolution $
+--             newDeleteSolutionResponse
+--
+--         , responseDescribeAlgorithm $
+--             newDescribeAlgorithmResponse
+--
+--         , responseDescribeBatchInferenceJob $
+--             newDescribeBatchInferenceJobResponse
+--
+--         , responseDescribeBatchSegmentJob $
+--             newDescribeBatchSegmentJobResponse
+--
+--         , responseDescribeCampaign $
+--             newDescribeCampaignResponse
+--
+--         , responseDescribeDataset $
+--             newDescribeDatasetResponse
+--
+--         , responseDescribeDatasetExportJob $
+--             newDescribeDatasetExportJobResponse
+--
+--         , responseDescribeDatasetGroup $
+--             newDescribeDatasetGroupResponse
+--
+--         , responseDescribeDatasetImportJob $
+--             newDescribeDatasetImportJobResponse
+--
+--         , responseDescribeEventTracker $
+--             newDescribeEventTrackerResponse
+--
+--         , responseDescribeFeatureTransformation $
+--             newDescribeFeatureTransformationResponse
+--
+--         , responseDescribeFilter $
+--             newDescribeFilterResponse
+--
+--         , responseDescribeMetricAttribution $
+--             newDescribeMetricAttributionResponse
+--
+--         , responseDescribeRecipe $
+--             newDescribeRecipeResponse
+--
+--         , responseDescribeRecommender $
+--             newDescribeRecommenderResponse
+--
+--         , responseDescribeSchema $
+--             newDescribeSchemaResponse
+--
+--         , responseDescribeSolution $
+--             newDescribeSolutionResponse
+--
+--         , responseDescribeSolutionVersion $
+--             newDescribeSolutionVersionResponse
+--
+--         , responseGetSolutionMetrics $
+--             newGetSolutionMetricsResponse
+--
+--         , responseListBatchInferenceJobs $
+--             newListBatchInferenceJobsResponse
+--
+--         , responseListBatchSegmentJobs $
+--             newListBatchSegmentJobsResponse
+--
+--         , responseListCampaigns $
+--             newListCampaignsResponse
+--
+--         , responseListDatasetExportJobs $
+--             newListDatasetExportJobsResponse
+--
+--         , responseListDatasetGroups $
+--             newListDatasetGroupsResponse
+--
+--         , responseListDatasetImportJobs $
+--             newListDatasetImportJobsResponse
+--
+--         , responseListDatasets $
+--             newListDatasetsResponse
+--
+--         , responseListEventTrackers $
+--             newListEventTrackersResponse
+--
+--         , responseListFilters $
+--             newListFiltersResponse
+--
+--         , responseListMetricAttributionMetrics $
+--             newListMetricAttributionMetricsResponse
+--
+--         , responseListMetricAttributions $
+--             newListMetricAttributionsResponse
+--
+--         , responseListRecipes $
+--             newListRecipesResponse
+--
+--         , responseListRecommenders $
+--             newListRecommendersResponse
+--
+--         , responseListSchemas $
+--             newListSchemasResponse
+--
+--         , responseListSolutionVersions $
+--             newListSolutionVersionsResponse
+--
+--         , responseListSolutions $
+--             newListSolutionsResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseStartRecommender $
+--             newStartRecommenderResponse
+--
+--         , responseStopRecommender $
+--             newStopRecommenderResponse
+--
+--         , responseStopSolutionVersionCreation $
+--             newStopSolutionVersionCreationResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateCampaign $
+--             newUpdateCampaignResponse
+--
+--         , responseUpdateMetricAttribution $
+--             newUpdateMetricAttributionResponse
+--
+--         , responseUpdateRecommender $
+--             newUpdateRecommenderResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCreateBatchInferenceJob :: CreateBatchInferenceJob -> TestTree
+requestCreateBatchInferenceJob =
+  req
+    "CreateBatchInferenceJob"
+    "fixture/CreateBatchInferenceJob.yaml"
+
+requestCreateBatchSegmentJob :: CreateBatchSegmentJob -> TestTree
+requestCreateBatchSegmentJob =
+  req
+    "CreateBatchSegmentJob"
+    "fixture/CreateBatchSegmentJob.yaml"
+
+requestCreateCampaign :: CreateCampaign -> TestTree
+requestCreateCampaign =
+  req
+    "CreateCampaign"
+    "fixture/CreateCampaign.yaml"
+
+requestCreateDataset :: CreateDataset -> TestTree
+requestCreateDataset =
+  req
+    "CreateDataset"
+    "fixture/CreateDataset.yaml"
+
+requestCreateDatasetExportJob :: CreateDatasetExportJob -> TestTree
+requestCreateDatasetExportJob =
+  req
+    "CreateDatasetExportJob"
+    "fixture/CreateDatasetExportJob.yaml"
+
+requestCreateDatasetGroup :: CreateDatasetGroup -> TestTree
+requestCreateDatasetGroup =
+  req
+    "CreateDatasetGroup"
+    "fixture/CreateDatasetGroup.yaml"
+
+requestCreateDatasetImportJob :: CreateDatasetImportJob -> TestTree
+requestCreateDatasetImportJob =
+  req
+    "CreateDatasetImportJob"
+    "fixture/CreateDatasetImportJob.yaml"
+
+requestCreateEventTracker :: CreateEventTracker -> TestTree
+requestCreateEventTracker =
+  req
+    "CreateEventTracker"
+    "fixture/CreateEventTracker.yaml"
+
+requestCreateFilter :: CreateFilter -> TestTree
+requestCreateFilter =
+  req
+    "CreateFilter"
+    "fixture/CreateFilter.yaml"
+
+requestCreateMetricAttribution :: CreateMetricAttribution -> TestTree
+requestCreateMetricAttribution =
+  req
+    "CreateMetricAttribution"
+    "fixture/CreateMetricAttribution.yaml"
+
+requestCreateRecommender :: CreateRecommender -> TestTree
+requestCreateRecommender =
+  req
+    "CreateRecommender"
+    "fixture/CreateRecommender.yaml"
+
+requestCreateSchema :: CreateSchema -> TestTree
+requestCreateSchema =
+  req
+    "CreateSchema"
+    "fixture/CreateSchema.yaml"
+
+requestCreateSolution :: CreateSolution -> TestTree
+requestCreateSolution =
+  req
+    "CreateSolution"
+    "fixture/CreateSolution.yaml"
+
+requestCreateSolutionVersion :: CreateSolutionVersion -> TestTree
+requestCreateSolutionVersion =
+  req
+    "CreateSolutionVersion"
+    "fixture/CreateSolutionVersion.yaml"
+
+requestDeleteCampaign :: DeleteCampaign -> TestTree
+requestDeleteCampaign =
+  req
+    "DeleteCampaign"
+    "fixture/DeleteCampaign.yaml"
+
+requestDeleteDataset :: DeleteDataset -> TestTree
+requestDeleteDataset =
+  req
+    "DeleteDataset"
+    "fixture/DeleteDataset.yaml"
+
+requestDeleteDatasetGroup :: DeleteDatasetGroup -> TestTree
+requestDeleteDatasetGroup =
+  req
+    "DeleteDatasetGroup"
+    "fixture/DeleteDatasetGroup.yaml"
+
+requestDeleteEventTracker :: DeleteEventTracker -> TestTree
+requestDeleteEventTracker =
+  req
+    "DeleteEventTracker"
+    "fixture/DeleteEventTracker.yaml"
+
+requestDeleteFilter :: DeleteFilter -> TestTree
+requestDeleteFilter =
+  req
+    "DeleteFilter"
+    "fixture/DeleteFilter.yaml"
+
+requestDeleteMetricAttribution :: DeleteMetricAttribution -> TestTree
+requestDeleteMetricAttribution =
+  req
+    "DeleteMetricAttribution"
+    "fixture/DeleteMetricAttribution.yaml"
+
+requestDeleteRecommender :: DeleteRecommender -> TestTree
+requestDeleteRecommender =
+  req
+    "DeleteRecommender"
+    "fixture/DeleteRecommender.yaml"
+
+requestDeleteSchema :: DeleteSchema -> TestTree
+requestDeleteSchema =
+  req
+    "DeleteSchema"
+    "fixture/DeleteSchema.yaml"
+
+requestDeleteSolution :: DeleteSolution -> TestTree
+requestDeleteSolution =
+  req
+    "DeleteSolution"
+    "fixture/DeleteSolution.yaml"
+
+requestDescribeAlgorithm :: DescribeAlgorithm -> TestTree
+requestDescribeAlgorithm =
+  req
+    "DescribeAlgorithm"
+    "fixture/DescribeAlgorithm.yaml"
+
+requestDescribeBatchInferenceJob :: DescribeBatchInferenceJob -> TestTree
+requestDescribeBatchInferenceJob =
+  req
+    "DescribeBatchInferenceJob"
+    "fixture/DescribeBatchInferenceJob.yaml"
+
+requestDescribeBatchSegmentJob :: DescribeBatchSegmentJob -> TestTree
+requestDescribeBatchSegmentJob =
+  req
+    "DescribeBatchSegmentJob"
+    "fixture/DescribeBatchSegmentJob.yaml"
+
+requestDescribeCampaign :: DescribeCampaign -> TestTree
+requestDescribeCampaign =
+  req
+    "DescribeCampaign"
+    "fixture/DescribeCampaign.yaml"
+
+requestDescribeDataset :: DescribeDataset -> TestTree
+requestDescribeDataset =
+  req
+    "DescribeDataset"
+    "fixture/DescribeDataset.yaml"
+
+requestDescribeDatasetExportJob :: DescribeDatasetExportJob -> TestTree
+requestDescribeDatasetExportJob =
+  req
+    "DescribeDatasetExportJob"
+    "fixture/DescribeDatasetExportJob.yaml"
+
+requestDescribeDatasetGroup :: DescribeDatasetGroup -> TestTree
+requestDescribeDatasetGroup =
+  req
+    "DescribeDatasetGroup"
+    "fixture/DescribeDatasetGroup.yaml"
+
+requestDescribeDatasetImportJob :: DescribeDatasetImportJob -> TestTree
+requestDescribeDatasetImportJob =
+  req
+    "DescribeDatasetImportJob"
+    "fixture/DescribeDatasetImportJob.yaml"
+
+requestDescribeEventTracker :: DescribeEventTracker -> TestTree
+requestDescribeEventTracker =
+  req
+    "DescribeEventTracker"
+    "fixture/DescribeEventTracker.yaml"
+
+requestDescribeFeatureTransformation :: DescribeFeatureTransformation -> TestTree
+requestDescribeFeatureTransformation =
+  req
+    "DescribeFeatureTransformation"
+    "fixture/DescribeFeatureTransformation.yaml"
+
+requestDescribeFilter :: DescribeFilter -> TestTree
+requestDescribeFilter =
+  req
+    "DescribeFilter"
+    "fixture/DescribeFilter.yaml"
+
+requestDescribeMetricAttribution :: DescribeMetricAttribution -> TestTree
+requestDescribeMetricAttribution =
+  req
+    "DescribeMetricAttribution"
+    "fixture/DescribeMetricAttribution.yaml"
+
+requestDescribeRecipe :: DescribeRecipe -> TestTree
+requestDescribeRecipe =
+  req
+    "DescribeRecipe"
+    "fixture/DescribeRecipe.yaml"
+
+requestDescribeRecommender :: DescribeRecommender -> TestTree
+requestDescribeRecommender =
+  req
+    "DescribeRecommender"
+    "fixture/DescribeRecommender.yaml"
+
+requestDescribeSchema :: DescribeSchema -> TestTree
+requestDescribeSchema =
+  req
+    "DescribeSchema"
+    "fixture/DescribeSchema.yaml"
+
+requestDescribeSolution :: DescribeSolution -> TestTree
+requestDescribeSolution =
+  req
+    "DescribeSolution"
+    "fixture/DescribeSolution.yaml"
+
+requestDescribeSolutionVersion :: DescribeSolutionVersion -> TestTree
+requestDescribeSolutionVersion =
+  req
+    "DescribeSolutionVersion"
+    "fixture/DescribeSolutionVersion.yaml"
+
+requestGetSolutionMetrics :: GetSolutionMetrics -> TestTree
+requestGetSolutionMetrics =
+  req
+    "GetSolutionMetrics"
+    "fixture/GetSolutionMetrics.yaml"
+
+requestListBatchInferenceJobs :: ListBatchInferenceJobs -> TestTree
+requestListBatchInferenceJobs =
+  req
+    "ListBatchInferenceJobs"
+    "fixture/ListBatchInferenceJobs.yaml"
+
+requestListBatchSegmentJobs :: ListBatchSegmentJobs -> TestTree
+requestListBatchSegmentJobs =
+  req
+    "ListBatchSegmentJobs"
+    "fixture/ListBatchSegmentJobs.yaml"
+
+requestListCampaigns :: ListCampaigns -> TestTree
+requestListCampaigns =
+  req
+    "ListCampaigns"
+    "fixture/ListCampaigns.yaml"
+
+requestListDatasetExportJobs :: ListDatasetExportJobs -> TestTree
+requestListDatasetExportJobs =
+  req
+    "ListDatasetExportJobs"
+    "fixture/ListDatasetExportJobs.yaml"
+
+requestListDatasetGroups :: ListDatasetGroups -> TestTree
+requestListDatasetGroups =
+  req
+    "ListDatasetGroups"
+    "fixture/ListDatasetGroups.yaml"
+
+requestListDatasetImportJobs :: ListDatasetImportJobs -> TestTree
+requestListDatasetImportJobs =
+  req
+    "ListDatasetImportJobs"
+    "fixture/ListDatasetImportJobs.yaml"
+
+requestListDatasets :: ListDatasets -> TestTree
+requestListDatasets =
+  req
+    "ListDatasets"
+    "fixture/ListDatasets.yaml"
+
+requestListEventTrackers :: ListEventTrackers -> TestTree
+requestListEventTrackers =
+  req
+    "ListEventTrackers"
+    "fixture/ListEventTrackers.yaml"
+
+requestListFilters :: ListFilters -> TestTree
+requestListFilters =
+  req
+    "ListFilters"
+    "fixture/ListFilters.yaml"
+
+requestListMetricAttributionMetrics :: ListMetricAttributionMetrics -> TestTree
+requestListMetricAttributionMetrics =
+  req
+    "ListMetricAttributionMetrics"
+    "fixture/ListMetricAttributionMetrics.yaml"
+
+requestListMetricAttributions :: ListMetricAttributions -> TestTree
+requestListMetricAttributions =
+  req
+    "ListMetricAttributions"
+    "fixture/ListMetricAttributions.yaml"
+
+requestListRecipes :: ListRecipes -> TestTree
+requestListRecipes =
+  req
+    "ListRecipes"
+    "fixture/ListRecipes.yaml"
+
+requestListRecommenders :: ListRecommenders -> TestTree
+requestListRecommenders =
+  req
+    "ListRecommenders"
+    "fixture/ListRecommenders.yaml"
+
+requestListSchemas :: ListSchemas -> TestTree
+requestListSchemas =
+  req
+    "ListSchemas"
+    "fixture/ListSchemas.yaml"
+
+requestListSolutionVersions :: ListSolutionVersions -> TestTree
+requestListSolutionVersions =
+  req
+    "ListSolutionVersions"
+    "fixture/ListSolutionVersions.yaml"
+
+requestListSolutions :: ListSolutions -> TestTree
+requestListSolutions =
+  req
+    "ListSolutions"
+    "fixture/ListSolutions.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestStartRecommender :: StartRecommender -> TestTree
+requestStartRecommender =
+  req
+    "StartRecommender"
+    "fixture/StartRecommender.yaml"
+
+requestStopRecommender :: StopRecommender -> TestTree
+requestStopRecommender =
+  req
+    "StopRecommender"
+    "fixture/StopRecommender.yaml"
+
+requestStopSolutionVersionCreation :: StopSolutionVersionCreation -> TestTree
+requestStopSolutionVersionCreation =
+  req
+    "StopSolutionVersionCreation"
+    "fixture/StopSolutionVersionCreation.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateCampaign :: UpdateCampaign -> TestTree
+requestUpdateCampaign =
+  req
+    "UpdateCampaign"
+    "fixture/UpdateCampaign.yaml"
+
+requestUpdateMetricAttribution :: UpdateMetricAttribution -> TestTree
+requestUpdateMetricAttribution =
+  req
+    "UpdateMetricAttribution"
+    "fixture/UpdateMetricAttribution.yaml"
+
+requestUpdateRecommender :: UpdateRecommender -> TestTree
+requestUpdateRecommender =
+  req
+    "UpdateRecommender"
+    "fixture/UpdateRecommender.yaml"
+
+-- Responses
+
+responseCreateBatchInferenceJob :: CreateBatchInferenceJobResponse -> TestTree
+responseCreateBatchInferenceJob =
+  res
+    "CreateBatchInferenceJobResponse"
+    "fixture/CreateBatchInferenceJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateBatchInferenceJob)
+
+responseCreateBatchSegmentJob :: CreateBatchSegmentJobResponse -> TestTree
+responseCreateBatchSegmentJob =
+  res
+    "CreateBatchSegmentJobResponse"
+    "fixture/CreateBatchSegmentJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateBatchSegmentJob)
+
+responseCreateCampaign :: CreateCampaignResponse -> TestTree
+responseCreateCampaign =
+  res
+    "CreateCampaignResponse"
+    "fixture/CreateCampaignResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateCampaign)
+
+responseCreateDataset :: CreateDatasetResponse -> TestTree
+responseCreateDataset =
+  res
+    "CreateDatasetResponse"
+    "fixture/CreateDatasetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDataset)
+
+responseCreateDatasetExportJob :: CreateDatasetExportJobResponse -> TestTree
+responseCreateDatasetExportJob =
+  res
+    "CreateDatasetExportJobResponse"
+    "fixture/CreateDatasetExportJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDatasetExportJob)
+
+responseCreateDatasetGroup :: CreateDatasetGroupResponse -> TestTree
+responseCreateDatasetGroup =
+  res
+    "CreateDatasetGroupResponse"
+    "fixture/CreateDatasetGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDatasetGroup)
+
+responseCreateDatasetImportJob :: CreateDatasetImportJobResponse -> TestTree
+responseCreateDatasetImportJob =
+  res
+    "CreateDatasetImportJobResponse"
+    "fixture/CreateDatasetImportJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDatasetImportJob)
+
+responseCreateEventTracker :: CreateEventTrackerResponse -> TestTree
+responseCreateEventTracker =
+  res
+    "CreateEventTrackerResponse"
+    "fixture/CreateEventTrackerResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateEventTracker)
+
+responseCreateFilter :: CreateFilterResponse -> TestTree
+responseCreateFilter =
+  res
+    "CreateFilterResponse"
+    "fixture/CreateFilterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateFilter)
+
+responseCreateMetricAttribution :: CreateMetricAttributionResponse -> TestTree
+responseCreateMetricAttribution =
+  res
+    "CreateMetricAttributionResponse"
+    "fixture/CreateMetricAttributionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateMetricAttribution)
+
+responseCreateRecommender :: CreateRecommenderResponse -> TestTree
+responseCreateRecommender =
+  res
+    "CreateRecommenderResponse"
+    "fixture/CreateRecommenderResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateRecommender)
+
+responseCreateSchema :: CreateSchemaResponse -> TestTree
+responseCreateSchema =
+  res
+    "CreateSchemaResponse"
+    "fixture/CreateSchemaResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateSchema)
+
+responseCreateSolution :: CreateSolutionResponse -> TestTree
+responseCreateSolution =
+  res
+    "CreateSolutionResponse"
+    "fixture/CreateSolutionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateSolution)
+
+responseCreateSolutionVersion :: CreateSolutionVersionResponse -> TestTree
+responseCreateSolutionVersion =
+  res
+    "CreateSolutionVersionResponse"
+    "fixture/CreateSolutionVersionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateSolutionVersion)
+
+responseDeleteCampaign :: DeleteCampaignResponse -> TestTree
+responseDeleteCampaign =
+  res
+    "DeleteCampaignResponse"
+    "fixture/DeleteCampaignResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteCampaign)
+
+responseDeleteDataset :: DeleteDatasetResponse -> TestTree
+responseDeleteDataset =
+  res
+    "DeleteDatasetResponse"
+    "fixture/DeleteDatasetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDataset)
+
+responseDeleteDatasetGroup :: DeleteDatasetGroupResponse -> TestTree
+responseDeleteDatasetGroup =
+  res
+    "DeleteDatasetGroupResponse"
+    "fixture/DeleteDatasetGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDatasetGroup)
+
+responseDeleteEventTracker :: DeleteEventTrackerResponse -> TestTree
+responseDeleteEventTracker =
+  res
+    "DeleteEventTrackerResponse"
+    "fixture/DeleteEventTrackerResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteEventTracker)
+
+responseDeleteFilter :: DeleteFilterResponse -> TestTree
+responseDeleteFilter =
+  res
+    "DeleteFilterResponse"
+    "fixture/DeleteFilterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteFilter)
+
+responseDeleteMetricAttribution :: DeleteMetricAttributionResponse -> TestTree
+responseDeleteMetricAttribution =
+  res
+    "DeleteMetricAttributionResponse"
+    "fixture/DeleteMetricAttributionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteMetricAttribution)
+
+responseDeleteRecommender :: DeleteRecommenderResponse -> TestTree
+responseDeleteRecommender =
+  res
+    "DeleteRecommenderResponse"
+    "fixture/DeleteRecommenderResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteRecommender)
+
+responseDeleteSchema :: DeleteSchemaResponse -> TestTree
+responseDeleteSchema =
+  res
+    "DeleteSchemaResponse"
+    "fixture/DeleteSchemaResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteSchema)
+
+responseDeleteSolution :: DeleteSolutionResponse -> TestTree
+responseDeleteSolution =
+  res
+    "DeleteSolutionResponse"
+    "fixture/DeleteSolutionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteSolution)
+
+responseDescribeAlgorithm :: DescribeAlgorithmResponse -> TestTree
+responseDescribeAlgorithm =
+  res
+    "DescribeAlgorithmResponse"
+    "fixture/DescribeAlgorithmResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeAlgorithm)
+
+responseDescribeBatchInferenceJob :: DescribeBatchInferenceJobResponse -> TestTree
+responseDescribeBatchInferenceJob =
+  res
+    "DescribeBatchInferenceJobResponse"
+    "fixture/DescribeBatchInferenceJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeBatchInferenceJob)
+
+responseDescribeBatchSegmentJob :: DescribeBatchSegmentJobResponse -> TestTree
+responseDescribeBatchSegmentJob =
+  res
+    "DescribeBatchSegmentJobResponse"
+    "fixture/DescribeBatchSegmentJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeBatchSegmentJob)
+
+responseDescribeCampaign :: DescribeCampaignResponse -> TestTree
+responseDescribeCampaign =
+  res
+    "DescribeCampaignResponse"
+    "fixture/DescribeCampaignResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeCampaign)
+
+responseDescribeDataset :: DescribeDatasetResponse -> TestTree
+responseDescribeDataset =
+  res
+    "DescribeDatasetResponse"
+    "fixture/DescribeDatasetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDataset)
+
+responseDescribeDatasetExportJob :: DescribeDatasetExportJobResponse -> TestTree
+responseDescribeDatasetExportJob =
+  res
+    "DescribeDatasetExportJobResponse"
+    "fixture/DescribeDatasetExportJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDatasetExportJob)
+
+responseDescribeDatasetGroup :: DescribeDatasetGroupResponse -> TestTree
+responseDescribeDatasetGroup =
+  res
+    "DescribeDatasetGroupResponse"
+    "fixture/DescribeDatasetGroupResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDatasetGroup)
+
+responseDescribeDatasetImportJob :: DescribeDatasetImportJobResponse -> TestTree
+responseDescribeDatasetImportJob =
+  res
+    "DescribeDatasetImportJobResponse"
+    "fixture/DescribeDatasetImportJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDatasetImportJob)
+
+responseDescribeEventTracker :: DescribeEventTrackerResponse -> TestTree
+responseDescribeEventTracker =
+  res
+    "DescribeEventTrackerResponse"
+    "fixture/DescribeEventTrackerResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeEventTracker)
+
+responseDescribeFeatureTransformation :: DescribeFeatureTransformationResponse -> TestTree
+responseDescribeFeatureTransformation =
+  res
+    "DescribeFeatureTransformationResponse"
+    "fixture/DescribeFeatureTransformationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeFeatureTransformation)
+
+responseDescribeFilter :: DescribeFilterResponse -> TestTree
+responseDescribeFilter =
+  res
+    "DescribeFilterResponse"
+    "fixture/DescribeFilterResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeFilter)
+
+responseDescribeMetricAttribution :: DescribeMetricAttributionResponse -> TestTree
+responseDescribeMetricAttribution =
+  res
+    "DescribeMetricAttributionResponse"
+    "fixture/DescribeMetricAttributionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeMetricAttribution)
+
+responseDescribeRecipe :: DescribeRecipeResponse -> TestTree
+responseDescribeRecipe =
+  res
+    "DescribeRecipeResponse"
+    "fixture/DescribeRecipeResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeRecipe)
+
+responseDescribeRecommender :: DescribeRecommenderResponse -> TestTree
+responseDescribeRecommender =
+  res
+    "DescribeRecommenderResponse"
+    "fixture/DescribeRecommenderResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeRecommender)
+
+responseDescribeSchema :: DescribeSchemaResponse -> TestTree
+responseDescribeSchema =
+  res
+    "DescribeSchemaResponse"
+    "fixture/DescribeSchemaResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeSchema)
+
+responseDescribeSolution :: DescribeSolutionResponse -> TestTree
+responseDescribeSolution =
+  res
+    "DescribeSolutionResponse"
+    "fixture/DescribeSolutionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeSolution)
+
+responseDescribeSolutionVersion :: DescribeSolutionVersionResponse -> TestTree
+responseDescribeSolutionVersion =
+  res
+    "DescribeSolutionVersionResponse"
+    "fixture/DescribeSolutionVersionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeSolutionVersion)
+
+responseGetSolutionMetrics :: GetSolutionMetricsResponse -> TestTree
+responseGetSolutionMetrics =
+  res
+    "GetSolutionMetricsResponse"
+    "fixture/GetSolutionMetricsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy GetSolutionMetrics)
+
+responseListBatchInferenceJobs :: ListBatchInferenceJobsResponse -> TestTree
+responseListBatchInferenceJobs =
+  res
+    "ListBatchInferenceJobsResponse"
+    "fixture/ListBatchInferenceJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListBatchInferenceJobs)
+
+responseListBatchSegmentJobs :: ListBatchSegmentJobsResponse -> TestTree
+responseListBatchSegmentJobs =
+  res
+    "ListBatchSegmentJobsResponse"
+    "fixture/ListBatchSegmentJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListBatchSegmentJobs)
+
+responseListCampaigns :: ListCampaignsResponse -> TestTree
+responseListCampaigns =
+  res
+    "ListCampaignsResponse"
+    "fixture/ListCampaignsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListCampaigns)
+
+responseListDatasetExportJobs :: ListDatasetExportJobsResponse -> TestTree
+responseListDatasetExportJobs =
+  res
+    "ListDatasetExportJobsResponse"
+    "fixture/ListDatasetExportJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDatasetExportJobs)
+
+responseListDatasetGroups :: ListDatasetGroupsResponse -> TestTree
+responseListDatasetGroups =
+  res
+    "ListDatasetGroupsResponse"
+    "fixture/ListDatasetGroupsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDatasetGroups)
+
+responseListDatasetImportJobs :: ListDatasetImportJobsResponse -> TestTree
+responseListDatasetImportJobs =
+  res
+    "ListDatasetImportJobsResponse"
+    "fixture/ListDatasetImportJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDatasetImportJobs)
+
+responseListDatasets :: ListDatasetsResponse -> TestTree
+responseListDatasets =
+  res
+    "ListDatasetsResponse"
+    "fixture/ListDatasetsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDatasets)
+
+responseListEventTrackers :: ListEventTrackersResponse -> TestTree
+responseListEventTrackers =
+  res
+    "ListEventTrackersResponse"
+    "fixture/ListEventTrackersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListEventTrackers)
+
+responseListFilters :: ListFiltersResponse -> TestTree
+responseListFilters =
+  res
+    "ListFiltersResponse"
+    "fixture/ListFiltersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListFilters)
+
+responseListMetricAttributionMetrics :: ListMetricAttributionMetricsResponse -> TestTree
+responseListMetricAttributionMetrics =
+  res
+    "ListMetricAttributionMetricsResponse"
+    "fixture/ListMetricAttributionMetricsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListMetricAttributionMetrics)
+
+responseListMetricAttributions :: ListMetricAttributionsResponse -> TestTree
+responseListMetricAttributions =
+  res
+    "ListMetricAttributionsResponse"
+    "fixture/ListMetricAttributionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListMetricAttributions)
+
+responseListRecipes :: ListRecipesResponse -> TestTree
+responseListRecipes =
+  res
+    "ListRecipesResponse"
+    "fixture/ListRecipesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListRecipes)
+
+responseListRecommenders :: ListRecommendersResponse -> TestTree
+responseListRecommenders =
+  res
+    "ListRecommendersResponse"
+    "fixture/ListRecommendersResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListRecommenders)
+
+responseListSchemas :: ListSchemasResponse -> TestTree
+responseListSchemas =
+  res
+    "ListSchemasResponse"
+    "fixture/ListSchemasResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListSchemas)
+
+responseListSolutionVersions :: ListSolutionVersionsResponse -> TestTree
+responseListSolutionVersions =
+  res
+    "ListSolutionVersionsResponse"
+    "fixture/ListSolutionVersionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListSolutionVersions)
+
+responseListSolutions :: ListSolutionsResponse -> TestTree
+responseListSolutions =
+  res
+    "ListSolutionsResponse"
+    "fixture/ListSolutionsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListSolutions)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseStartRecommender :: StartRecommenderResponse -> TestTree
+responseStartRecommender =
+  res
+    "StartRecommenderResponse"
+    "fixture/StartRecommenderResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartRecommender)
+
+responseStopRecommender :: StopRecommenderResponse -> TestTree
+responseStopRecommender =
+  res
+    "StopRecommenderResponse"
+    "fixture/StopRecommenderResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StopRecommender)
+
+responseStopSolutionVersionCreation :: StopSolutionVersionCreationResponse -> TestTree
+responseStopSolutionVersionCreation =
+  res
+    "StopSolutionVersionCreationResponse"
+    "fixture/StopSolutionVersionCreationResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StopSolutionVersionCreation)
+
+responseTagResource :: TagResourceResponse -> TestTree
+responseTagResource =
+  res
+    "TagResourceResponse"
+    "fixture/TagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy TagResource)
+
+responseUntagResource :: UntagResourceResponse -> TestTree
+responseUntagResource =
+  res
+    "UntagResourceResponse"
+    "fixture/UntagResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UntagResource)
+
+responseUpdateCampaign :: UpdateCampaignResponse -> TestTree
+responseUpdateCampaign =
+  res
+    "UpdateCampaignResponse"
+    "fixture/UpdateCampaignResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateCampaign)
+
+responseUpdateMetricAttribution :: UpdateMetricAttributionResponse -> TestTree
+responseUpdateMetricAttribution =
+  res
+    "UpdateMetricAttributionResponse"
+    "fixture/UpdateMetricAttributionResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateMetricAttribution)
+
+responseUpdateRecommender :: UpdateRecommenderResponse -> TestTree
+responseUpdateRecommender =
+  res
+    "UpdateRecommenderResponse"
+    "fixture/UpdateRecommenderResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateRecommender)
diff --git a/test/Test/Amazonka/Personalize.hs b/test/Test/Amazonka/Personalize.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Personalize.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.Personalize
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Personalize
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/Personalize/Internal.hs b/test/Test/Amazonka/Personalize/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Personalize/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.Personalize.Internal
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+module Test.Amazonka.Personalize.Internal where
