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 Lookout for Vision SDK
+
+* [Version](#version)
+* [Description](#description)
+* [Contribute](#contribute)
+* [Licence](#licence)
+
+
+## Version
+ 
+`2.0` - Derived from API version @2020-11-20@ of the AWS service descriptions, licensed under Apache 2.0.
+
+## Description
+
+Documentation is available via [Hackage](http://hackage.haskell.org/package/amazonka-lookoutvision)
+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.LookoutVision](http://hackage.haskell.org/package/amazonka-lookoutvision/docs/Amazonka-LookoutVision.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-lookoutvision` 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-lookoutvision.cabal b/amazonka-lookoutvision.cabal
new file mode 100644
--- /dev/null
+++ b/amazonka-lookoutvision.cabal
@@ -0,0 +1,139 @@
+cabal-version:      2.2
+name:               amazonka-lookoutvision
+version:            2.0
+synopsis:           Amazon Lookout for Vision 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 @2020-11-20@ 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.LookoutVision.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.LookoutVision" 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-lookoutvision
+
+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.LookoutVision
+    Amazonka.LookoutVision.CreateDataset
+    Amazonka.LookoutVision.CreateModel
+    Amazonka.LookoutVision.CreateProject
+    Amazonka.LookoutVision.DeleteDataset
+    Amazonka.LookoutVision.DeleteModel
+    Amazonka.LookoutVision.DeleteProject
+    Amazonka.LookoutVision.DescribeDataset
+    Amazonka.LookoutVision.DescribeModel
+    Amazonka.LookoutVision.DescribeModelPackagingJob
+    Amazonka.LookoutVision.DescribeProject
+    Amazonka.LookoutVision.DetectAnomalies
+    Amazonka.LookoutVision.Lens
+    Amazonka.LookoutVision.ListDatasetEntries
+    Amazonka.LookoutVision.ListModelPackagingJobs
+    Amazonka.LookoutVision.ListModels
+    Amazonka.LookoutVision.ListProjects
+    Amazonka.LookoutVision.ListTagsForResource
+    Amazonka.LookoutVision.StartModel
+    Amazonka.LookoutVision.StartModelPackagingJob
+    Amazonka.LookoutVision.StopModel
+    Amazonka.LookoutVision.TagResource
+    Amazonka.LookoutVision.Types
+    Amazonka.LookoutVision.Types.Anomaly
+    Amazonka.LookoutVision.Types.DatasetDescription
+    Amazonka.LookoutVision.Types.DatasetGroundTruthManifest
+    Amazonka.LookoutVision.Types.DatasetImageStats
+    Amazonka.LookoutVision.Types.DatasetMetadata
+    Amazonka.LookoutVision.Types.DatasetSource
+    Amazonka.LookoutVision.Types.DatasetStatus
+    Amazonka.LookoutVision.Types.DetectAnomalyResult
+    Amazonka.LookoutVision.Types.GreengrassConfiguration
+    Amazonka.LookoutVision.Types.GreengrassOutputDetails
+    Amazonka.LookoutVision.Types.ImageSource
+    Amazonka.LookoutVision.Types.InputS3Object
+    Amazonka.LookoutVision.Types.ModelDescription
+    Amazonka.LookoutVision.Types.ModelHostingStatus
+    Amazonka.LookoutVision.Types.ModelMetadata
+    Amazonka.LookoutVision.Types.ModelPackagingConfiguration
+    Amazonka.LookoutVision.Types.ModelPackagingDescription
+    Amazonka.LookoutVision.Types.ModelPackagingJobMetadata
+    Amazonka.LookoutVision.Types.ModelPackagingJobStatus
+    Amazonka.LookoutVision.Types.ModelPackagingOutputDetails
+    Amazonka.LookoutVision.Types.ModelPerformance
+    Amazonka.LookoutVision.Types.ModelStatus
+    Amazonka.LookoutVision.Types.OutputConfig
+    Amazonka.LookoutVision.Types.OutputS3Object
+    Amazonka.LookoutVision.Types.PixelAnomaly
+    Amazonka.LookoutVision.Types.ProjectDescription
+    Amazonka.LookoutVision.Types.ProjectMetadata
+    Amazonka.LookoutVision.Types.S3Location
+    Amazonka.LookoutVision.Types.Tag
+    Amazonka.LookoutVision.Types.TargetDevice
+    Amazonka.LookoutVision.Types.TargetPlatform
+    Amazonka.LookoutVision.Types.TargetPlatformAccelerator
+    Amazonka.LookoutVision.Types.TargetPlatformArch
+    Amazonka.LookoutVision.Types.TargetPlatformOs
+    Amazonka.LookoutVision.UntagResource
+    Amazonka.LookoutVision.UpdateDatasetEntries
+    Amazonka.LookoutVision.Waiters
+
+  build-depends:
+    , amazonka-core  >=2.0  && <2.1
+    , base           >=4.12 && <5
+
+test-suite amazonka-lookoutvision-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.LookoutVision
+    Test.Amazonka.LookoutVision
+    Test.Amazonka.LookoutVision.Internal
+
+  build-depends:
+    , amazonka-core           >=2.0 && <2.1
+    , amazonka-lookoutvision
+    , amazonka-test           >=2.0 && <2.1
+    , base
+    , bytestring
+    , case-insensitive
+    , tasty
+    , tasty-hunit
+    , text
+    , time
+    , unordered-containers
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/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/CreateDatasetResponse.proto b/fixture/CreateDatasetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateDatasetResponse.proto
diff --git a/fixture/CreateModel.yaml b/fixture/CreateModel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateModel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/CreateModelResponse.proto b/fixture/CreateModelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateModelResponse.proto
diff --git a/fixture/CreateProject.yaml b/fixture/CreateProject.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/CreateProject.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/CreateProjectResponse.proto b/fixture/CreateProjectResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/CreateProjectResponse.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: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/DeleteDatasetResponse.proto b/fixture/DeleteDatasetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteDatasetResponse.proto
diff --git a/fixture/DeleteModel.yaml b/fixture/DeleteModel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteModel.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/DeleteModelResponse.proto b/fixture/DeleteModelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteModelResponse.proto
diff --git a/fixture/DeleteProject.yaml b/fixture/DeleteProject.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteProject.yaml
@@ -0,0 +1,10 @@
+---
+method: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/DeleteProjectResponse.proto b/fixture/DeleteProjectResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DeleteProjectResponse.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: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/DescribeDatasetResponse.proto b/fixture/DescribeDatasetResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeDatasetResponse.proto
diff --git a/fixture/DescribeModel.yaml b/fixture/DescribeModel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeModel.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/DescribeModelPackagingJob.yaml b/fixture/DescribeModelPackagingJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeModelPackagingJob.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/DescribeModelPackagingJobResponse.proto b/fixture/DescribeModelPackagingJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeModelPackagingJobResponse.proto
diff --git a/fixture/DescribeModelResponse.proto b/fixture/DescribeModelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeModelResponse.proto
diff --git a/fixture/DescribeProject.yaml b/fixture/DescribeProject.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeProject.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/DescribeProjectResponse.proto b/fixture/DescribeProjectResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DescribeProjectResponse.proto
diff --git a/fixture/DetectAnomalies.yaml b/fixture/DetectAnomalies.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/DetectAnomalies.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/DetectAnomaliesResponse.proto b/fixture/DetectAnomaliesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/DetectAnomaliesResponse.proto
diff --git a/fixture/ListDatasetEntries.yaml b/fixture/ListDatasetEntries.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatasetEntries.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/ListDatasetEntriesResponse.proto b/fixture/ListDatasetEntriesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListDatasetEntriesResponse.proto
diff --git a/fixture/ListModelPackagingJobs.yaml b/fixture/ListModelPackagingJobs.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListModelPackagingJobs.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/ListModelPackagingJobsResponse.proto b/fixture/ListModelPackagingJobsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListModelPackagingJobsResponse.proto
diff --git a/fixture/ListModels.yaml b/fixture/ListModels.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListModels.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/ListModelsResponse.proto b/fixture/ListModelsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListModelsResponse.proto
diff --git a/fixture/ListProjects.yaml b/fixture/ListProjects.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/ListProjects.yaml
@@ -0,0 +1,10 @@
+---
+method: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/ListProjectsResponse.proto b/fixture/ListProjectsResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/ListProjectsResponse.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: GET
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/StartModel.yaml b/fixture/StartModel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartModel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/StartModelPackagingJob.yaml b/fixture/StartModelPackagingJob.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StartModelPackagingJob.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/StartModelPackagingJobResponse.proto b/fixture/StartModelPackagingJobResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartModelPackagingJobResponse.proto
diff --git a/fixture/StartModelResponse.proto b/fixture/StartModelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StartModelResponse.proto
diff --git a/fixture/StopModel.yaml b/fixture/StopModel.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/StopModel.yaml
@@ -0,0 +1,10 @@
+---
+method: POST
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/StopModelResponse.proto b/fixture/StopModelResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/StopModelResponse.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/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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: DELETE
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/UpdateDatasetEntries.yaml b/fixture/UpdateDatasetEntries.yaml
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDatasetEntries.yaml
@@ -0,0 +1,10 @@
+---
+method: PATCH
+headers:
+  Authorization:         AWS4-HMAC-SHA256 Credential=access/20091028/us-east-1/lookoutvision/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date, Signature=?
+  Host:                  lookoutvision.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/UpdateDatasetEntriesResponse.proto b/fixture/UpdateDatasetEntriesResponse.proto
new file mode 100644
--- /dev/null
+++ b/fixture/UpdateDatasetEntriesResponse.proto
diff --git a/gen/Amazonka/LookoutVision.hs b/gen/Amazonka/LookoutVision.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision.hs
@@ -0,0 +1,373 @@
+{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
+{-# OPTIONS_GHC -fno-warn-unused-imports #-}
+
+-- |
+-- Module      : Amazonka.LookoutVision
+-- 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 @2020-11-20@ of the AWS service descriptions, licensed under Apache 2.0.
+--
+-- This is the Amazon Lookout for Vision API Reference. It provides
+-- descriptions of actions, data types, common parameters, and common
+-- errors.
+--
+-- Amazon Lookout for Vision enables you to find visual defects in
+-- industrial products, accurately and at scale. It uses computer vision to
+-- identify missing components in an industrial product, damage to vehicles
+-- or structures, irregularities in production lines, and even minuscule
+-- defects in silicon wafers — or any other physical item where quality is
+-- important such as a missing capacitor on printed circuit boards.
+module Amazonka.LookoutVision
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    -- $errors
+
+    -- ** AccessDeniedException
+    _AccessDeniedException,
+
+    -- ** ConflictException
+    _ConflictException,
+
+    -- ** InternalServerException
+    _InternalServerException,
+
+    -- ** ResourceNotFoundException
+    _ResourceNotFoundException,
+
+    -- ** ServiceQuotaExceededException
+    _ServiceQuotaExceededException,
+
+    -- ** ThrottlingException
+    _ThrottlingException,
+
+    -- ** ValidationException
+    _ValidationException,
+
+    -- * Waiters
+    -- $waiters
+
+    -- * Operations
+    -- $operations
+
+    -- ** CreateDataset
+    CreateDataset (CreateDataset'),
+    newCreateDataset,
+    CreateDatasetResponse (CreateDatasetResponse'),
+    newCreateDatasetResponse,
+
+    -- ** CreateModel
+    CreateModel (CreateModel'),
+    newCreateModel,
+    CreateModelResponse (CreateModelResponse'),
+    newCreateModelResponse,
+
+    -- ** CreateProject
+    CreateProject (CreateProject'),
+    newCreateProject,
+    CreateProjectResponse (CreateProjectResponse'),
+    newCreateProjectResponse,
+
+    -- ** DeleteDataset
+    DeleteDataset (DeleteDataset'),
+    newDeleteDataset,
+    DeleteDatasetResponse (DeleteDatasetResponse'),
+    newDeleteDatasetResponse,
+
+    -- ** DeleteModel
+    DeleteModel (DeleteModel'),
+    newDeleteModel,
+    DeleteModelResponse (DeleteModelResponse'),
+    newDeleteModelResponse,
+
+    -- ** DeleteProject
+    DeleteProject (DeleteProject'),
+    newDeleteProject,
+    DeleteProjectResponse (DeleteProjectResponse'),
+    newDeleteProjectResponse,
+
+    -- ** DescribeDataset
+    DescribeDataset (DescribeDataset'),
+    newDescribeDataset,
+    DescribeDatasetResponse (DescribeDatasetResponse'),
+    newDescribeDatasetResponse,
+
+    -- ** DescribeModel
+    DescribeModel (DescribeModel'),
+    newDescribeModel,
+    DescribeModelResponse (DescribeModelResponse'),
+    newDescribeModelResponse,
+
+    -- ** DescribeModelPackagingJob
+    DescribeModelPackagingJob (DescribeModelPackagingJob'),
+    newDescribeModelPackagingJob,
+    DescribeModelPackagingJobResponse (DescribeModelPackagingJobResponse'),
+    newDescribeModelPackagingJobResponse,
+
+    -- ** DescribeProject
+    DescribeProject (DescribeProject'),
+    newDescribeProject,
+    DescribeProjectResponse (DescribeProjectResponse'),
+    newDescribeProjectResponse,
+
+    -- ** DetectAnomalies
+    DetectAnomalies (DetectAnomalies'),
+    newDetectAnomalies,
+    DetectAnomaliesResponse (DetectAnomaliesResponse'),
+    newDetectAnomaliesResponse,
+
+    -- ** ListDatasetEntries (Paginated)
+    ListDatasetEntries (ListDatasetEntries'),
+    newListDatasetEntries,
+    ListDatasetEntriesResponse (ListDatasetEntriesResponse'),
+    newListDatasetEntriesResponse,
+
+    -- ** ListModelPackagingJobs (Paginated)
+    ListModelPackagingJobs (ListModelPackagingJobs'),
+    newListModelPackagingJobs,
+    ListModelPackagingJobsResponse (ListModelPackagingJobsResponse'),
+    newListModelPackagingJobsResponse,
+
+    -- ** ListModels (Paginated)
+    ListModels (ListModels'),
+    newListModels,
+    ListModelsResponse (ListModelsResponse'),
+    newListModelsResponse,
+
+    -- ** ListProjects (Paginated)
+    ListProjects (ListProjects'),
+    newListProjects,
+    ListProjectsResponse (ListProjectsResponse'),
+    newListProjectsResponse,
+
+    -- ** ListTagsForResource
+    ListTagsForResource (ListTagsForResource'),
+    newListTagsForResource,
+    ListTagsForResourceResponse (ListTagsForResourceResponse'),
+    newListTagsForResourceResponse,
+
+    -- ** StartModel
+    StartModel (StartModel'),
+    newStartModel,
+    StartModelResponse (StartModelResponse'),
+    newStartModelResponse,
+
+    -- ** StartModelPackagingJob
+    StartModelPackagingJob (StartModelPackagingJob'),
+    newStartModelPackagingJob,
+    StartModelPackagingJobResponse (StartModelPackagingJobResponse'),
+    newStartModelPackagingJobResponse,
+
+    -- ** StopModel
+    StopModel (StopModel'),
+    newStopModel,
+    StopModelResponse (StopModelResponse'),
+    newStopModelResponse,
+
+    -- ** TagResource
+    TagResource (TagResource'),
+    newTagResource,
+    TagResourceResponse (TagResourceResponse'),
+    newTagResourceResponse,
+
+    -- ** UntagResource
+    UntagResource (UntagResource'),
+    newUntagResource,
+    UntagResourceResponse (UntagResourceResponse'),
+    newUntagResourceResponse,
+
+    -- ** UpdateDatasetEntries
+    UpdateDatasetEntries (UpdateDatasetEntries'),
+    newUpdateDatasetEntries,
+    UpdateDatasetEntriesResponse (UpdateDatasetEntriesResponse'),
+    newUpdateDatasetEntriesResponse,
+
+    -- * Types
+
+    -- ** DatasetStatus
+    DatasetStatus (..),
+
+    -- ** ModelHostingStatus
+    ModelHostingStatus (..),
+
+    -- ** ModelPackagingJobStatus
+    ModelPackagingJobStatus (..),
+
+    -- ** ModelStatus
+    ModelStatus (..),
+
+    -- ** TargetDevice
+    TargetDevice (..),
+
+    -- ** TargetPlatformAccelerator
+    TargetPlatformAccelerator (..),
+
+    -- ** TargetPlatformArch
+    TargetPlatformArch (..),
+
+    -- ** TargetPlatformOs
+    TargetPlatformOs (..),
+
+    -- ** Anomaly
+    Anomaly (Anomaly'),
+    newAnomaly,
+
+    -- ** DatasetDescription
+    DatasetDescription (DatasetDescription'),
+    newDatasetDescription,
+
+    -- ** DatasetGroundTruthManifest
+    DatasetGroundTruthManifest (DatasetGroundTruthManifest'),
+    newDatasetGroundTruthManifest,
+
+    -- ** DatasetImageStats
+    DatasetImageStats (DatasetImageStats'),
+    newDatasetImageStats,
+
+    -- ** DatasetMetadata
+    DatasetMetadata (DatasetMetadata'),
+    newDatasetMetadata,
+
+    -- ** DatasetSource
+    DatasetSource (DatasetSource'),
+    newDatasetSource,
+
+    -- ** DetectAnomalyResult
+    DetectAnomalyResult (DetectAnomalyResult'),
+    newDetectAnomalyResult,
+
+    -- ** GreengrassConfiguration
+    GreengrassConfiguration (GreengrassConfiguration'),
+    newGreengrassConfiguration,
+
+    -- ** GreengrassOutputDetails
+    GreengrassOutputDetails (GreengrassOutputDetails'),
+    newGreengrassOutputDetails,
+
+    -- ** ImageSource
+    ImageSource (ImageSource'),
+    newImageSource,
+
+    -- ** InputS3Object
+    InputS3Object (InputS3Object'),
+    newInputS3Object,
+
+    -- ** ModelDescription
+    ModelDescription (ModelDescription'),
+    newModelDescription,
+
+    -- ** ModelMetadata
+    ModelMetadata (ModelMetadata'),
+    newModelMetadata,
+
+    -- ** ModelPackagingConfiguration
+    ModelPackagingConfiguration (ModelPackagingConfiguration'),
+    newModelPackagingConfiguration,
+
+    -- ** ModelPackagingDescription
+    ModelPackagingDescription (ModelPackagingDescription'),
+    newModelPackagingDescription,
+
+    -- ** ModelPackagingJobMetadata
+    ModelPackagingJobMetadata (ModelPackagingJobMetadata'),
+    newModelPackagingJobMetadata,
+
+    -- ** ModelPackagingOutputDetails
+    ModelPackagingOutputDetails (ModelPackagingOutputDetails'),
+    newModelPackagingOutputDetails,
+
+    -- ** ModelPerformance
+    ModelPerformance (ModelPerformance'),
+    newModelPerformance,
+
+    -- ** OutputConfig
+    OutputConfig (OutputConfig'),
+    newOutputConfig,
+
+    -- ** OutputS3Object
+    OutputS3Object (OutputS3Object'),
+    newOutputS3Object,
+
+    -- ** PixelAnomaly
+    PixelAnomaly (PixelAnomaly'),
+    newPixelAnomaly,
+
+    -- ** ProjectDescription
+    ProjectDescription (ProjectDescription'),
+    newProjectDescription,
+
+    -- ** ProjectMetadata
+    ProjectMetadata (ProjectMetadata'),
+    newProjectMetadata,
+
+    -- ** S3Location
+    S3Location (S3Location'),
+    newS3Location,
+
+    -- ** Tag
+    Tag (Tag'),
+    newTag,
+
+    -- ** TargetPlatform
+    TargetPlatform (TargetPlatform'),
+    newTargetPlatform,
+  )
+where
+
+import Amazonka.LookoutVision.CreateDataset
+import Amazonka.LookoutVision.CreateModel
+import Amazonka.LookoutVision.CreateProject
+import Amazonka.LookoutVision.DeleteDataset
+import Amazonka.LookoutVision.DeleteModel
+import Amazonka.LookoutVision.DeleteProject
+import Amazonka.LookoutVision.DescribeDataset
+import Amazonka.LookoutVision.DescribeModel
+import Amazonka.LookoutVision.DescribeModelPackagingJob
+import Amazonka.LookoutVision.DescribeProject
+import Amazonka.LookoutVision.DetectAnomalies
+import Amazonka.LookoutVision.Lens
+import Amazonka.LookoutVision.ListDatasetEntries
+import Amazonka.LookoutVision.ListModelPackagingJobs
+import Amazonka.LookoutVision.ListModels
+import Amazonka.LookoutVision.ListProjects
+import Amazonka.LookoutVision.ListTagsForResource
+import Amazonka.LookoutVision.StartModel
+import Amazonka.LookoutVision.StartModelPackagingJob
+import Amazonka.LookoutVision.StopModel
+import Amazonka.LookoutVision.TagResource
+import Amazonka.LookoutVision.Types
+import Amazonka.LookoutVision.UntagResource
+import Amazonka.LookoutVision.UpdateDatasetEntries
+import Amazonka.LookoutVision.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 'LookoutVision'.
+
+-- $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/LookoutVision/CreateDataset.hs b/gen/Amazonka/LookoutVision/CreateDataset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/CreateDataset.hs
@@ -0,0 +1,298 @@
+{-# 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.LookoutVision.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 a new dataset in an Amazon Lookout for Vision project.
+-- @CreateDataset@ can create a training or a test dataset from a valid
+-- dataset source (@DatasetSource@).
+--
+-- If you want a single dataset project, specify @train@ for the value of
+-- @DatasetType@.
+--
+-- To have a project with separate training and test datasets, call
+-- @CreateDataset@ twice. On the first call, specify @train@ for the value
+-- of @DatasetType@. On the second call, specify @test@ for the value of
+-- @DatasetType@.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:CreateDataset@ operation.
+module Amazonka.LookoutVision.CreateDataset
+  ( -- * Creating a Request
+    CreateDataset (..),
+    newCreateDataset,
+
+    -- * Request Lenses
+    createDataset_clientToken,
+    createDataset_datasetSource,
+    createDataset_projectName,
+    createDataset_datasetType,
+
+    -- * Destructuring the Response
+    CreateDatasetResponse (..),
+    newCreateDatasetResponse,
+
+    -- * Response Lenses
+    createDatasetResponse_datasetMetadata,
+    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.LookoutVision.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'
+  { -- | ClientToken is an idempotency token that ensures a call to
+    -- @CreateDataset@ completes only once. You choose the value to pass. For
+    -- example, An issue might prevent you from getting a response from
+    -- @CreateDataset@. In this case, safely retry your call to @CreateDataset@
+    -- by using the same @ClientToken@ parameter value.
+    --
+    -- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+    -- using inserts a value for you. This prevents retries after a network
+    -- error from making multiple dataset creation requests. You\'ll need to
+    -- provide your own value for other use cases.
+    --
+    -- An error occurs if the other input parameters are not the same as in the
+    -- first request. Using a different value for @ClientToken@ is considered a
+    -- new call to @CreateDataset@. An idempotency token is active for 8 hours.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The location of the manifest file that Amazon Lookout for Vision uses to
+    -- create the dataset.
+    --
+    -- If you don\'t specify @DatasetSource@, an empty dataset is created and
+    -- the operation synchronously returns. Later, you can add JSON Lines by
+    -- calling UpdateDatasetEntries.
+    --
+    -- If you specify a value for @DataSource@, the manifest at the S3 location
+    -- is validated and used to create the dataset. The call to @CreateDataset@
+    -- is asynchronous and might take a while to complete. To find out the
+    -- current status, Check the value of @Status@ returned in a call to
+    -- DescribeDataset.
+    datasetSource :: Prelude.Maybe DatasetSource,
+    -- | The name of the project in which you want to create a dataset.
+    projectName :: Prelude.Text,
+    -- | The type of the dataset. Specify @train@ for a training dataset. Specify
+    -- @test@ for a test dataset.
+    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:
+--
+-- 'clientToken', 'createDataset_clientToken' - ClientToken is an idempotency token that ensures a call to
+-- @CreateDataset@ completes only once. You choose the value to pass. For
+-- example, An issue might prevent you from getting a response from
+-- @CreateDataset@. In this case, safely retry your call to @CreateDataset@
+-- by using the same @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple dataset creation requests. You\'ll need to
+-- provide your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @CreateDataset@. An idempotency token is active for 8 hours.
+--
+-- 'datasetSource', 'createDataset_datasetSource' - The location of the manifest file that Amazon Lookout for Vision uses to
+-- create the dataset.
+--
+-- If you don\'t specify @DatasetSource@, an empty dataset is created and
+-- the operation synchronously returns. Later, you can add JSON Lines by
+-- calling UpdateDatasetEntries.
+--
+-- If you specify a value for @DataSource@, the manifest at the S3 location
+-- is validated and used to create the dataset. The call to @CreateDataset@
+-- is asynchronous and might take a while to complete. To find out the
+-- current status, Check the value of @Status@ returned in a call to
+-- DescribeDataset.
+--
+-- 'projectName', 'createDataset_projectName' - The name of the project in which you want to create a dataset.
+--
+-- 'datasetType', 'createDataset_datasetType' - The type of the dataset. Specify @train@ for a training dataset. Specify
+-- @test@ for a test dataset.
+newCreateDataset ::
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'datasetType'
+  Prelude.Text ->
+  CreateDataset
+newCreateDataset pProjectName_ pDatasetType_ =
+  CreateDataset'
+    { clientToken = Prelude.Nothing,
+      datasetSource = Prelude.Nothing,
+      projectName = pProjectName_,
+      datasetType = pDatasetType_
+    }
+
+-- | ClientToken is an idempotency token that ensures a call to
+-- @CreateDataset@ completes only once. You choose the value to pass. For
+-- example, An issue might prevent you from getting a response from
+-- @CreateDataset@. In this case, safely retry your call to @CreateDataset@
+-- by using the same @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple dataset creation requests. You\'ll need to
+-- provide your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @CreateDataset@. An idempotency token is active for 8 hours.
+createDataset_clientToken :: Lens.Lens' CreateDataset (Prelude.Maybe Prelude.Text)
+createDataset_clientToken = Lens.lens (\CreateDataset' {clientToken} -> clientToken) (\s@CreateDataset' {} a -> s {clientToken = a} :: CreateDataset)
+
+-- | The location of the manifest file that Amazon Lookout for Vision uses to
+-- create the dataset.
+--
+-- If you don\'t specify @DatasetSource@, an empty dataset is created and
+-- the operation synchronously returns. Later, you can add JSON Lines by
+-- calling UpdateDatasetEntries.
+--
+-- If you specify a value for @DataSource@, the manifest at the S3 location
+-- is validated and used to create the dataset. The call to @CreateDataset@
+-- is asynchronous and might take a while to complete. To find out the
+-- current status, Check the value of @Status@ returned in a call to
+-- DescribeDataset.
+createDataset_datasetSource :: Lens.Lens' CreateDataset (Prelude.Maybe DatasetSource)
+createDataset_datasetSource = Lens.lens (\CreateDataset' {datasetSource} -> datasetSource) (\s@CreateDataset' {} a -> s {datasetSource = a} :: CreateDataset)
+
+-- | The name of the project in which you want to create a dataset.
+createDataset_projectName :: Lens.Lens' CreateDataset Prelude.Text
+createDataset_projectName = Lens.lens (\CreateDataset' {projectName} -> projectName) (\s@CreateDataset' {} a -> s {projectName = a} :: CreateDataset)
+
+-- | The type of the dataset. Specify @train@ for a training dataset. Specify
+-- @test@ for a test dataset.
+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..?> "DatasetMetadata")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateDataset where
+  hashWithSalt _salt CreateDataset' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` datasetSource
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` datasetType
+
+instance Prelude.NFData CreateDataset where
+  rnf CreateDataset' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf datasetSource
+      `Prelude.seq` Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf datasetType
+
+instance Data.ToHeaders CreateDataset where
+  toHeaders CreateDataset' {..} =
+    Prelude.mconcat
+      [ "X-Amzn-Client-Token" Data.=# clientToken,
+        "Content-Type"
+          Data.=# ("application/x-amz-json-1.1" :: Prelude.ByteString)
+      ]
+
+instance Data.ToJSON CreateDataset where
+  toJSON CreateDataset' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("DatasetSource" Data..=) Prelude.<$> datasetSource,
+            Prelude.Just ("DatasetType" Data..= datasetType)
+          ]
+      )
+
+instance Data.ToPath CreateDataset where
+  toPath CreateDataset' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/datasets"
+      ]
+
+instance Data.ToQuery CreateDataset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateDatasetResponse' smart constructor.
+data CreateDatasetResponse = CreateDatasetResponse'
+  { -- | Information about the dataset.
+    datasetMetadata :: Prelude.Maybe DatasetMetadata,
+    -- | 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:
+--
+-- 'datasetMetadata', 'createDatasetResponse_datasetMetadata' - Information about the dataset.
+--
+-- 'httpStatus', 'createDatasetResponse_httpStatus' - The response's http status code.
+newCreateDatasetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateDatasetResponse
+newCreateDatasetResponse pHttpStatus_ =
+  CreateDatasetResponse'
+    { datasetMetadata =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the dataset.
+createDatasetResponse_datasetMetadata :: Lens.Lens' CreateDatasetResponse (Prelude.Maybe DatasetMetadata)
+createDatasetResponse_datasetMetadata = Lens.lens (\CreateDatasetResponse' {datasetMetadata} -> datasetMetadata) (\s@CreateDatasetResponse' {} a -> s {datasetMetadata = 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 datasetMetadata
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/CreateModel.hs b/gen/Amazonka/LookoutVision/CreateModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/CreateModel.hs
@@ -0,0 +1,301 @@
+{-# 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.LookoutVision.CreateModel
+-- 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 new version of a model within an an Amazon Lookout for Vision
+-- project. @CreateModel@ is an asynchronous operation in which Amazon
+-- Lookout for Vision trains, tests, and evaluates a new version of a
+-- model.
+--
+-- To get the current status, check the @Status@ field returned in the
+-- response from DescribeModel.
+--
+-- If the project has a single dataset, Amazon Lookout for Vision
+-- internally splits the dataset to create a training and a test dataset.
+-- If the project has a training and a test dataset, Lookout for Vision
+-- uses the respective datasets to train and test the model.
+--
+-- After training completes, the evaluation metrics are stored at the
+-- location specified in @OutputConfig@.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:CreateModel@ operation. If you want to tag your model,
+-- you also require permission to the @lookoutvision:TagResource@
+-- operation.
+module Amazonka.LookoutVision.CreateModel
+  ( -- * Creating a Request
+    CreateModel (..),
+    newCreateModel,
+
+    -- * Request Lenses
+    createModel_clientToken,
+    createModel_description,
+    createModel_kmsKeyId,
+    createModel_tags,
+    createModel_projectName,
+    createModel_outputConfig,
+
+    -- * Destructuring the Response
+    CreateModelResponse (..),
+    newCreateModelResponse,
+
+    -- * Response Lenses
+    createModelResponse_modelMetadata,
+    createModelResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateModel' smart constructor.
+data CreateModel = CreateModel'
+  { -- | ClientToken is an idempotency token that ensures a call to @CreateModel@
+    -- completes only once. You choose the value to pass. For example, An issue
+    -- might prevent you from getting a response from @CreateModel@. In this
+    -- case, safely retry your call to @CreateModel@ by using the same
+    -- @ClientToken@ parameter value.
+    --
+    -- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+    -- using inserts a value for you. This prevents retries after a network
+    -- error from starting multiple training jobs. You\'ll need to provide your
+    -- own value for other use cases.
+    --
+    -- An error occurs if the other input parameters are not the same as in the
+    -- first request. Using a different value for @ClientToken@ is considered a
+    -- new call to @CreateModel@. An idempotency token is active for 8 hours.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | A description for the version of the model.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The identifier for your AWS KMS key. The key is used to encrypt training
+    -- and test images copied into the service for model training. Your source
+    -- images are unaffected. If this parameter is not specified, the copied
+    -- images are encrypted by a key that AWS owns and manages.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | A set of tags (key-value pairs) that you want to attach to the model.
+    tags :: Prelude.Maybe [Tag],
+    -- | The name of the project in which you want to create a model version.
+    projectName :: Prelude.Text,
+    -- | The location where Amazon Lookout for Vision saves the training results.
+    outputConfig :: OutputConfig
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateModel' 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:
+--
+-- 'clientToken', 'createModel_clientToken' - ClientToken is an idempotency token that ensures a call to @CreateModel@
+-- completes only once. You choose the value to pass. For example, An issue
+-- might prevent you from getting a response from @CreateModel@. In this
+-- case, safely retry your call to @CreateModel@ by using the same
+-- @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from starting multiple training jobs. You\'ll need to provide your
+-- own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @CreateModel@. An idempotency token is active for 8 hours.
+--
+-- 'description', 'createModel_description' - A description for the version of the model.
+--
+-- 'kmsKeyId', 'createModel_kmsKeyId' - The identifier for your AWS KMS key. The key is used to encrypt training
+-- and test images copied into the service for model training. Your source
+-- images are unaffected. If this parameter is not specified, the copied
+-- images are encrypted by a key that AWS owns and manages.
+--
+-- 'tags', 'createModel_tags' - A set of tags (key-value pairs) that you want to attach to the model.
+--
+-- 'projectName', 'createModel_projectName' - The name of the project in which you want to create a model version.
+--
+-- 'outputConfig', 'createModel_outputConfig' - The location where Amazon Lookout for Vision saves the training results.
+newCreateModel ::
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'outputConfig'
+  OutputConfig ->
+  CreateModel
+newCreateModel pProjectName_ pOutputConfig_ =
+  CreateModel'
+    { clientToken = Prelude.Nothing,
+      description = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing,
+      tags = Prelude.Nothing,
+      projectName = pProjectName_,
+      outputConfig = pOutputConfig_
+    }
+
+-- | ClientToken is an idempotency token that ensures a call to @CreateModel@
+-- completes only once. You choose the value to pass. For example, An issue
+-- might prevent you from getting a response from @CreateModel@. In this
+-- case, safely retry your call to @CreateModel@ by using the same
+-- @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from starting multiple training jobs. You\'ll need to provide your
+-- own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @CreateModel@. An idempotency token is active for 8 hours.
+createModel_clientToken :: Lens.Lens' CreateModel (Prelude.Maybe Prelude.Text)
+createModel_clientToken = Lens.lens (\CreateModel' {clientToken} -> clientToken) (\s@CreateModel' {} a -> s {clientToken = a} :: CreateModel)
+
+-- | A description for the version of the model.
+createModel_description :: Lens.Lens' CreateModel (Prelude.Maybe Prelude.Text)
+createModel_description = Lens.lens (\CreateModel' {description} -> description) (\s@CreateModel' {} a -> s {description = a} :: CreateModel)
+
+-- | The identifier for your AWS KMS key. The key is used to encrypt training
+-- and test images copied into the service for model training. Your source
+-- images are unaffected. If this parameter is not specified, the copied
+-- images are encrypted by a key that AWS owns and manages.
+createModel_kmsKeyId :: Lens.Lens' CreateModel (Prelude.Maybe Prelude.Text)
+createModel_kmsKeyId = Lens.lens (\CreateModel' {kmsKeyId} -> kmsKeyId) (\s@CreateModel' {} a -> s {kmsKeyId = a} :: CreateModel)
+
+-- | A set of tags (key-value pairs) that you want to attach to the model.
+createModel_tags :: Lens.Lens' CreateModel (Prelude.Maybe [Tag])
+createModel_tags = Lens.lens (\CreateModel' {tags} -> tags) (\s@CreateModel' {} a -> s {tags = a} :: CreateModel) Prelude.. Lens.mapping Lens.coerced
+
+-- | The name of the project in which you want to create a model version.
+createModel_projectName :: Lens.Lens' CreateModel Prelude.Text
+createModel_projectName = Lens.lens (\CreateModel' {projectName} -> projectName) (\s@CreateModel' {} a -> s {projectName = a} :: CreateModel)
+
+-- | The location where Amazon Lookout for Vision saves the training results.
+createModel_outputConfig :: Lens.Lens' CreateModel OutputConfig
+createModel_outputConfig = Lens.lens (\CreateModel' {outputConfig} -> outputConfig) (\s@CreateModel' {} a -> s {outputConfig = a} :: CreateModel)
+
+instance Core.AWSRequest CreateModel where
+  type AWSResponse CreateModel = CreateModelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateModelResponse'
+            Prelude.<$> (x Data..?> "ModelMetadata")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateModel where
+  hashWithSalt _salt CreateModel' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` outputConfig
+
+instance Prelude.NFData CreateModel where
+  rnf CreateModel' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf outputConfig
+
+instance Data.ToHeaders CreateModel where
+  toHeaders CreateModel' {..} =
+    Prelude.mconcat
+      [ "X-Amzn-Client-Token" Data.=# clientToken,
+        "Content-Type"
+          Data.=# ("application/x-amz-json-1.1" :: Prelude.ByteString)
+      ]
+
+instance Data.ToJSON CreateModel where
+  toJSON CreateModel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Description" Data..=) Prelude.<$> description,
+            ("KmsKeyId" Data..=) Prelude.<$> kmsKeyId,
+            ("Tags" Data..=) Prelude.<$> tags,
+            Prelude.Just ("OutputConfig" Data..= outputConfig)
+          ]
+      )
+
+instance Data.ToPath CreateModel where
+  toPath CreateModel' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/models"
+      ]
+
+instance Data.ToQuery CreateModel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateModelResponse' smart constructor.
+data CreateModelResponse = CreateModelResponse'
+  { -- | The response from a call to @CreateModel@.
+    modelMetadata :: Prelude.Maybe ModelMetadata,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateModelResponse' 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:
+--
+-- 'modelMetadata', 'createModelResponse_modelMetadata' - The response from a call to @CreateModel@.
+--
+-- 'httpStatus', 'createModelResponse_httpStatus' - The response's http status code.
+newCreateModelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateModelResponse
+newCreateModelResponse pHttpStatus_ =
+  CreateModelResponse'
+    { modelMetadata =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The response from a call to @CreateModel@.
+createModelResponse_modelMetadata :: Lens.Lens' CreateModelResponse (Prelude.Maybe ModelMetadata)
+createModelResponse_modelMetadata = Lens.lens (\CreateModelResponse' {modelMetadata} -> modelMetadata) (\s@CreateModelResponse' {} a -> s {modelMetadata = a} :: CreateModelResponse)
+
+-- | The response's http status code.
+createModelResponse_httpStatus :: Lens.Lens' CreateModelResponse Prelude.Int
+createModelResponse_httpStatus = Lens.lens (\CreateModelResponse' {httpStatus} -> httpStatus) (\s@CreateModelResponse' {} a -> s {httpStatus = a} :: CreateModelResponse)
+
+instance Prelude.NFData CreateModelResponse where
+  rnf CreateModelResponse' {..} =
+    Prelude.rnf modelMetadata
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/CreateProject.hs b/gen/Amazonka/LookoutVision/CreateProject.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/CreateProject.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.LookoutVision.CreateProject
+-- 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 Amazon Lookout for Vision project. After you create the
+-- project, add a dataset by calling CreateDataset.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:CreateProject@ operation.
+module Amazonka.LookoutVision.CreateProject
+  ( -- * Creating a Request
+    CreateProject (..),
+    newCreateProject,
+
+    -- * Request Lenses
+    createProject_clientToken,
+    createProject_projectName,
+
+    -- * Destructuring the Response
+    CreateProjectResponse (..),
+    newCreateProjectResponse,
+
+    -- * Response Lenses
+    createProjectResponse_projectMetadata,
+    createProjectResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newCreateProject' smart constructor.
+data CreateProject = CreateProject'
+  { -- | ClientToken is an idempotency token that ensures a call to
+    -- @CreateProject@ completes only once. You choose the value to pass. For
+    -- example, An issue might prevent you from getting a response from
+    -- @CreateProject@. In this case, safely retry your call to @CreateProject@
+    -- by using the same @ClientToken@ parameter value.
+    --
+    -- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+    -- using inserts a value for you. This prevents retries after a network
+    -- error from making multiple project creation requests. You\'ll need to
+    -- provide your own value for other use cases.
+    --
+    -- An error occurs if the other input parameters are not the same as in the
+    -- first request. Using a different value for @ClientToken@ is considered a
+    -- new call to @CreateProject@. An idempotency token is active for 8 hours.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The name for the project.
+    projectName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateProject' 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:
+--
+-- 'clientToken', 'createProject_clientToken' - ClientToken is an idempotency token that ensures a call to
+-- @CreateProject@ completes only once. You choose the value to pass. For
+-- example, An issue might prevent you from getting a response from
+-- @CreateProject@. In this case, safely retry your call to @CreateProject@
+-- by using the same @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple project creation requests. You\'ll need to
+-- provide your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @CreateProject@. An idempotency token is active for 8 hours.
+--
+-- 'projectName', 'createProject_projectName' - The name for the project.
+newCreateProject ::
+  -- | 'projectName'
+  Prelude.Text ->
+  CreateProject
+newCreateProject pProjectName_ =
+  CreateProject'
+    { clientToken = Prelude.Nothing,
+      projectName = pProjectName_
+    }
+
+-- | ClientToken is an idempotency token that ensures a call to
+-- @CreateProject@ completes only once. You choose the value to pass. For
+-- example, An issue might prevent you from getting a response from
+-- @CreateProject@. In this case, safely retry your call to @CreateProject@
+-- by using the same @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple project creation requests. You\'ll need to
+-- provide your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @CreateProject@. An idempotency token is active for 8 hours.
+createProject_clientToken :: Lens.Lens' CreateProject (Prelude.Maybe Prelude.Text)
+createProject_clientToken = Lens.lens (\CreateProject' {clientToken} -> clientToken) (\s@CreateProject' {} a -> s {clientToken = a} :: CreateProject)
+
+-- | The name for the project.
+createProject_projectName :: Lens.Lens' CreateProject Prelude.Text
+createProject_projectName = Lens.lens (\CreateProject' {projectName} -> projectName) (\s@CreateProject' {} a -> s {projectName = a} :: CreateProject)
+
+instance Core.AWSRequest CreateProject where
+  type
+    AWSResponse CreateProject =
+      CreateProjectResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          CreateProjectResponse'
+            Prelude.<$> (x Data..?> "ProjectMetadata")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable CreateProject where
+  hashWithSalt _salt CreateProject' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` projectName
+
+instance Prelude.NFData CreateProject where
+  rnf CreateProject' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf projectName
+
+instance Data.ToHeaders CreateProject where
+  toHeaders CreateProject' {..} =
+    Prelude.mconcat
+      [ "X-Amzn-Client-Token" Data.=# clientToken,
+        "Content-Type"
+          Data.=# ("application/x-amz-json-1.1" :: Prelude.ByteString)
+      ]
+
+instance Data.ToJSON CreateProject where
+  toJSON CreateProject' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("ProjectName" Data..= projectName)]
+      )
+
+instance Data.ToPath CreateProject where
+  toPath = Prelude.const "/2020-11-20/projects"
+
+instance Data.ToQuery CreateProject where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newCreateProjectResponse' smart constructor.
+data CreateProjectResponse = CreateProjectResponse'
+  { -- | Information about the project.
+    projectMetadata :: Prelude.Maybe ProjectMetadata,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'CreateProjectResponse' 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:
+--
+-- 'projectMetadata', 'createProjectResponse_projectMetadata' - Information about the project.
+--
+-- 'httpStatus', 'createProjectResponse_httpStatus' - The response's http status code.
+newCreateProjectResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  CreateProjectResponse
+newCreateProjectResponse pHttpStatus_ =
+  CreateProjectResponse'
+    { projectMetadata =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Information about the project.
+createProjectResponse_projectMetadata :: Lens.Lens' CreateProjectResponse (Prelude.Maybe ProjectMetadata)
+createProjectResponse_projectMetadata = Lens.lens (\CreateProjectResponse' {projectMetadata} -> projectMetadata) (\s@CreateProjectResponse' {} a -> s {projectMetadata = a} :: CreateProjectResponse)
+
+-- | The response's http status code.
+createProjectResponse_httpStatus :: Lens.Lens' CreateProjectResponse Prelude.Int
+createProjectResponse_httpStatus = Lens.lens (\CreateProjectResponse' {httpStatus} -> httpStatus) (\s@CreateProjectResponse' {} a -> s {httpStatus = a} :: CreateProjectResponse)
+
+instance Prelude.NFData CreateProjectResponse where
+  rnf CreateProjectResponse' {..} =
+    Prelude.rnf projectMetadata
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/DeleteDataset.hs b/gen/Amazonka/LookoutVision/DeleteDataset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/DeleteDataset.hs
@@ -0,0 +1,240 @@
+{-# 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.LookoutVision.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 an existing Amazon Lookout for Vision @dataset@.
+--
+-- If your the project has a single dataset, you must create a new dataset
+-- before you can create a model.
+--
+-- If you project has a training dataset and a test dataset consider the
+-- following.
+--
+-- -   If you delete the test dataset, your project reverts to a single
+--     dataset project. If you then train the model, Amazon Lookout for
+--     Vision internally splits the remaining dataset into a training and
+--     test dataset.
+--
+-- -   If you delete the training dataset, you must create a training
+--     dataset before you can create a model.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:DeleteDataset@ operation.
+module Amazonka.LookoutVision.DeleteDataset
+  ( -- * Creating a Request
+    DeleteDataset (..),
+    newDeleteDataset,
+
+    -- * Request Lenses
+    deleteDataset_clientToken,
+    deleteDataset_projectName,
+    deleteDataset_datasetType,
+
+    -- * Destructuring the Response
+    DeleteDatasetResponse (..),
+    newDeleteDatasetResponse,
+
+    -- * Response Lenses
+    deleteDatasetResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.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'
+  { -- | ClientToken is an idempotency token that ensures a call to
+    -- @DeleteDataset@ completes only once. You choose the value to pass. For
+    -- example, An issue might prevent you from getting a response from
+    -- @DeleteDataset@. In this case, safely retry your call to @DeleteDataset@
+    -- by using the same @ClientToken@ parameter value.
+    --
+    -- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+    -- using inserts a value for you. This prevents retries after a network
+    -- error from making multiple deletetion requests. You\'ll need to provide
+    -- your own value for other use cases.
+    --
+    -- An error occurs if the other input parameters are not the same as in the
+    -- first request. Using a different value for @ClientToken@ is considered a
+    -- new call to @DeleteDataset@. An idempotency token is active for 8 hours.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the project that contains the dataset that you want to
+    -- delete.
+    projectName :: Prelude.Text,
+    -- | The type of the dataset to delete. Specify @train@ to delete the
+    -- training dataset. Specify @test@ to delete the test dataset. To delete
+    -- the dataset in a single dataset project, specify @train@.
+    datasetType :: 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:
+--
+-- 'clientToken', 'deleteDataset_clientToken' - ClientToken is an idempotency token that ensures a call to
+-- @DeleteDataset@ completes only once. You choose the value to pass. For
+-- example, An issue might prevent you from getting a response from
+-- @DeleteDataset@. In this case, safely retry your call to @DeleteDataset@
+-- by using the same @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple deletetion requests. You\'ll need to provide
+-- your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @DeleteDataset@. An idempotency token is active for 8 hours.
+--
+-- 'projectName', 'deleteDataset_projectName' - The name of the project that contains the dataset that you want to
+-- delete.
+--
+-- 'datasetType', 'deleteDataset_datasetType' - The type of the dataset to delete. Specify @train@ to delete the
+-- training dataset. Specify @test@ to delete the test dataset. To delete
+-- the dataset in a single dataset project, specify @train@.
+newDeleteDataset ::
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'datasetType'
+  Prelude.Text ->
+  DeleteDataset
+newDeleteDataset pProjectName_ pDatasetType_ =
+  DeleteDataset'
+    { clientToken = Prelude.Nothing,
+      projectName = pProjectName_,
+      datasetType = pDatasetType_
+    }
+
+-- | ClientToken is an idempotency token that ensures a call to
+-- @DeleteDataset@ completes only once. You choose the value to pass. For
+-- example, An issue might prevent you from getting a response from
+-- @DeleteDataset@. In this case, safely retry your call to @DeleteDataset@
+-- by using the same @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple deletetion requests. You\'ll need to provide
+-- your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @DeleteDataset@. An idempotency token is active for 8 hours.
+deleteDataset_clientToken :: Lens.Lens' DeleteDataset (Prelude.Maybe Prelude.Text)
+deleteDataset_clientToken = Lens.lens (\DeleteDataset' {clientToken} -> clientToken) (\s@DeleteDataset' {} a -> s {clientToken = a} :: DeleteDataset)
+
+-- | The name of the project that contains the dataset that you want to
+-- delete.
+deleteDataset_projectName :: Lens.Lens' DeleteDataset Prelude.Text
+deleteDataset_projectName = Lens.lens (\DeleteDataset' {projectName} -> projectName) (\s@DeleteDataset' {} a -> s {projectName = a} :: DeleteDataset)
+
+-- | The type of the dataset to delete. Specify @train@ to delete the
+-- training dataset. Specify @test@ to delete the test dataset. To delete
+-- the dataset in a single dataset project, specify @train@.
+deleteDataset_datasetType :: Lens.Lens' DeleteDataset Prelude.Text
+deleteDataset_datasetType = Lens.lens (\DeleteDataset' {datasetType} -> datasetType) (\s@DeleteDataset' {} a -> s {datasetType = a} :: DeleteDataset)
+
+instance Core.AWSRequest DeleteDataset where
+  type
+    AWSResponse DeleteDataset =
+      DeleteDatasetResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveEmpty
+      ( \s h x ->
+          DeleteDatasetResponse'
+            Prelude.<$> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteDataset where
+  hashWithSalt _salt DeleteDataset' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` datasetType
+
+instance Prelude.NFData DeleteDataset where
+  rnf DeleteDataset' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf datasetType
+
+instance Data.ToHeaders DeleteDataset where
+  toHeaders DeleteDataset' {..} =
+    Prelude.mconcat
+      [ "X-Amzn-Client-Token" Data.=# clientToken,
+        "Content-Type"
+          Data.=# ("application/x-amz-json-1.1" :: Prelude.ByteString)
+      ]
+
+instance Data.ToPath DeleteDataset where
+  toPath DeleteDataset' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/datasets/",
+        Data.toBS datasetType
+      ]
+
+instance Data.ToQuery DeleteDataset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteDatasetResponse' smart constructor.
+data DeleteDatasetResponse = DeleteDatasetResponse'
+  { -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  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.
+--
+-- The following record fields are available, with the corresponding lenses provided
+-- for backwards compatibility:
+--
+-- 'httpStatus', 'deleteDatasetResponse_httpStatus' - The response's http status code.
+newDeleteDatasetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteDatasetResponse
+newDeleteDatasetResponse pHttpStatus_ =
+  DeleteDatasetResponse' {httpStatus = pHttpStatus_}
+
+-- | The response's http status code.
+deleteDatasetResponse_httpStatus :: Lens.Lens' DeleteDatasetResponse Prelude.Int
+deleteDatasetResponse_httpStatus = Lens.lens (\DeleteDatasetResponse' {httpStatus} -> httpStatus) (\s@DeleteDatasetResponse' {} a -> s {httpStatus = a} :: DeleteDatasetResponse)
+
+instance Prelude.NFData DeleteDatasetResponse where
+  rnf DeleteDatasetResponse' {..} =
+    Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/DeleteModel.hs b/gen/Amazonka/LookoutVision/DeleteModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/DeleteModel.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.LookoutVision.DeleteModel
+-- 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 an Amazon Lookout for Vision model. You can\'t delete a running
+-- model. To stop a running model, use the StopModel operation.
+--
+-- It might take a few seconds to delete a model. To determine if a model
+-- has been deleted, call ListModels and check if the version of the model
+-- (@ModelVersion@) is in the @Models@ array.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:DeleteModel@ operation.
+module Amazonka.LookoutVision.DeleteModel
+  ( -- * Creating a Request
+    DeleteModel (..),
+    newDeleteModel,
+
+    -- * Request Lenses
+    deleteModel_clientToken,
+    deleteModel_projectName,
+    deleteModel_modelVersion,
+
+    -- * Destructuring the Response
+    DeleteModelResponse (..),
+    newDeleteModelResponse,
+
+    -- * Response Lenses
+    deleteModelResponse_modelArn,
+    deleteModelResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteModel' smart constructor.
+data DeleteModel = DeleteModel'
+  { -- | ClientToken is an idempotency token that ensures a call to @DeleteModel@
+    -- completes only once. You choose the value to pass. For example, an issue
+    -- might prevent you from getting a response from @DeleteModel@. In this
+    -- case, safely retry your call to @DeleteModel@ by using the same
+    -- @ClientToken@ parameter value.
+    --
+    -- If you don\'t supply a value for ClientToken, the AWS SDK you are using
+    -- inserts a value for you. This prevents retries after a network error
+    -- from making multiple model deletion requests. You\'ll need to provide
+    -- your own value for other use cases.
+    --
+    -- An error occurs if the other input parameters are not the same as in the
+    -- first request. Using a different value for @ClientToken@ is considered a
+    -- new call to @DeleteModel@. An idempotency token is active for 8 hours.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the project that contains the model that you want to delete.
+    projectName :: Prelude.Text,
+    -- | The version of the model that you want to delete.
+    modelVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteModel' 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:
+--
+-- 'clientToken', 'deleteModel_clientToken' - ClientToken is an idempotency token that ensures a call to @DeleteModel@
+-- completes only once. You choose the value to pass. For example, an issue
+-- might prevent you from getting a response from @DeleteModel@. In this
+-- case, safely retry your call to @DeleteModel@ by using the same
+-- @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for ClientToken, the AWS SDK you are using
+-- inserts a value for you. This prevents retries after a network error
+-- from making multiple model deletion requests. You\'ll need to provide
+-- your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @DeleteModel@. An idempotency token is active for 8 hours.
+--
+-- 'projectName', 'deleteModel_projectName' - The name of the project that contains the model that you want to delete.
+--
+-- 'modelVersion', 'deleteModel_modelVersion' - The version of the model that you want to delete.
+newDeleteModel ::
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'modelVersion'
+  Prelude.Text ->
+  DeleteModel
+newDeleteModel pProjectName_ pModelVersion_ =
+  DeleteModel'
+    { clientToken = Prelude.Nothing,
+      projectName = pProjectName_,
+      modelVersion = pModelVersion_
+    }
+
+-- | ClientToken is an idempotency token that ensures a call to @DeleteModel@
+-- completes only once. You choose the value to pass. For example, an issue
+-- might prevent you from getting a response from @DeleteModel@. In this
+-- case, safely retry your call to @DeleteModel@ by using the same
+-- @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for ClientToken, the AWS SDK you are using
+-- inserts a value for you. This prevents retries after a network error
+-- from making multiple model deletion requests. You\'ll need to provide
+-- your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @DeleteModel@. An idempotency token is active for 8 hours.
+deleteModel_clientToken :: Lens.Lens' DeleteModel (Prelude.Maybe Prelude.Text)
+deleteModel_clientToken = Lens.lens (\DeleteModel' {clientToken} -> clientToken) (\s@DeleteModel' {} a -> s {clientToken = a} :: DeleteModel)
+
+-- | The name of the project that contains the model that you want to delete.
+deleteModel_projectName :: Lens.Lens' DeleteModel Prelude.Text
+deleteModel_projectName = Lens.lens (\DeleteModel' {projectName} -> projectName) (\s@DeleteModel' {} a -> s {projectName = a} :: DeleteModel)
+
+-- | The version of the model that you want to delete.
+deleteModel_modelVersion :: Lens.Lens' DeleteModel Prelude.Text
+deleteModel_modelVersion = Lens.lens (\DeleteModel' {modelVersion} -> modelVersion) (\s@DeleteModel' {} a -> s {modelVersion = a} :: DeleteModel)
+
+instance Core.AWSRequest DeleteModel where
+  type AWSResponse DeleteModel = DeleteModelResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteModelResponse'
+            Prelude.<$> (x Data..?> "ModelArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteModel where
+  hashWithSalt _salt DeleteModel' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` modelVersion
+
+instance Prelude.NFData DeleteModel where
+  rnf DeleteModel' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf modelVersion
+
+instance Data.ToHeaders DeleteModel where
+  toHeaders DeleteModel' {..} =
+    Prelude.mconcat
+      [ "X-Amzn-Client-Token" Data.=# clientToken,
+        "Content-Type"
+          Data.=# ("application/x-amz-json-1.1" :: Prelude.ByteString)
+      ]
+
+instance Data.ToPath DeleteModel where
+  toPath DeleteModel' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/models/",
+        Data.toBS modelVersion
+      ]
+
+instance Data.ToQuery DeleteModel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteModelResponse' smart constructor.
+data DeleteModelResponse = DeleteModelResponse'
+  { -- | The Amazon Resource Name (ARN) of the model that was deleted.
+    modelArn :: 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 'DeleteModelResponse' 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:
+--
+-- 'modelArn', 'deleteModelResponse_modelArn' - The Amazon Resource Name (ARN) of the model that was deleted.
+--
+-- 'httpStatus', 'deleteModelResponse_httpStatus' - The response's http status code.
+newDeleteModelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteModelResponse
+newDeleteModelResponse pHttpStatus_ =
+  DeleteModelResponse'
+    { modelArn = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the model that was deleted.
+deleteModelResponse_modelArn :: Lens.Lens' DeleteModelResponse (Prelude.Maybe Prelude.Text)
+deleteModelResponse_modelArn = Lens.lens (\DeleteModelResponse' {modelArn} -> modelArn) (\s@DeleteModelResponse' {} a -> s {modelArn = a} :: DeleteModelResponse)
+
+-- | The response's http status code.
+deleteModelResponse_httpStatus :: Lens.Lens' DeleteModelResponse Prelude.Int
+deleteModelResponse_httpStatus = Lens.lens (\DeleteModelResponse' {httpStatus} -> httpStatus) (\s@DeleteModelResponse' {} a -> s {httpStatus = a} :: DeleteModelResponse)
+
+instance Prelude.NFData DeleteModelResponse where
+  rnf DeleteModelResponse' {..} =
+    Prelude.rnf modelArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/DeleteProject.hs b/gen/Amazonka/LookoutVision/DeleteProject.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/DeleteProject.hs
@@ -0,0 +1,222 @@
+{-# 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.LookoutVision.DeleteProject
+-- 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 an Amazon Lookout for Vision project.
+--
+-- To delete a project, you must first delete each version of the model
+-- associated with the project. To delete a model use the DeleteModel
+-- operation.
+--
+-- You also have to delete the dataset(s) associated with the model. For
+-- more information, see DeleteDataset. The images referenced by the
+-- training and test datasets aren\'t deleted.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:DeleteProject@ operation.
+module Amazonka.LookoutVision.DeleteProject
+  ( -- * Creating a Request
+    DeleteProject (..),
+    newDeleteProject,
+
+    -- * Request Lenses
+    deleteProject_clientToken,
+    deleteProject_projectName,
+
+    -- * Destructuring the Response
+    DeleteProjectResponse (..),
+    newDeleteProjectResponse,
+
+    -- * Response Lenses
+    deleteProjectResponse_projectArn,
+    deleteProjectResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDeleteProject' smart constructor.
+data DeleteProject = DeleteProject'
+  { -- | ClientToken is an idempotency token that ensures a call to
+    -- @DeleteProject@ completes only once. You choose the value to pass. For
+    -- example, An issue might prevent you from getting a response from
+    -- @DeleteProject@. In this case, safely retry your call to @DeleteProject@
+    -- by using the same @ClientToken@ parameter value.
+    --
+    -- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+    -- using inserts a value for you. This prevents retries after a network
+    -- error from making multiple project deletion requests. You\'ll need to
+    -- provide your own value for other use cases.
+    --
+    -- An error occurs if the other input parameters are not the same as in the
+    -- first request. Using a different value for @ClientToken@ is considered a
+    -- new call to @DeleteProject@. An idempotency token is active for 8 hours.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the project to delete.
+    projectName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DeleteProject' 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:
+--
+-- 'clientToken', 'deleteProject_clientToken' - ClientToken is an idempotency token that ensures a call to
+-- @DeleteProject@ completes only once. You choose the value to pass. For
+-- example, An issue might prevent you from getting a response from
+-- @DeleteProject@. In this case, safely retry your call to @DeleteProject@
+-- by using the same @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple project deletion requests. You\'ll need to
+-- provide your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @DeleteProject@. An idempotency token is active for 8 hours.
+--
+-- 'projectName', 'deleteProject_projectName' - The name of the project to delete.
+newDeleteProject ::
+  -- | 'projectName'
+  Prelude.Text ->
+  DeleteProject
+newDeleteProject pProjectName_ =
+  DeleteProject'
+    { clientToken = Prelude.Nothing,
+      projectName = pProjectName_
+    }
+
+-- | ClientToken is an idempotency token that ensures a call to
+-- @DeleteProject@ completes only once. You choose the value to pass. For
+-- example, An issue might prevent you from getting a response from
+-- @DeleteProject@. In this case, safely retry your call to @DeleteProject@
+-- by using the same @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple project deletion requests. You\'ll need to
+-- provide your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @DeleteProject@. An idempotency token is active for 8 hours.
+deleteProject_clientToken :: Lens.Lens' DeleteProject (Prelude.Maybe Prelude.Text)
+deleteProject_clientToken = Lens.lens (\DeleteProject' {clientToken} -> clientToken) (\s@DeleteProject' {} a -> s {clientToken = a} :: DeleteProject)
+
+-- | The name of the project to delete.
+deleteProject_projectName :: Lens.Lens' DeleteProject Prelude.Text
+deleteProject_projectName = Lens.lens (\DeleteProject' {projectName} -> projectName) (\s@DeleteProject' {} a -> s {projectName = a} :: DeleteProject)
+
+instance Core.AWSRequest DeleteProject where
+  type
+    AWSResponse DeleteProject =
+      DeleteProjectResponse
+  request overrides =
+    Request.delete (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DeleteProjectResponse'
+            Prelude.<$> (x Data..?> "ProjectArn")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DeleteProject where
+  hashWithSalt _salt DeleteProject' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` projectName
+
+instance Prelude.NFData DeleteProject where
+  rnf DeleteProject' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf projectName
+
+instance Data.ToHeaders DeleteProject where
+  toHeaders DeleteProject' {..} =
+    Prelude.mconcat
+      [ "X-Amzn-Client-Token" Data.=# clientToken,
+        "Content-Type"
+          Data.=# ("application/x-amz-json-1.1" :: Prelude.ByteString)
+      ]
+
+instance Data.ToPath DeleteProject where
+  toPath DeleteProject' {..} =
+    Prelude.mconcat
+      ["/2020-11-20/projects/", Data.toBS projectName]
+
+instance Data.ToQuery DeleteProject where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDeleteProjectResponse' smart constructor.
+data DeleteProjectResponse = DeleteProjectResponse'
+  { -- | The Amazon Resource Name (ARN) of the project that was deleted.
+    projectArn :: 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 'DeleteProjectResponse' 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:
+--
+-- 'projectArn', 'deleteProjectResponse_projectArn' - The Amazon Resource Name (ARN) of the project that was deleted.
+--
+-- 'httpStatus', 'deleteProjectResponse_httpStatus' - The response's http status code.
+newDeleteProjectResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DeleteProjectResponse
+newDeleteProjectResponse pHttpStatus_ =
+  DeleteProjectResponse'
+    { projectArn =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The Amazon Resource Name (ARN) of the project that was deleted.
+deleteProjectResponse_projectArn :: Lens.Lens' DeleteProjectResponse (Prelude.Maybe Prelude.Text)
+deleteProjectResponse_projectArn = Lens.lens (\DeleteProjectResponse' {projectArn} -> projectArn) (\s@DeleteProjectResponse' {} a -> s {projectArn = a} :: DeleteProjectResponse)
+
+-- | The response's http status code.
+deleteProjectResponse_httpStatus :: Lens.Lens' DeleteProjectResponse Prelude.Int
+deleteProjectResponse_httpStatus = Lens.lens (\DeleteProjectResponse' {httpStatus} -> httpStatus) (\s@DeleteProjectResponse' {} a -> s {httpStatus = a} :: DeleteProjectResponse)
+
+instance Prelude.NFData DeleteProjectResponse where
+  rnf DeleteProjectResponse' {..} =
+    Prelude.rnf projectArn
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/DescribeDataset.hs b/gen/Amazonka/LookoutVision/DescribeDataset.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/DescribeDataset.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.LookoutVision.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)
+--
+-- Describe an Amazon Lookout for Vision dataset.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:DescribeDataset@ operation.
+module Amazonka.LookoutVision.DescribeDataset
+  ( -- * Creating a Request
+    DescribeDataset (..),
+    newDescribeDataset,
+
+    -- * Request Lenses
+    describeDataset_projectName,
+    describeDataset_datasetType,
+
+    -- * Destructuring the Response
+    DescribeDatasetResponse (..),
+    newDescribeDatasetResponse,
+
+    -- * Response Lenses
+    describeDatasetResponse_datasetDescription,
+    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.LookoutVision.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 name of the project that contains the dataset that you want to
+    -- describe.
+    projectName :: Prelude.Text,
+    -- | The type of the dataset to describe. Specify @train@ to describe the
+    -- training dataset. Specify @test@ to describe the test dataset. If you
+    -- have a single dataset project, specify @train@
+    datasetType :: 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:
+--
+-- 'projectName', 'describeDataset_projectName' - The name of the project that contains the dataset that you want to
+-- describe.
+--
+-- 'datasetType', 'describeDataset_datasetType' - The type of the dataset to describe. Specify @train@ to describe the
+-- training dataset. Specify @test@ to describe the test dataset. If you
+-- have a single dataset project, specify @train@
+newDescribeDataset ::
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'datasetType'
+  Prelude.Text ->
+  DescribeDataset
+newDescribeDataset pProjectName_ pDatasetType_ =
+  DescribeDataset'
+    { projectName = pProjectName_,
+      datasetType = pDatasetType_
+    }
+
+-- | The name of the project that contains the dataset that you want to
+-- describe.
+describeDataset_projectName :: Lens.Lens' DescribeDataset Prelude.Text
+describeDataset_projectName = Lens.lens (\DescribeDataset' {projectName} -> projectName) (\s@DescribeDataset' {} a -> s {projectName = a} :: DescribeDataset)
+
+-- | The type of the dataset to describe. Specify @train@ to describe the
+-- training dataset. Specify @test@ to describe the test dataset. If you
+-- have a single dataset project, specify @train@
+describeDataset_datasetType :: Lens.Lens' DescribeDataset Prelude.Text
+describeDataset_datasetType = Lens.lens (\DescribeDataset' {datasetType} -> datasetType) (\s@DescribeDataset' {} a -> s {datasetType = a} :: DescribeDataset)
+
+instance Core.AWSRequest DescribeDataset where
+  type
+    AWSResponse DescribeDataset =
+      DescribeDatasetResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeDatasetResponse'
+            Prelude.<$> (x Data..?> "DatasetDescription")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeDataset where
+  hashWithSalt _salt DescribeDataset' {..} =
+    _salt
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` datasetType
+
+instance Prelude.NFData DescribeDataset where
+  rnf DescribeDataset' {..} =
+    Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf datasetType
+
+instance Data.ToHeaders DescribeDataset where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeDataset where
+  toPath DescribeDataset' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/datasets/",
+        Data.toBS datasetType
+      ]
+
+instance Data.ToQuery DescribeDataset where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeDatasetResponse' smart constructor.
+data DescribeDatasetResponse = DescribeDatasetResponse'
+  { -- | The description of the requested dataset.
+    datasetDescription :: Prelude.Maybe DatasetDescription,
+    -- | 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:
+--
+-- 'datasetDescription', 'describeDatasetResponse_datasetDescription' - The description of the requested dataset.
+--
+-- 'httpStatus', 'describeDatasetResponse_httpStatus' - The response's http status code.
+newDescribeDatasetResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeDatasetResponse
+newDescribeDatasetResponse pHttpStatus_ =
+  DescribeDatasetResponse'
+    { datasetDescription =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The description of the requested dataset.
+describeDatasetResponse_datasetDescription :: Lens.Lens' DescribeDatasetResponse (Prelude.Maybe DatasetDescription)
+describeDatasetResponse_datasetDescription = Lens.lens (\DescribeDatasetResponse' {datasetDescription} -> datasetDescription) (\s@DescribeDatasetResponse' {} a -> s {datasetDescription = 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 datasetDescription
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/DescribeModel.hs b/gen/Amazonka/LookoutVision/DescribeModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/DescribeModel.hs
@@ -0,0 +1,187 @@
+{-# 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.LookoutVision.DescribeModel
+-- 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 version of an Amazon Lookout for Vision model.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:DescribeModel@ operation.
+module Amazonka.LookoutVision.DescribeModel
+  ( -- * Creating a Request
+    DescribeModel (..),
+    newDescribeModel,
+
+    -- * Request Lenses
+    describeModel_projectName,
+    describeModel_modelVersion,
+
+    -- * Destructuring the Response
+    DescribeModelResponse (..),
+    newDescribeModelResponse,
+
+    -- * Response Lenses
+    describeModelResponse_modelDescription,
+    describeModelResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeModel' smart constructor.
+data DescribeModel = DescribeModel'
+  { -- | The project that contains the version of a model that you want to
+    -- describe.
+    projectName :: Prelude.Text,
+    -- | The version of the model that you want to describe.
+    modelVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeModel' 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:
+--
+-- 'projectName', 'describeModel_projectName' - The project that contains the version of a model that you want to
+-- describe.
+--
+-- 'modelVersion', 'describeModel_modelVersion' - The version of the model that you want to describe.
+newDescribeModel ::
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'modelVersion'
+  Prelude.Text ->
+  DescribeModel
+newDescribeModel pProjectName_ pModelVersion_ =
+  DescribeModel'
+    { projectName = pProjectName_,
+      modelVersion = pModelVersion_
+    }
+
+-- | The project that contains the version of a model that you want to
+-- describe.
+describeModel_projectName :: Lens.Lens' DescribeModel Prelude.Text
+describeModel_projectName = Lens.lens (\DescribeModel' {projectName} -> projectName) (\s@DescribeModel' {} a -> s {projectName = a} :: DescribeModel)
+
+-- | The version of the model that you want to describe.
+describeModel_modelVersion :: Lens.Lens' DescribeModel Prelude.Text
+describeModel_modelVersion = Lens.lens (\DescribeModel' {modelVersion} -> modelVersion) (\s@DescribeModel' {} a -> s {modelVersion = a} :: DescribeModel)
+
+instance Core.AWSRequest DescribeModel where
+  type
+    AWSResponse DescribeModel =
+      DescribeModelResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeModelResponse'
+            Prelude.<$> (x Data..?> "ModelDescription")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeModel where
+  hashWithSalt _salt DescribeModel' {..} =
+    _salt
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` modelVersion
+
+instance Prelude.NFData DescribeModel where
+  rnf DescribeModel' {..} =
+    Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf modelVersion
+
+instance Data.ToHeaders DescribeModel where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeModel where
+  toPath DescribeModel' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/models/",
+        Data.toBS modelVersion
+      ]
+
+instance Data.ToQuery DescribeModel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeModelResponse' smart constructor.
+data DescribeModelResponse = DescribeModelResponse'
+  { -- | Contains the description of the model.
+    modelDescription :: Prelude.Maybe ModelDescription,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeModelResponse' 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:
+--
+-- 'modelDescription', 'describeModelResponse_modelDescription' - Contains the description of the model.
+--
+-- 'httpStatus', 'describeModelResponse_httpStatus' - The response's http status code.
+newDescribeModelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeModelResponse
+newDescribeModelResponse pHttpStatus_ =
+  DescribeModelResponse'
+    { modelDescription =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | Contains the description of the model.
+describeModelResponse_modelDescription :: Lens.Lens' DescribeModelResponse (Prelude.Maybe ModelDescription)
+describeModelResponse_modelDescription = Lens.lens (\DescribeModelResponse' {modelDescription} -> modelDescription) (\s@DescribeModelResponse' {} a -> s {modelDescription = a} :: DescribeModelResponse)
+
+-- | The response's http status code.
+describeModelResponse_httpStatus :: Lens.Lens' DescribeModelResponse Prelude.Int
+describeModelResponse_httpStatus = Lens.lens (\DescribeModelResponse' {httpStatus} -> httpStatus) (\s@DescribeModelResponse' {} a -> s {httpStatus = a} :: DescribeModelResponse)
+
+instance Prelude.NFData DescribeModelResponse where
+  rnf DescribeModelResponse' {..} =
+    Prelude.rnf modelDescription
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/DescribeModelPackagingJob.hs b/gen/Amazonka/LookoutVision/DescribeModelPackagingJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/DescribeModelPackagingJob.hs
@@ -0,0 +1,194 @@
+{-# 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.LookoutVision.DescribeModelPackagingJob
+-- 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 Amazon Lookout for Vision model packaging job.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:DescribeModelPackagingJob@ operation.
+--
+-- For more information, see /Using your Amazon Lookout for Vision model on
+-- an edge device/ in the Amazon Lookout for Vision Developer Guide.
+module Amazonka.LookoutVision.DescribeModelPackagingJob
+  ( -- * Creating a Request
+    DescribeModelPackagingJob (..),
+    newDescribeModelPackagingJob,
+
+    -- * Request Lenses
+    describeModelPackagingJob_projectName,
+    describeModelPackagingJob_jobName,
+
+    -- * Destructuring the Response
+    DescribeModelPackagingJobResponse (..),
+    newDescribeModelPackagingJobResponse,
+
+    -- * Response Lenses
+    describeModelPackagingJobResponse_modelPackagingDescription,
+    describeModelPackagingJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeModelPackagingJob' smart constructor.
+data DescribeModelPackagingJob = DescribeModelPackagingJob'
+  { -- | The name of the project that contains the model packaging job that you
+    -- want to describe.
+    projectName :: Prelude.Text,
+    -- | The job name for the model packaging job.
+    jobName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeModelPackagingJob' 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:
+--
+-- 'projectName', 'describeModelPackagingJob_projectName' - The name of the project that contains the model packaging job that you
+-- want to describe.
+--
+-- 'jobName', 'describeModelPackagingJob_jobName' - The job name for the model packaging job.
+newDescribeModelPackagingJob ::
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'jobName'
+  Prelude.Text ->
+  DescribeModelPackagingJob
+newDescribeModelPackagingJob pProjectName_ pJobName_ =
+  DescribeModelPackagingJob'
+    { projectName =
+        pProjectName_,
+      jobName = pJobName_
+    }
+
+-- | The name of the project that contains the model packaging job that you
+-- want to describe.
+describeModelPackagingJob_projectName :: Lens.Lens' DescribeModelPackagingJob Prelude.Text
+describeModelPackagingJob_projectName = Lens.lens (\DescribeModelPackagingJob' {projectName} -> projectName) (\s@DescribeModelPackagingJob' {} a -> s {projectName = a} :: DescribeModelPackagingJob)
+
+-- | The job name for the model packaging job.
+describeModelPackagingJob_jobName :: Lens.Lens' DescribeModelPackagingJob Prelude.Text
+describeModelPackagingJob_jobName = Lens.lens (\DescribeModelPackagingJob' {jobName} -> jobName) (\s@DescribeModelPackagingJob' {} a -> s {jobName = a} :: DescribeModelPackagingJob)
+
+instance Core.AWSRequest DescribeModelPackagingJob where
+  type
+    AWSResponse DescribeModelPackagingJob =
+      DescribeModelPackagingJobResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeModelPackagingJobResponse'
+            Prelude.<$> (x Data..?> "ModelPackagingDescription")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeModelPackagingJob where
+  hashWithSalt _salt DescribeModelPackagingJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` jobName
+
+instance Prelude.NFData DescribeModelPackagingJob where
+  rnf DescribeModelPackagingJob' {..} =
+    Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf jobName
+
+instance Data.ToHeaders DescribeModelPackagingJob where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeModelPackagingJob where
+  toPath DescribeModelPackagingJob' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/modelpackagingjobs/",
+        Data.toBS jobName
+      ]
+
+instance Data.ToQuery DescribeModelPackagingJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeModelPackagingJobResponse' smart constructor.
+data DescribeModelPackagingJobResponse = DescribeModelPackagingJobResponse'
+  { -- | The description of the model packaging job.
+    modelPackagingDescription :: Prelude.Maybe ModelPackagingDescription,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeModelPackagingJobResponse' 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:
+--
+-- 'modelPackagingDescription', 'describeModelPackagingJobResponse_modelPackagingDescription' - The description of the model packaging job.
+--
+-- 'httpStatus', 'describeModelPackagingJobResponse_httpStatus' - The response's http status code.
+newDescribeModelPackagingJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeModelPackagingJobResponse
+newDescribeModelPackagingJobResponse pHttpStatus_ =
+  DescribeModelPackagingJobResponse'
+    { modelPackagingDescription =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The description of the model packaging job.
+describeModelPackagingJobResponse_modelPackagingDescription :: Lens.Lens' DescribeModelPackagingJobResponse (Prelude.Maybe ModelPackagingDescription)
+describeModelPackagingJobResponse_modelPackagingDescription = Lens.lens (\DescribeModelPackagingJobResponse' {modelPackagingDescription} -> modelPackagingDescription) (\s@DescribeModelPackagingJobResponse' {} a -> s {modelPackagingDescription = a} :: DescribeModelPackagingJobResponse)
+
+-- | The response's http status code.
+describeModelPackagingJobResponse_httpStatus :: Lens.Lens' DescribeModelPackagingJobResponse Prelude.Int
+describeModelPackagingJobResponse_httpStatus = Lens.lens (\DescribeModelPackagingJobResponse' {httpStatus} -> httpStatus) (\s@DescribeModelPackagingJobResponse' {} a -> s {httpStatus = a} :: DescribeModelPackagingJobResponse)
+
+instance
+  Prelude.NFData
+    DescribeModelPackagingJobResponse
+  where
+  rnf DescribeModelPackagingJobResponse' {..} =
+    Prelude.rnf modelPackagingDescription
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/DescribeProject.hs b/gen/Amazonka/LookoutVision/DescribeProject.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/DescribeProject.hs
@@ -0,0 +1,162 @@
+{-# 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.LookoutVision.DescribeProject
+-- 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 Amazon Lookout for Vision project.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:DescribeProject@ operation.
+module Amazonka.LookoutVision.DescribeProject
+  ( -- * Creating a Request
+    DescribeProject (..),
+    newDescribeProject,
+
+    -- * Request Lenses
+    describeProject_projectName,
+
+    -- * Destructuring the Response
+    DescribeProjectResponse (..),
+    newDescribeProjectResponse,
+
+    -- * Response Lenses
+    describeProjectResponse_projectDescription,
+    describeProjectResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDescribeProject' smart constructor.
+data DescribeProject = DescribeProject'
+  { -- | The name of the project that you want to describe.
+    projectName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeProject' 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:
+--
+-- 'projectName', 'describeProject_projectName' - The name of the project that you want to describe.
+newDescribeProject ::
+  -- | 'projectName'
+  Prelude.Text ->
+  DescribeProject
+newDescribeProject pProjectName_ =
+  DescribeProject' {projectName = pProjectName_}
+
+-- | The name of the project that you want to describe.
+describeProject_projectName :: Lens.Lens' DescribeProject Prelude.Text
+describeProject_projectName = Lens.lens (\DescribeProject' {projectName} -> projectName) (\s@DescribeProject' {} a -> s {projectName = a} :: DescribeProject)
+
+instance Core.AWSRequest DescribeProject where
+  type
+    AWSResponse DescribeProject =
+      DescribeProjectResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DescribeProjectResponse'
+            Prelude.<$> (x Data..?> "ProjectDescription")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable DescribeProject where
+  hashWithSalt _salt DescribeProject' {..} =
+    _salt `Prelude.hashWithSalt` projectName
+
+instance Prelude.NFData DescribeProject where
+  rnf DescribeProject' {..} = Prelude.rnf projectName
+
+instance Data.ToHeaders DescribeProject where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath DescribeProject where
+  toPath DescribeProject' {..} =
+    Prelude.mconcat
+      ["/2020-11-20/projects/", Data.toBS projectName]
+
+instance Data.ToQuery DescribeProject where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDescribeProjectResponse' smart constructor.
+data DescribeProjectResponse = DescribeProjectResponse'
+  { -- | The description of the project.
+    projectDescription :: Prelude.Maybe ProjectDescription,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DescribeProjectResponse' 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:
+--
+-- 'projectDescription', 'describeProjectResponse_projectDescription' - The description of the project.
+--
+-- 'httpStatus', 'describeProjectResponse_httpStatus' - The response's http status code.
+newDescribeProjectResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DescribeProjectResponse
+newDescribeProjectResponse pHttpStatus_ =
+  DescribeProjectResponse'
+    { projectDescription =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The description of the project.
+describeProjectResponse_projectDescription :: Lens.Lens' DescribeProjectResponse (Prelude.Maybe ProjectDescription)
+describeProjectResponse_projectDescription = Lens.lens (\DescribeProjectResponse' {projectDescription} -> projectDescription) (\s@DescribeProjectResponse' {} a -> s {projectDescription = a} :: DescribeProjectResponse)
+
+-- | The response's http status code.
+describeProjectResponse_httpStatus :: Lens.Lens' DescribeProjectResponse Prelude.Int
+describeProjectResponse_httpStatus = Lens.lens (\DescribeProjectResponse' {httpStatus} -> httpStatus) (\s@DescribeProjectResponse' {} a -> s {httpStatus = a} :: DescribeProjectResponse)
+
+instance Prelude.NFData DescribeProjectResponse where
+  rnf DescribeProjectResponse' {..} =
+    Prelude.rnf projectDescription
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/DetectAnomalies.hs b/gen/Amazonka/LookoutVision/DetectAnomalies.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/DetectAnomalies.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.LookoutVision.DetectAnomalies
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Detects anomalies in an image that you supply.
+--
+-- The response from @DetectAnomalies@ includes a boolean prediction that
+-- the image contains one or more anomalies and a confidence value for the
+-- prediction. If the model is an image segmentation model, the response
+-- also includes segmentation information for each type of anomaly found in
+-- the image.
+--
+-- Before calling @DetectAnomalies@, you must first start your model with
+-- the StartModel operation. You are charged for the amount of time, in
+-- minutes, that a model runs and for the number of anomaly detection units
+-- that your model uses. If you are not using a model, use the StopModel
+-- operation to stop your model.
+--
+-- For more information, see /Detecting anomalies in an image/ in the
+-- Amazon Lookout for Vision developer guide.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:DetectAnomalies@ operation.
+module Amazonka.LookoutVision.DetectAnomalies
+  ( -- * Creating a Request
+    DetectAnomalies (..),
+    newDetectAnomalies,
+
+    -- * Request Lenses
+    detectAnomalies_projectName,
+    detectAnomalies_modelVersion,
+    detectAnomalies_contentType,
+    detectAnomalies_body,
+
+    -- * Destructuring the Response
+    DetectAnomaliesResponse (..),
+    newDetectAnomaliesResponse,
+
+    -- * Response Lenses
+    detectAnomaliesResponse_detectAnomalyResult,
+    detectAnomaliesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newDetectAnomalies' smart constructor.
+data DetectAnomalies = DetectAnomalies'
+  { -- | The name of the project that contains the model version that you want to
+    -- use.
+    projectName :: Prelude.Text,
+    -- | The version of the model that you want to use.
+    modelVersion :: Prelude.Text,
+    -- | The type of the image passed in @Body@. Valid values are @image\/png@
+    -- (PNG format images) and @image\/jpeg@ (JPG format images).
+    contentType :: Prelude.Text,
+    -- | The unencrypted image bytes that you want to analyze.
+    body :: Data.HashedBody
+  }
+  deriving (Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DetectAnomalies' 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:
+--
+-- 'projectName', 'detectAnomalies_projectName' - The name of the project that contains the model version that you want to
+-- use.
+--
+-- 'modelVersion', 'detectAnomalies_modelVersion' - The version of the model that you want to use.
+--
+-- 'contentType', 'detectAnomalies_contentType' - The type of the image passed in @Body@. Valid values are @image\/png@
+-- (PNG format images) and @image\/jpeg@ (JPG format images).
+--
+-- 'body', 'detectAnomalies_body' - The unencrypted image bytes that you want to analyze.
+newDetectAnomalies ::
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'modelVersion'
+  Prelude.Text ->
+  -- | 'contentType'
+  Prelude.Text ->
+  -- | 'body'
+  Data.HashedBody ->
+  DetectAnomalies
+newDetectAnomalies
+  pProjectName_
+  pModelVersion_
+  pContentType_
+  pBody_ =
+    DetectAnomalies'
+      { projectName = pProjectName_,
+        modelVersion = pModelVersion_,
+        contentType = pContentType_,
+        body = pBody_
+      }
+
+-- | The name of the project that contains the model version that you want to
+-- use.
+detectAnomalies_projectName :: Lens.Lens' DetectAnomalies Prelude.Text
+detectAnomalies_projectName = Lens.lens (\DetectAnomalies' {projectName} -> projectName) (\s@DetectAnomalies' {} a -> s {projectName = a} :: DetectAnomalies)
+
+-- | The version of the model that you want to use.
+detectAnomalies_modelVersion :: Lens.Lens' DetectAnomalies Prelude.Text
+detectAnomalies_modelVersion = Lens.lens (\DetectAnomalies' {modelVersion} -> modelVersion) (\s@DetectAnomalies' {} a -> s {modelVersion = a} :: DetectAnomalies)
+
+-- | The type of the image passed in @Body@. Valid values are @image\/png@
+-- (PNG format images) and @image\/jpeg@ (JPG format images).
+detectAnomalies_contentType :: Lens.Lens' DetectAnomalies Prelude.Text
+detectAnomalies_contentType = Lens.lens (\DetectAnomalies' {contentType} -> contentType) (\s@DetectAnomalies' {} a -> s {contentType = a} :: DetectAnomalies)
+
+-- | The unencrypted image bytes that you want to analyze.
+detectAnomalies_body :: Lens.Lens' DetectAnomalies Data.HashedBody
+detectAnomalies_body = Lens.lens (\DetectAnomalies' {body} -> body) (\s@DetectAnomalies' {} a -> s {body = a} :: DetectAnomalies)
+
+instance Core.AWSRequest DetectAnomalies where
+  type
+    AWSResponse DetectAnomalies =
+      DetectAnomaliesResponse
+  request overrides =
+    Request.postBody (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          DetectAnomaliesResponse'
+            Prelude.<$> (x Data..?> "DetectAnomalyResult")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Data.ToBody DetectAnomalies where
+  toBody DetectAnomalies' {..} = Data.toBody body
+
+instance Data.ToHeaders DetectAnomalies where
+  toHeaders DetectAnomalies' {..} =
+    Prelude.mconcat
+      ["Content-Type" Data.=# contentType]
+
+instance Data.ToPath DetectAnomalies where
+  toPath DetectAnomalies' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/models/",
+        Data.toBS modelVersion,
+        "/detect"
+      ]
+
+instance Data.ToQuery DetectAnomalies where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newDetectAnomaliesResponse' smart constructor.
+data DetectAnomaliesResponse = DetectAnomaliesResponse'
+  { -- | The results of the @DetectAnomalies@ operation.
+    detectAnomalyResult :: Prelude.Maybe DetectAnomalyResult,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DetectAnomaliesResponse' 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:
+--
+-- 'detectAnomalyResult', 'detectAnomaliesResponse_detectAnomalyResult' - The results of the @DetectAnomalies@ operation.
+--
+-- 'httpStatus', 'detectAnomaliesResponse_httpStatus' - The response's http status code.
+newDetectAnomaliesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  DetectAnomaliesResponse
+newDetectAnomaliesResponse pHttpStatus_ =
+  DetectAnomaliesResponse'
+    { detectAnomalyResult =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The results of the @DetectAnomalies@ operation.
+detectAnomaliesResponse_detectAnomalyResult :: Lens.Lens' DetectAnomaliesResponse (Prelude.Maybe DetectAnomalyResult)
+detectAnomaliesResponse_detectAnomalyResult = Lens.lens (\DetectAnomaliesResponse' {detectAnomalyResult} -> detectAnomalyResult) (\s@DetectAnomaliesResponse' {} a -> s {detectAnomalyResult = a} :: DetectAnomaliesResponse)
+
+-- | The response's http status code.
+detectAnomaliesResponse_httpStatus :: Lens.Lens' DetectAnomaliesResponse Prelude.Int
+detectAnomaliesResponse_httpStatus = Lens.lens (\DetectAnomaliesResponse' {httpStatus} -> httpStatus) (\s@DetectAnomaliesResponse' {} a -> s {httpStatus = a} :: DetectAnomaliesResponse)
+
+instance Prelude.NFData DetectAnomaliesResponse where
+  rnf DetectAnomaliesResponse' {..} =
+    Prelude.rnf detectAnomalyResult
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/Lens.hs b/gen/Amazonka/LookoutVision/Lens.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Lens.hs
@@ -0,0 +1,384 @@
+{-# 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.LookoutVision.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.LookoutVision.Lens
+  ( -- * Operations
+
+    -- ** CreateDataset
+    createDataset_clientToken,
+    createDataset_datasetSource,
+    createDataset_projectName,
+    createDataset_datasetType,
+    createDatasetResponse_datasetMetadata,
+    createDatasetResponse_httpStatus,
+
+    -- ** CreateModel
+    createModel_clientToken,
+    createModel_description,
+    createModel_kmsKeyId,
+    createModel_tags,
+    createModel_projectName,
+    createModel_outputConfig,
+    createModelResponse_modelMetadata,
+    createModelResponse_httpStatus,
+
+    -- ** CreateProject
+    createProject_clientToken,
+    createProject_projectName,
+    createProjectResponse_projectMetadata,
+    createProjectResponse_httpStatus,
+
+    -- ** DeleteDataset
+    deleteDataset_clientToken,
+    deleteDataset_projectName,
+    deleteDataset_datasetType,
+    deleteDatasetResponse_httpStatus,
+
+    -- ** DeleteModel
+    deleteModel_clientToken,
+    deleteModel_projectName,
+    deleteModel_modelVersion,
+    deleteModelResponse_modelArn,
+    deleteModelResponse_httpStatus,
+
+    -- ** DeleteProject
+    deleteProject_clientToken,
+    deleteProject_projectName,
+    deleteProjectResponse_projectArn,
+    deleteProjectResponse_httpStatus,
+
+    -- ** DescribeDataset
+    describeDataset_projectName,
+    describeDataset_datasetType,
+    describeDatasetResponse_datasetDescription,
+    describeDatasetResponse_httpStatus,
+
+    -- ** DescribeModel
+    describeModel_projectName,
+    describeModel_modelVersion,
+    describeModelResponse_modelDescription,
+    describeModelResponse_httpStatus,
+
+    -- ** DescribeModelPackagingJob
+    describeModelPackagingJob_projectName,
+    describeModelPackagingJob_jobName,
+    describeModelPackagingJobResponse_modelPackagingDescription,
+    describeModelPackagingJobResponse_httpStatus,
+
+    -- ** DescribeProject
+    describeProject_projectName,
+    describeProjectResponse_projectDescription,
+    describeProjectResponse_httpStatus,
+
+    -- ** DetectAnomalies
+    detectAnomalies_projectName,
+    detectAnomalies_modelVersion,
+    detectAnomalies_contentType,
+    detectAnomalies_body,
+    detectAnomaliesResponse_detectAnomalyResult,
+    detectAnomaliesResponse_httpStatus,
+
+    -- ** ListDatasetEntries
+    listDatasetEntries_afterCreationDate,
+    listDatasetEntries_anomalyClass,
+    listDatasetEntries_beforeCreationDate,
+    listDatasetEntries_labeled,
+    listDatasetEntries_maxResults,
+    listDatasetEntries_nextToken,
+    listDatasetEntries_sourceRefContains,
+    listDatasetEntries_projectName,
+    listDatasetEntries_datasetType,
+    listDatasetEntriesResponse_datasetEntries,
+    listDatasetEntriesResponse_nextToken,
+    listDatasetEntriesResponse_httpStatus,
+
+    -- ** ListModelPackagingJobs
+    listModelPackagingJobs_maxResults,
+    listModelPackagingJobs_nextToken,
+    listModelPackagingJobs_projectName,
+    listModelPackagingJobsResponse_modelPackagingJobs,
+    listModelPackagingJobsResponse_nextToken,
+    listModelPackagingJobsResponse_httpStatus,
+
+    -- ** ListModels
+    listModels_maxResults,
+    listModels_nextToken,
+    listModels_projectName,
+    listModelsResponse_models,
+    listModelsResponse_nextToken,
+    listModelsResponse_httpStatus,
+
+    -- ** ListProjects
+    listProjects_maxResults,
+    listProjects_nextToken,
+    listProjectsResponse_nextToken,
+    listProjectsResponse_projects,
+    listProjectsResponse_httpStatus,
+
+    -- ** ListTagsForResource
+    listTagsForResource_resourceArn,
+    listTagsForResourceResponse_tags,
+    listTagsForResourceResponse_httpStatus,
+
+    -- ** StartModel
+    startModel_clientToken,
+    startModel_maxInferenceUnits,
+    startModel_projectName,
+    startModel_modelVersion,
+    startModel_minInferenceUnits,
+    startModelResponse_status,
+    startModelResponse_httpStatus,
+
+    -- ** StartModelPackagingJob
+    startModelPackagingJob_clientToken,
+    startModelPackagingJob_description,
+    startModelPackagingJob_jobName,
+    startModelPackagingJob_projectName,
+    startModelPackagingJob_modelVersion,
+    startModelPackagingJob_configuration,
+    startModelPackagingJobResponse_jobName,
+    startModelPackagingJobResponse_httpStatus,
+
+    -- ** StopModel
+    stopModel_clientToken,
+    stopModel_projectName,
+    stopModel_modelVersion,
+    stopModelResponse_status,
+    stopModelResponse_httpStatus,
+
+    -- ** TagResource
+    tagResource_resourceArn,
+    tagResource_tags,
+    tagResourceResponse_httpStatus,
+
+    -- ** UntagResource
+    untagResource_resourceArn,
+    untagResource_tagKeys,
+    untagResourceResponse_httpStatus,
+
+    -- ** UpdateDatasetEntries
+    updateDatasetEntries_clientToken,
+    updateDatasetEntries_projectName,
+    updateDatasetEntries_datasetType,
+    updateDatasetEntries_changes,
+    updateDatasetEntriesResponse_status,
+    updateDatasetEntriesResponse_httpStatus,
+
+    -- * Types
+
+    -- ** Anomaly
+    anomaly_name,
+    anomaly_pixelAnomaly,
+
+    -- ** DatasetDescription
+    datasetDescription_creationTimestamp,
+    datasetDescription_datasetType,
+    datasetDescription_imageStats,
+    datasetDescription_lastUpdatedTimestamp,
+    datasetDescription_projectName,
+    datasetDescription_status,
+    datasetDescription_statusMessage,
+
+    -- ** DatasetGroundTruthManifest
+    datasetGroundTruthManifest_s3Object,
+
+    -- ** DatasetImageStats
+    datasetImageStats_anomaly,
+    datasetImageStats_labeled,
+    datasetImageStats_normal,
+    datasetImageStats_total,
+
+    -- ** DatasetMetadata
+    datasetMetadata_creationTimestamp,
+    datasetMetadata_datasetType,
+    datasetMetadata_status,
+    datasetMetadata_statusMessage,
+
+    -- ** DatasetSource
+    datasetSource_groundTruthManifest,
+
+    -- ** DetectAnomalyResult
+    detectAnomalyResult_anomalies,
+    detectAnomalyResult_anomalyMask,
+    detectAnomalyResult_confidence,
+    detectAnomalyResult_isAnomalous,
+    detectAnomalyResult_source,
+
+    -- ** GreengrassConfiguration
+    greengrassConfiguration_compilerOptions,
+    greengrassConfiguration_componentDescription,
+    greengrassConfiguration_componentVersion,
+    greengrassConfiguration_tags,
+    greengrassConfiguration_targetDevice,
+    greengrassConfiguration_targetPlatform,
+    greengrassConfiguration_s3OutputLocation,
+    greengrassConfiguration_componentName,
+
+    -- ** GreengrassOutputDetails
+    greengrassOutputDetails_componentName,
+    greengrassOutputDetails_componentVersion,
+    greengrassOutputDetails_componentVersionArn,
+
+    -- ** ImageSource
+    imageSource_type,
+
+    -- ** InputS3Object
+    inputS3Object_versionId,
+    inputS3Object_bucket,
+    inputS3Object_key,
+
+    -- ** ModelDescription
+    modelDescription_creationTimestamp,
+    modelDescription_description,
+    modelDescription_evaluationEndTimestamp,
+    modelDescription_evaluationManifest,
+    modelDescription_evaluationResult,
+    modelDescription_kmsKeyId,
+    modelDescription_maxInferenceUnits,
+    modelDescription_minInferenceUnits,
+    modelDescription_modelArn,
+    modelDescription_modelVersion,
+    modelDescription_outputConfig,
+    modelDescription_performance,
+    modelDescription_status,
+    modelDescription_statusMessage,
+
+    -- ** ModelMetadata
+    modelMetadata_creationTimestamp,
+    modelMetadata_description,
+    modelMetadata_modelArn,
+    modelMetadata_modelVersion,
+    modelMetadata_performance,
+    modelMetadata_status,
+    modelMetadata_statusMessage,
+
+    -- ** ModelPackagingConfiguration
+    modelPackagingConfiguration_greengrass,
+
+    -- ** ModelPackagingDescription
+    modelPackagingDescription_creationTimestamp,
+    modelPackagingDescription_jobName,
+    modelPackagingDescription_lastUpdatedTimestamp,
+    modelPackagingDescription_modelPackagingConfiguration,
+    modelPackagingDescription_modelPackagingJobDescription,
+    modelPackagingDescription_modelPackagingMethod,
+    modelPackagingDescription_modelPackagingOutputDetails,
+    modelPackagingDescription_modelVersion,
+    modelPackagingDescription_projectName,
+    modelPackagingDescription_status,
+    modelPackagingDescription_statusMessage,
+
+    -- ** ModelPackagingJobMetadata
+    modelPackagingJobMetadata_creationTimestamp,
+    modelPackagingJobMetadata_jobName,
+    modelPackagingJobMetadata_lastUpdatedTimestamp,
+    modelPackagingJobMetadata_modelPackagingJobDescription,
+    modelPackagingJobMetadata_modelPackagingMethod,
+    modelPackagingJobMetadata_modelVersion,
+    modelPackagingJobMetadata_projectName,
+    modelPackagingJobMetadata_status,
+    modelPackagingJobMetadata_statusMessage,
+
+    -- ** ModelPackagingOutputDetails
+    modelPackagingOutputDetails_greengrass,
+
+    -- ** ModelPerformance
+    modelPerformance_f1Score,
+    modelPerformance_precision,
+    modelPerformance_recall,
+
+    -- ** OutputConfig
+    outputConfig_s3Location,
+
+    -- ** OutputS3Object
+    outputS3Object_bucket,
+    outputS3Object_key,
+
+    -- ** PixelAnomaly
+    pixelAnomaly_color,
+    pixelAnomaly_totalPercentageArea,
+
+    -- ** ProjectDescription
+    projectDescription_creationTimestamp,
+    projectDescription_datasets,
+    projectDescription_projectArn,
+    projectDescription_projectName,
+
+    -- ** ProjectMetadata
+    projectMetadata_creationTimestamp,
+    projectMetadata_projectArn,
+    projectMetadata_projectName,
+
+    -- ** S3Location
+    s3Location_prefix,
+    s3Location_bucket,
+
+    -- ** Tag
+    tag_key,
+    tag_value,
+
+    -- ** TargetPlatform
+    targetPlatform_accelerator,
+    targetPlatform_os,
+    targetPlatform_arch,
+  )
+where
+
+import Amazonka.LookoutVision.CreateDataset
+import Amazonka.LookoutVision.CreateModel
+import Amazonka.LookoutVision.CreateProject
+import Amazonka.LookoutVision.DeleteDataset
+import Amazonka.LookoutVision.DeleteModel
+import Amazonka.LookoutVision.DeleteProject
+import Amazonka.LookoutVision.DescribeDataset
+import Amazonka.LookoutVision.DescribeModel
+import Amazonka.LookoutVision.DescribeModelPackagingJob
+import Amazonka.LookoutVision.DescribeProject
+import Amazonka.LookoutVision.DetectAnomalies
+import Amazonka.LookoutVision.ListDatasetEntries
+import Amazonka.LookoutVision.ListModelPackagingJobs
+import Amazonka.LookoutVision.ListModels
+import Amazonka.LookoutVision.ListProjects
+import Amazonka.LookoutVision.ListTagsForResource
+import Amazonka.LookoutVision.StartModel
+import Amazonka.LookoutVision.StartModelPackagingJob
+import Amazonka.LookoutVision.StopModel
+import Amazonka.LookoutVision.TagResource
+import Amazonka.LookoutVision.Types.Anomaly
+import Amazonka.LookoutVision.Types.DatasetDescription
+import Amazonka.LookoutVision.Types.DatasetGroundTruthManifest
+import Amazonka.LookoutVision.Types.DatasetImageStats
+import Amazonka.LookoutVision.Types.DatasetMetadata
+import Amazonka.LookoutVision.Types.DatasetSource
+import Amazonka.LookoutVision.Types.DetectAnomalyResult
+import Amazonka.LookoutVision.Types.GreengrassConfiguration
+import Amazonka.LookoutVision.Types.GreengrassOutputDetails
+import Amazonka.LookoutVision.Types.ImageSource
+import Amazonka.LookoutVision.Types.InputS3Object
+import Amazonka.LookoutVision.Types.ModelDescription
+import Amazonka.LookoutVision.Types.ModelMetadata
+import Amazonka.LookoutVision.Types.ModelPackagingConfiguration
+import Amazonka.LookoutVision.Types.ModelPackagingDescription
+import Amazonka.LookoutVision.Types.ModelPackagingJobMetadata
+import Amazonka.LookoutVision.Types.ModelPackagingOutputDetails
+import Amazonka.LookoutVision.Types.ModelPerformance
+import Amazonka.LookoutVision.Types.OutputConfig
+import Amazonka.LookoutVision.Types.OutputS3Object
+import Amazonka.LookoutVision.Types.PixelAnomaly
+import Amazonka.LookoutVision.Types.ProjectDescription
+import Amazonka.LookoutVision.Types.ProjectMetadata
+import Amazonka.LookoutVision.Types.S3Location
+import Amazonka.LookoutVision.Types.Tag
+import Amazonka.LookoutVision.Types.TargetPlatform
+import Amazonka.LookoutVision.UntagResource
+import Amazonka.LookoutVision.UpdateDatasetEntries
diff --git a/gen/Amazonka/LookoutVision/ListDatasetEntries.hs b/gen/Amazonka/LookoutVision/ListDatasetEntries.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/ListDatasetEntries.hs
@@ -0,0 +1,365 @@
+{-# 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.LookoutVision.ListDatasetEntries
+-- 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 JSON Lines within a dataset. An Amazon Lookout for Vision JSON
+-- Line contains the anomaly information for a single image, including the
+-- image location and the assigned label.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:ListDatasetEntries@ operation.
+--
+-- This operation returns paginated results.
+module Amazonka.LookoutVision.ListDatasetEntries
+  ( -- * Creating a Request
+    ListDatasetEntries (..),
+    newListDatasetEntries,
+
+    -- * Request Lenses
+    listDatasetEntries_afterCreationDate,
+    listDatasetEntries_anomalyClass,
+    listDatasetEntries_beforeCreationDate,
+    listDatasetEntries_labeled,
+    listDatasetEntries_maxResults,
+    listDatasetEntries_nextToken,
+    listDatasetEntries_sourceRefContains,
+    listDatasetEntries_projectName,
+    listDatasetEntries_datasetType,
+
+    -- * Destructuring the Response
+    ListDatasetEntriesResponse (..),
+    newListDatasetEntriesResponse,
+
+    -- * Response Lenses
+    listDatasetEntriesResponse_datasetEntries,
+    listDatasetEntriesResponse_nextToken,
+    listDatasetEntriesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListDatasetEntries' smart constructor.
+data ListDatasetEntries = ListDatasetEntries'
+  { -- | Only includes entries after the specified date in the response. For
+    -- example, @2020-06-23T00:00:00@.
+    afterCreationDate :: Prelude.Maybe Data.POSIX,
+    -- | Specify @normal@ to include only normal images. Specify @anomaly@ to
+    -- only include anomalous entries. If you don\'t specify a value, Amazon
+    -- Lookout for Vision returns normal and anomalous images.
+    anomalyClass :: Prelude.Maybe Prelude.Text,
+    -- | Only includes entries before the specified date in the response. For
+    -- example, @2020-06-23T00:00:00@.
+    beforeCreationDate :: Prelude.Maybe Data.POSIX,
+    -- | Specify @true@ to include labeled entries, otherwise specify @false@. If
+    -- you don\'t specify a value, Lookout for Vision returns all entries.
+    labeled :: Prelude.Maybe Prelude.Bool,
+    -- | The maximum number of results to return per paginated call. The largest
+    -- value you can specify is 100. If you specify a value greater than 100, a
+    -- ValidationException error occurs. The default value is 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If the previous response was incomplete (because there is more data to
+    -- retrieve), Amazon Lookout for Vision returns a pagination token in the
+    -- response. You can use this pagination token to retrieve the next set of
+    -- dataset entries.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | Perform a \"contains\" search on the values of the @source-ref@ key
+    -- within the dataset. For example a value of \"IMG_17\" returns all JSON
+    -- Lines where the @source-ref@ key value matches /*IMG_17*/.
+    sourceRefContains :: Prelude.Maybe Prelude.Text,
+    -- | The name of the project that contains the dataset that you want to list.
+    projectName :: Prelude.Text,
+    -- | The type of the dataset that you want to list. Specify @train@ to list
+    -- the training dataset. Specify @test@ to list the test dataset. If you
+    -- have a single dataset project, specify @train@.
+    datasetType :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListDatasetEntries' 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:
+--
+-- 'afterCreationDate', 'listDatasetEntries_afterCreationDate' - Only includes entries after the specified date in the response. For
+-- example, @2020-06-23T00:00:00@.
+--
+-- 'anomalyClass', 'listDatasetEntries_anomalyClass' - Specify @normal@ to include only normal images. Specify @anomaly@ to
+-- only include anomalous entries. If you don\'t specify a value, Amazon
+-- Lookout for Vision returns normal and anomalous images.
+--
+-- 'beforeCreationDate', 'listDatasetEntries_beforeCreationDate' - Only includes entries before the specified date in the response. For
+-- example, @2020-06-23T00:00:00@.
+--
+-- 'labeled', 'listDatasetEntries_labeled' - Specify @true@ to include labeled entries, otherwise specify @false@. If
+-- you don\'t specify a value, Lookout for Vision returns all entries.
+--
+-- 'maxResults', 'listDatasetEntries_maxResults' - The maximum number of results to return per paginated call. The largest
+-- value you can specify is 100. If you specify a value greater than 100, a
+-- ValidationException error occurs. The default value is 100.
+--
+-- 'nextToken', 'listDatasetEntries_nextToken' - If the previous response was incomplete (because there is more data to
+-- retrieve), Amazon Lookout for Vision returns a pagination token in the
+-- response. You can use this pagination token to retrieve the next set of
+-- dataset entries.
+--
+-- 'sourceRefContains', 'listDatasetEntries_sourceRefContains' - Perform a \"contains\" search on the values of the @source-ref@ key
+-- within the dataset. For example a value of \"IMG_17\" returns all JSON
+-- Lines where the @source-ref@ key value matches /*IMG_17*/.
+--
+-- 'projectName', 'listDatasetEntries_projectName' - The name of the project that contains the dataset that you want to list.
+--
+-- 'datasetType', 'listDatasetEntries_datasetType' - The type of the dataset that you want to list. Specify @train@ to list
+-- the training dataset. Specify @test@ to list the test dataset. If you
+-- have a single dataset project, specify @train@.
+newListDatasetEntries ::
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'datasetType'
+  Prelude.Text ->
+  ListDatasetEntries
+newListDatasetEntries pProjectName_ pDatasetType_ =
+  ListDatasetEntries'
+    { afterCreationDate =
+        Prelude.Nothing,
+      anomalyClass = Prelude.Nothing,
+      beforeCreationDate = Prelude.Nothing,
+      labeled = Prelude.Nothing,
+      maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      sourceRefContains = Prelude.Nothing,
+      projectName = pProjectName_,
+      datasetType = pDatasetType_
+    }
+
+-- | Only includes entries after the specified date in the response. For
+-- example, @2020-06-23T00:00:00@.
+listDatasetEntries_afterCreationDate :: Lens.Lens' ListDatasetEntries (Prelude.Maybe Prelude.UTCTime)
+listDatasetEntries_afterCreationDate = Lens.lens (\ListDatasetEntries' {afterCreationDate} -> afterCreationDate) (\s@ListDatasetEntries' {} a -> s {afterCreationDate = a} :: ListDatasetEntries) Prelude.. Lens.mapping Data._Time
+
+-- | Specify @normal@ to include only normal images. Specify @anomaly@ to
+-- only include anomalous entries. If you don\'t specify a value, Amazon
+-- Lookout for Vision returns normal and anomalous images.
+listDatasetEntries_anomalyClass :: Lens.Lens' ListDatasetEntries (Prelude.Maybe Prelude.Text)
+listDatasetEntries_anomalyClass = Lens.lens (\ListDatasetEntries' {anomalyClass} -> anomalyClass) (\s@ListDatasetEntries' {} a -> s {anomalyClass = a} :: ListDatasetEntries)
+
+-- | Only includes entries before the specified date in the response. For
+-- example, @2020-06-23T00:00:00@.
+listDatasetEntries_beforeCreationDate :: Lens.Lens' ListDatasetEntries (Prelude.Maybe Prelude.UTCTime)
+listDatasetEntries_beforeCreationDate = Lens.lens (\ListDatasetEntries' {beforeCreationDate} -> beforeCreationDate) (\s@ListDatasetEntries' {} a -> s {beforeCreationDate = a} :: ListDatasetEntries) Prelude.. Lens.mapping Data._Time
+
+-- | Specify @true@ to include labeled entries, otherwise specify @false@. If
+-- you don\'t specify a value, Lookout for Vision returns all entries.
+listDatasetEntries_labeled :: Lens.Lens' ListDatasetEntries (Prelude.Maybe Prelude.Bool)
+listDatasetEntries_labeled = Lens.lens (\ListDatasetEntries' {labeled} -> labeled) (\s@ListDatasetEntries' {} a -> s {labeled = a} :: ListDatasetEntries)
+
+-- | The maximum number of results to return per paginated call. The largest
+-- value you can specify is 100. If you specify a value greater than 100, a
+-- ValidationException error occurs. The default value is 100.
+listDatasetEntries_maxResults :: Lens.Lens' ListDatasetEntries (Prelude.Maybe Prelude.Natural)
+listDatasetEntries_maxResults = Lens.lens (\ListDatasetEntries' {maxResults} -> maxResults) (\s@ListDatasetEntries' {} a -> s {maxResults = a} :: ListDatasetEntries)
+
+-- | If the previous response was incomplete (because there is more data to
+-- retrieve), Amazon Lookout for Vision returns a pagination token in the
+-- response. You can use this pagination token to retrieve the next set of
+-- dataset entries.
+listDatasetEntries_nextToken :: Lens.Lens' ListDatasetEntries (Prelude.Maybe Prelude.Text)
+listDatasetEntries_nextToken = Lens.lens (\ListDatasetEntries' {nextToken} -> nextToken) (\s@ListDatasetEntries' {} a -> s {nextToken = a} :: ListDatasetEntries)
+
+-- | Perform a \"contains\" search on the values of the @source-ref@ key
+-- within the dataset. For example a value of \"IMG_17\" returns all JSON
+-- Lines where the @source-ref@ key value matches /*IMG_17*/.
+listDatasetEntries_sourceRefContains :: Lens.Lens' ListDatasetEntries (Prelude.Maybe Prelude.Text)
+listDatasetEntries_sourceRefContains = Lens.lens (\ListDatasetEntries' {sourceRefContains} -> sourceRefContains) (\s@ListDatasetEntries' {} a -> s {sourceRefContains = a} :: ListDatasetEntries)
+
+-- | The name of the project that contains the dataset that you want to list.
+listDatasetEntries_projectName :: Lens.Lens' ListDatasetEntries Prelude.Text
+listDatasetEntries_projectName = Lens.lens (\ListDatasetEntries' {projectName} -> projectName) (\s@ListDatasetEntries' {} a -> s {projectName = a} :: ListDatasetEntries)
+
+-- | The type of the dataset that you want to list. Specify @train@ to list
+-- the training dataset. Specify @test@ to list the test dataset. If you
+-- have a single dataset project, specify @train@.
+listDatasetEntries_datasetType :: Lens.Lens' ListDatasetEntries Prelude.Text
+listDatasetEntries_datasetType = Lens.lens (\ListDatasetEntries' {datasetType} -> datasetType) (\s@ListDatasetEntries' {} a -> s {datasetType = a} :: ListDatasetEntries)
+
+instance Core.AWSPager ListDatasetEntries where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listDatasetEntriesResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listDatasetEntriesResponse_datasetEntries
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listDatasetEntries_nextToken
+          Lens..~ rs
+          Lens.^? listDatasetEntriesResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListDatasetEntries where
+  type
+    AWSResponse ListDatasetEntries =
+      ListDatasetEntriesResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListDatasetEntriesResponse'
+            Prelude.<$> (x Data..?> "DatasetEntries" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListDatasetEntries where
+  hashWithSalt _salt ListDatasetEntries' {..} =
+    _salt
+      `Prelude.hashWithSalt` afterCreationDate
+      `Prelude.hashWithSalt` anomalyClass
+      `Prelude.hashWithSalt` beforeCreationDate
+      `Prelude.hashWithSalt` labeled
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` sourceRefContains
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` datasetType
+
+instance Prelude.NFData ListDatasetEntries where
+  rnf ListDatasetEntries' {..} =
+    Prelude.rnf afterCreationDate
+      `Prelude.seq` Prelude.rnf anomalyClass
+      `Prelude.seq` Prelude.rnf beforeCreationDate
+      `Prelude.seq` Prelude.rnf labeled
+      `Prelude.seq` Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf sourceRefContains
+      `Prelude.seq` Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf datasetType
+
+instance Data.ToHeaders ListDatasetEntries where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListDatasetEntries where
+  toPath ListDatasetEntries' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/datasets/",
+        Data.toBS datasetType,
+        "/entries"
+      ]
+
+instance Data.ToQuery ListDatasetEntries where
+  toQuery ListDatasetEntries' {..} =
+    Prelude.mconcat
+      [ "createdAfter" Data.=: afterCreationDate,
+        "anomalyClass" Data.=: anomalyClass,
+        "createdBefore" Data.=: beforeCreationDate,
+        "labeled" Data.=: labeled,
+        "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken,
+        "sourceRefContains" Data.=: sourceRefContains
+      ]
+
+-- | /See:/ 'newListDatasetEntriesResponse' smart constructor.
+data ListDatasetEntriesResponse = ListDatasetEntriesResponse'
+  { -- | A list of the entries (JSON Lines) within the dataset.
+    datasetEntries :: Prelude.Maybe [Prelude.Text],
+    -- | If the response is truncated, Amazon Lookout for Vision returns this
+    -- token that you can use in the subsequent request to retrieve the next
+    -- set ofdataset entries.
+    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 'ListDatasetEntriesResponse' 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:
+--
+-- 'datasetEntries', 'listDatasetEntriesResponse_datasetEntries' - A list of the entries (JSON Lines) within the dataset.
+--
+-- 'nextToken', 'listDatasetEntriesResponse_nextToken' - If the response is truncated, Amazon Lookout for Vision returns this
+-- token that you can use in the subsequent request to retrieve the next
+-- set ofdataset entries.
+--
+-- 'httpStatus', 'listDatasetEntriesResponse_httpStatus' - The response's http status code.
+newListDatasetEntriesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListDatasetEntriesResponse
+newListDatasetEntriesResponse pHttpStatus_ =
+  ListDatasetEntriesResponse'
+    { datasetEntries =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of the entries (JSON Lines) within the dataset.
+listDatasetEntriesResponse_datasetEntries :: Lens.Lens' ListDatasetEntriesResponse (Prelude.Maybe [Prelude.Text])
+listDatasetEntriesResponse_datasetEntries = Lens.lens (\ListDatasetEntriesResponse' {datasetEntries} -> datasetEntries) (\s@ListDatasetEntriesResponse' {} a -> s {datasetEntries = a} :: ListDatasetEntriesResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | If the response is truncated, Amazon Lookout for Vision returns this
+-- token that you can use in the subsequent request to retrieve the next
+-- set ofdataset entries.
+listDatasetEntriesResponse_nextToken :: Lens.Lens' ListDatasetEntriesResponse (Prelude.Maybe Prelude.Text)
+listDatasetEntriesResponse_nextToken = Lens.lens (\ListDatasetEntriesResponse' {nextToken} -> nextToken) (\s@ListDatasetEntriesResponse' {} a -> s {nextToken = a} :: ListDatasetEntriesResponse)
+
+-- | The response's http status code.
+listDatasetEntriesResponse_httpStatus :: Lens.Lens' ListDatasetEntriesResponse Prelude.Int
+listDatasetEntriesResponse_httpStatus = Lens.lens (\ListDatasetEntriesResponse' {httpStatus} -> httpStatus) (\s@ListDatasetEntriesResponse' {} a -> s {httpStatus = a} :: ListDatasetEntriesResponse)
+
+instance Prelude.NFData ListDatasetEntriesResponse where
+  rnf ListDatasetEntriesResponse' {..} =
+    Prelude.rnf datasetEntries
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/ListModelPackagingJobs.hs b/gen/Amazonka/LookoutVision/ListModelPackagingJobs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/ListModelPackagingJobs.hs
@@ -0,0 +1,274 @@
+{-# 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.LookoutVision.ListModelPackagingJobs
+-- 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 model packaging jobs created for an Amazon Lookout for Vision
+-- project.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:ListModelPackagingJobs@ operation.
+--
+-- For more information, see /Using your Amazon Lookout for Vision model on
+-- an edge device/ in the Amazon Lookout for Vision Developer Guide.
+--
+-- This operation returns paginated results.
+module Amazonka.LookoutVision.ListModelPackagingJobs
+  ( -- * Creating a Request
+    ListModelPackagingJobs (..),
+    newListModelPackagingJobs,
+
+    -- * Request Lenses
+    listModelPackagingJobs_maxResults,
+    listModelPackagingJobs_nextToken,
+    listModelPackagingJobs_projectName,
+
+    -- * Destructuring the Response
+    ListModelPackagingJobsResponse (..),
+    newListModelPackagingJobsResponse,
+
+    -- * Response Lenses
+    listModelPackagingJobsResponse_modelPackagingJobs,
+    listModelPackagingJobsResponse_nextToken,
+    listModelPackagingJobsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListModelPackagingJobs' smart constructor.
+data ListModelPackagingJobs = ListModelPackagingJobs'
+  { -- | The maximum number of results to return per paginated call. The largest
+    -- value you can specify is 100. If you specify a value greater than 100, a
+    -- ValidationException error occurs. The default value is 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If the previous response was incomplete (because there is more results
+    -- to retrieve), Amazon Lookout for Vision returns a pagination token in
+    -- the response. You can use this pagination token to retrieve the next set
+    -- of results.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the project for which you want to list the model packaging
+    -- jobs.
+    projectName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListModelPackagingJobs' 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', 'listModelPackagingJobs_maxResults' - The maximum number of results to return per paginated call. The largest
+-- value you can specify is 100. If you specify a value greater than 100, a
+-- ValidationException error occurs. The default value is 100.
+--
+-- 'nextToken', 'listModelPackagingJobs_nextToken' - If the previous response was incomplete (because there is more results
+-- to retrieve), Amazon Lookout for Vision returns a pagination token in
+-- the response. You can use this pagination token to retrieve the next set
+-- of results.
+--
+-- 'projectName', 'listModelPackagingJobs_projectName' - The name of the project for which you want to list the model packaging
+-- jobs.
+newListModelPackagingJobs ::
+  -- | 'projectName'
+  Prelude.Text ->
+  ListModelPackagingJobs
+newListModelPackagingJobs pProjectName_ =
+  ListModelPackagingJobs'
+    { maxResults =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      projectName = pProjectName_
+    }
+
+-- | The maximum number of results to return per paginated call. The largest
+-- value you can specify is 100. If you specify a value greater than 100, a
+-- ValidationException error occurs. The default value is 100.
+listModelPackagingJobs_maxResults :: Lens.Lens' ListModelPackagingJobs (Prelude.Maybe Prelude.Natural)
+listModelPackagingJobs_maxResults = Lens.lens (\ListModelPackagingJobs' {maxResults} -> maxResults) (\s@ListModelPackagingJobs' {} a -> s {maxResults = a} :: ListModelPackagingJobs)
+
+-- | If the previous response was incomplete (because there is more results
+-- to retrieve), Amazon Lookout for Vision returns a pagination token in
+-- the response. You can use this pagination token to retrieve the next set
+-- of results.
+listModelPackagingJobs_nextToken :: Lens.Lens' ListModelPackagingJobs (Prelude.Maybe Prelude.Text)
+listModelPackagingJobs_nextToken = Lens.lens (\ListModelPackagingJobs' {nextToken} -> nextToken) (\s@ListModelPackagingJobs' {} a -> s {nextToken = a} :: ListModelPackagingJobs)
+
+-- | The name of the project for which you want to list the model packaging
+-- jobs.
+listModelPackagingJobs_projectName :: Lens.Lens' ListModelPackagingJobs Prelude.Text
+listModelPackagingJobs_projectName = Lens.lens (\ListModelPackagingJobs' {projectName} -> projectName) (\s@ListModelPackagingJobs' {} a -> s {projectName = a} :: ListModelPackagingJobs)
+
+instance Core.AWSPager ListModelPackagingJobs where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listModelPackagingJobsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listModelPackagingJobsResponse_modelPackagingJobs
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listModelPackagingJobs_nextToken
+          Lens..~ rs
+          Lens.^? listModelPackagingJobsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListModelPackagingJobs where
+  type
+    AWSResponse ListModelPackagingJobs =
+      ListModelPackagingJobsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListModelPackagingJobsResponse'
+            Prelude.<$> ( x
+                            Data..?> "ModelPackagingJobs"
+                            Core..!@ Prelude.mempty
+                        )
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListModelPackagingJobs where
+  hashWithSalt _salt ListModelPackagingJobs' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` projectName
+
+instance Prelude.NFData ListModelPackagingJobs where
+  rnf ListModelPackagingJobs' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf projectName
+
+instance Data.ToHeaders ListModelPackagingJobs where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListModelPackagingJobs where
+  toPath ListModelPackagingJobs' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/modelpackagingjobs"
+      ]
+
+instance Data.ToQuery ListModelPackagingJobs where
+  toQuery ListModelPackagingJobs' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListModelPackagingJobsResponse' smart constructor.
+data ListModelPackagingJobsResponse = ListModelPackagingJobsResponse'
+  { -- | A list of the model packaging jobs created for the specified Amazon
+    -- Lookout for Vision project.
+    modelPackagingJobs :: Prelude.Maybe [ModelPackagingJobMetadata],
+    -- | If the previous response was incomplete (because there is more results
+    -- to retrieve), Amazon Lookout for Vision returns a pagination token in
+    -- the response. You can use this pagination token to retrieve the next set
+    -- 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 'ListModelPackagingJobsResponse' 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:
+--
+-- 'modelPackagingJobs', 'listModelPackagingJobsResponse_modelPackagingJobs' - A list of the model packaging jobs created for the specified Amazon
+-- Lookout for Vision project.
+--
+-- 'nextToken', 'listModelPackagingJobsResponse_nextToken' - If the previous response was incomplete (because there is more results
+-- to retrieve), Amazon Lookout for Vision returns a pagination token in
+-- the response. You can use this pagination token to retrieve the next set
+-- of results.
+--
+-- 'httpStatus', 'listModelPackagingJobsResponse_httpStatus' - The response's http status code.
+newListModelPackagingJobsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListModelPackagingJobsResponse
+newListModelPackagingJobsResponse pHttpStatus_ =
+  ListModelPackagingJobsResponse'
+    { modelPackagingJobs =
+        Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of the model packaging jobs created for the specified Amazon
+-- Lookout for Vision project.
+listModelPackagingJobsResponse_modelPackagingJobs :: Lens.Lens' ListModelPackagingJobsResponse (Prelude.Maybe [ModelPackagingJobMetadata])
+listModelPackagingJobsResponse_modelPackagingJobs = Lens.lens (\ListModelPackagingJobsResponse' {modelPackagingJobs} -> modelPackagingJobs) (\s@ListModelPackagingJobsResponse' {} a -> s {modelPackagingJobs = a} :: ListModelPackagingJobsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | If the previous response was incomplete (because there is more results
+-- to retrieve), Amazon Lookout for Vision returns a pagination token in
+-- the response. You can use this pagination token to retrieve the next set
+-- of results.
+listModelPackagingJobsResponse_nextToken :: Lens.Lens' ListModelPackagingJobsResponse (Prelude.Maybe Prelude.Text)
+listModelPackagingJobsResponse_nextToken = Lens.lens (\ListModelPackagingJobsResponse' {nextToken} -> nextToken) (\s@ListModelPackagingJobsResponse' {} a -> s {nextToken = a} :: ListModelPackagingJobsResponse)
+
+-- | The response's http status code.
+listModelPackagingJobsResponse_httpStatus :: Lens.Lens' ListModelPackagingJobsResponse Prelude.Int
+listModelPackagingJobsResponse_httpStatus = Lens.lens (\ListModelPackagingJobsResponse' {httpStatus} -> httpStatus) (\s@ListModelPackagingJobsResponse' {} a -> s {httpStatus = a} :: ListModelPackagingJobsResponse)
+
+instance
+  Prelude.NFData
+    ListModelPackagingJobsResponse
+  where
+  rnf ListModelPackagingJobsResponse' {..} =
+    Prelude.rnf modelPackagingJobs
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/ListModels.hs b/gen/Amazonka/LookoutVision/ListModels.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/ListModels.hs
@@ -0,0 +1,258 @@
+{-# 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.LookoutVision.ListModels
+-- 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 versions of a model in an Amazon Lookout for Vision project.
+--
+-- The @ListModels@ operation is eventually consistent. Recent calls to
+-- @CreateModel@ might take a while to appear in the response from
+-- @ListProjects@.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:ListModels@ operation.
+--
+-- This operation returns paginated results.
+module Amazonka.LookoutVision.ListModels
+  ( -- * Creating a Request
+    ListModels (..),
+    newListModels,
+
+    -- * Request Lenses
+    listModels_maxResults,
+    listModels_nextToken,
+    listModels_projectName,
+
+    -- * Destructuring the Response
+    ListModelsResponse (..),
+    newListModelsResponse,
+
+    -- * Response Lenses
+    listModelsResponse_models,
+    listModelsResponse_nextToken,
+    listModelsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListModels' smart constructor.
+data ListModels = ListModels'
+  { -- | The maximum number of results to return per paginated call. The largest
+    -- value you can specify is 100. If you specify a value greater than 100, a
+    -- ValidationException error occurs. The default value is 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If the previous response was incomplete (because there is more data to
+    -- retrieve), Amazon Lookout for Vision returns a pagination token in the
+    -- response. You can use this pagination token to retrieve the next set of
+    -- models.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the project that contains the model versions that you want
+    -- to list.
+    projectName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListModels' 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', 'listModels_maxResults' - The maximum number of results to return per paginated call. The largest
+-- value you can specify is 100. If you specify a value greater than 100, a
+-- ValidationException error occurs. The default value is 100.
+--
+-- 'nextToken', 'listModels_nextToken' - If the previous response was incomplete (because there is more data to
+-- retrieve), Amazon Lookout for Vision returns a pagination token in the
+-- response. You can use this pagination token to retrieve the next set of
+-- models.
+--
+-- 'projectName', 'listModels_projectName' - The name of the project that contains the model versions that you want
+-- to list.
+newListModels ::
+  -- | 'projectName'
+  Prelude.Text ->
+  ListModels
+newListModels pProjectName_ =
+  ListModels'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      projectName = pProjectName_
+    }
+
+-- | The maximum number of results to return per paginated call. The largest
+-- value you can specify is 100. If you specify a value greater than 100, a
+-- ValidationException error occurs. The default value is 100.
+listModels_maxResults :: Lens.Lens' ListModels (Prelude.Maybe Prelude.Natural)
+listModels_maxResults = Lens.lens (\ListModels' {maxResults} -> maxResults) (\s@ListModels' {} a -> s {maxResults = a} :: ListModels)
+
+-- | If the previous response was incomplete (because there is more data to
+-- retrieve), Amazon Lookout for Vision returns a pagination token in the
+-- response. You can use this pagination token to retrieve the next set of
+-- models.
+listModels_nextToken :: Lens.Lens' ListModels (Prelude.Maybe Prelude.Text)
+listModels_nextToken = Lens.lens (\ListModels' {nextToken} -> nextToken) (\s@ListModels' {} a -> s {nextToken = a} :: ListModels)
+
+-- | The name of the project that contains the model versions that you want
+-- to list.
+listModels_projectName :: Lens.Lens' ListModels Prelude.Text
+listModels_projectName = Lens.lens (\ListModels' {projectName} -> projectName) (\s@ListModels' {} a -> s {projectName = a} :: ListModels)
+
+instance Core.AWSPager ListModels where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listModelsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listModelsResponse_models
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listModels_nextToken
+          Lens..~ rs
+          Lens.^? listModelsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListModels where
+  type AWSResponse ListModels = ListModelsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListModelsResponse'
+            Prelude.<$> (x Data..?> "Models" Core..!@ Prelude.mempty)
+            Prelude.<*> (x Data..?> "NextToken")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListModels where
+  hashWithSalt _salt ListModels' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+      `Prelude.hashWithSalt` projectName
+
+instance Prelude.NFData ListModels where
+  rnf ListModels' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf projectName
+
+instance Data.ToHeaders ListModels where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListModels where
+  toPath ListModels' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/models"
+      ]
+
+instance Data.ToQuery ListModels where
+  toQuery ListModels' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListModelsResponse' smart constructor.
+data ListModelsResponse = ListModelsResponse'
+  { -- | A list of model versions in the specified project.
+    models :: Prelude.Maybe [ModelMetadata],
+    -- | If the response is truncated, Amazon Lookout for Vision returns this
+    -- token that you can use in the subsequent request to retrieve the next
+    -- set of models.
+    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 'ListModelsResponse' 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:
+--
+-- 'models', 'listModelsResponse_models' - A list of model versions in the specified project.
+--
+-- 'nextToken', 'listModelsResponse_nextToken' - If the response is truncated, Amazon Lookout for Vision returns this
+-- token that you can use in the subsequent request to retrieve the next
+-- set of models.
+--
+-- 'httpStatus', 'listModelsResponse_httpStatus' - The response's http status code.
+newListModelsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListModelsResponse
+newListModelsResponse pHttpStatus_ =
+  ListModelsResponse'
+    { models = Prelude.Nothing,
+      nextToken = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A list of model versions in the specified project.
+listModelsResponse_models :: Lens.Lens' ListModelsResponse (Prelude.Maybe [ModelMetadata])
+listModelsResponse_models = Lens.lens (\ListModelsResponse' {models} -> models) (\s@ListModelsResponse' {} a -> s {models = a} :: ListModelsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | If the response is truncated, Amazon Lookout for Vision returns this
+-- token that you can use in the subsequent request to retrieve the next
+-- set of models.
+listModelsResponse_nextToken :: Lens.Lens' ListModelsResponse (Prelude.Maybe Prelude.Text)
+listModelsResponse_nextToken = Lens.lens (\ListModelsResponse' {nextToken} -> nextToken) (\s@ListModelsResponse' {} a -> s {nextToken = a} :: ListModelsResponse)
+
+-- | The response's http status code.
+listModelsResponse_httpStatus :: Lens.Lens' ListModelsResponse Prelude.Int
+listModelsResponse_httpStatus = Lens.lens (\ListModelsResponse' {httpStatus} -> httpStatus) (\s@ListModelsResponse' {} a -> s {httpStatus = a} :: ListModelsResponse)
+
+instance Prelude.NFData ListModelsResponse where
+  rnf ListModelsResponse' {..} =
+    Prelude.rnf models
+      `Prelude.seq` Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/ListProjects.hs b/gen/Amazonka/LookoutVision/ListProjects.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/ListProjects.hs
@@ -0,0 +1,237 @@
+{-# 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.LookoutVision.ListProjects
+-- 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 Amazon Lookout for Vision projects in your AWS account that
+-- are in the AWS Region in which you call @ListProjects@.
+--
+-- The @ListProjects@ operation is eventually consistent. Recent calls to
+-- @CreateProject@ and @DeleteProject@ might take a while to appear in the
+-- response from @ListProjects@.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:ListProjects@ operation.
+--
+-- This operation returns paginated results.
+module Amazonka.LookoutVision.ListProjects
+  ( -- * Creating a Request
+    ListProjects (..),
+    newListProjects,
+
+    -- * Request Lenses
+    listProjects_maxResults,
+    listProjects_nextToken,
+
+    -- * Destructuring the Response
+    ListProjectsResponse (..),
+    newListProjectsResponse,
+
+    -- * Response Lenses
+    listProjectsResponse_nextToken,
+    listProjectsResponse_projects,
+    listProjectsResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newListProjects' smart constructor.
+data ListProjects = ListProjects'
+  { -- | The maximum number of results to return per paginated call. The largest
+    -- value you can specify is 100. If you specify a value greater than 100, a
+    -- ValidationException error occurs. The default value is 100.
+    maxResults :: Prelude.Maybe Prelude.Natural,
+    -- | If the previous response was incomplete (because there is more data to
+    -- retrieve), Amazon Lookout for Vision returns a pagination token in the
+    -- response. You can use this pagination token to retrieve the next set of
+    -- projects.
+    nextToken :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListProjects' 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', 'listProjects_maxResults' - The maximum number of results to return per paginated call. The largest
+-- value you can specify is 100. If you specify a value greater than 100, a
+-- ValidationException error occurs. The default value is 100.
+--
+-- 'nextToken', 'listProjects_nextToken' - If the previous response was incomplete (because there is more data to
+-- retrieve), Amazon Lookout for Vision returns a pagination token in the
+-- response. You can use this pagination token to retrieve the next set of
+-- projects.
+newListProjects ::
+  ListProjects
+newListProjects =
+  ListProjects'
+    { maxResults = Prelude.Nothing,
+      nextToken = Prelude.Nothing
+    }
+
+-- | The maximum number of results to return per paginated call. The largest
+-- value you can specify is 100. If you specify a value greater than 100, a
+-- ValidationException error occurs. The default value is 100.
+listProjects_maxResults :: Lens.Lens' ListProjects (Prelude.Maybe Prelude.Natural)
+listProjects_maxResults = Lens.lens (\ListProjects' {maxResults} -> maxResults) (\s@ListProjects' {} a -> s {maxResults = a} :: ListProjects)
+
+-- | If the previous response was incomplete (because there is more data to
+-- retrieve), Amazon Lookout for Vision returns a pagination token in the
+-- response. You can use this pagination token to retrieve the next set of
+-- projects.
+listProjects_nextToken :: Lens.Lens' ListProjects (Prelude.Maybe Prelude.Text)
+listProjects_nextToken = Lens.lens (\ListProjects' {nextToken} -> nextToken) (\s@ListProjects' {} a -> s {nextToken = a} :: ListProjects)
+
+instance Core.AWSPager ListProjects where
+  page rq rs
+    | Core.stop
+        ( rs
+            Lens.^? listProjectsResponse_nextToken
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Core.stop
+        ( rs
+            Lens.^? listProjectsResponse_projects
+            Prelude.. Lens._Just
+        ) =
+        Prelude.Nothing
+    | Prelude.otherwise =
+        Prelude.Just
+          Prelude.$ rq
+          Prelude.& listProjects_nextToken
+          Lens..~ rs
+          Lens.^? listProjectsResponse_nextToken
+          Prelude.. Lens._Just
+
+instance Core.AWSRequest ListProjects where
+  type AWSResponse ListProjects = ListProjectsResponse
+  request overrides =
+    Request.get (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          ListProjectsResponse'
+            Prelude.<$> (x Data..?> "NextToken")
+            Prelude.<*> (x Data..?> "Projects" Core..!@ Prelude.mempty)
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable ListProjects where
+  hashWithSalt _salt ListProjects' {..} =
+    _salt
+      `Prelude.hashWithSalt` maxResults
+      `Prelude.hashWithSalt` nextToken
+
+instance Prelude.NFData ListProjects where
+  rnf ListProjects' {..} =
+    Prelude.rnf maxResults
+      `Prelude.seq` Prelude.rnf nextToken
+
+instance Data.ToHeaders ListProjects where
+  toHeaders =
+    Prelude.const
+      ( Prelude.mconcat
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListProjects where
+  toPath = Prelude.const "/2020-11-20/projects"
+
+instance Data.ToQuery ListProjects where
+  toQuery ListProjects' {..} =
+    Prelude.mconcat
+      [ "maxResults" Data.=: maxResults,
+        "nextToken" Data.=: nextToken
+      ]
+
+-- | /See:/ 'newListProjectsResponse' smart constructor.
+data ListProjectsResponse = ListProjectsResponse'
+  { -- | If the response is truncated, Amazon Lookout for Vision returns this
+    -- token that you can use in the subsequent request to retrieve the next
+    -- set of projects.
+    nextToken :: Prelude.Maybe Prelude.Text,
+    -- | A list of projects in your AWS account.
+    projects :: Prelude.Maybe [ProjectMetadata],
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ListProjectsResponse' 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', 'listProjectsResponse_nextToken' - If the response is truncated, Amazon Lookout for Vision returns this
+-- token that you can use in the subsequent request to retrieve the next
+-- set of projects.
+--
+-- 'projects', 'listProjectsResponse_projects' - A list of projects in your AWS account.
+--
+-- 'httpStatus', 'listProjectsResponse_httpStatus' - The response's http status code.
+newListProjectsResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListProjectsResponse
+newListProjectsResponse pHttpStatus_ =
+  ListProjectsResponse'
+    { nextToken = Prelude.Nothing,
+      projects = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | If the response is truncated, Amazon Lookout for Vision returns this
+-- token that you can use in the subsequent request to retrieve the next
+-- set of projects.
+listProjectsResponse_nextToken :: Lens.Lens' ListProjectsResponse (Prelude.Maybe Prelude.Text)
+listProjectsResponse_nextToken = Lens.lens (\ListProjectsResponse' {nextToken} -> nextToken) (\s@ListProjectsResponse' {} a -> s {nextToken = a} :: ListProjectsResponse)
+
+-- | A list of projects in your AWS account.
+listProjectsResponse_projects :: Lens.Lens' ListProjectsResponse (Prelude.Maybe [ProjectMetadata])
+listProjectsResponse_projects = Lens.lens (\ListProjectsResponse' {projects} -> projects) (\s@ListProjectsResponse' {} a -> s {projects = a} :: ListProjectsResponse) Prelude.. Lens.mapping Lens.coerced
+
+-- | The response's http status code.
+listProjectsResponse_httpStatus :: Lens.Lens' ListProjectsResponse Prelude.Int
+listProjectsResponse_httpStatus = Lens.lens (\ListProjectsResponse' {httpStatus} -> httpStatus) (\s@ListProjectsResponse' {} a -> s {httpStatus = a} :: ListProjectsResponse)
+
+instance Prelude.NFData ListProjectsResponse where
+  rnf ListProjectsResponse' {..} =
+    Prelude.rnf nextToken
+      `Prelude.seq` Prelude.rnf projects
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/ListTagsForResource.hs b/gen/Amazonka/LookoutVision/ListTagsForResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/ListTagsForResource.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.LookoutVision.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)
+--
+-- Returns a list of tags attached to the specified Amazon Lookout for
+-- Vision model.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:ListTagsForResource@ operation.
+module Amazonka.LookoutVision.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.LookoutVision.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 Amazon Resource Name (ARN) of the model for which you want to list
+    -- tags.
+    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 Amazon Resource Name (ARN) of the model for which you want to list
+-- tags.
+newListTagsForResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  ListTagsForResource
+newListTagsForResource pResourceArn_ =
+  ListTagsForResource' {resourceArn = pResourceArn_}
+
+-- | The Amazon Resource Name (ARN) of the model for which you want to list
+-- tags.
+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.get (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
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath ListTagsForResource where
+  toPath ListTagsForResource' {..} =
+    Prelude.mconcat
+      ["/2020-11-20/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery ListTagsForResource where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newListTagsForResourceResponse' smart constructor.
+data ListTagsForResourceResponse = ListTagsForResourceResponse'
+  { -- | A map of tag keys and values attached to the specified model.
+    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' - A map of tag keys and values attached to the specified model.
+--
+-- 'httpStatus', 'listTagsForResourceResponse_httpStatus' - The response's http status code.
+newListTagsForResourceResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  ListTagsForResourceResponse
+newListTagsForResourceResponse pHttpStatus_ =
+  ListTagsForResourceResponse'
+    { tags =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | A map of tag keys and values attached to the specified model.
+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/LookoutVision/StartModel.hs b/gen/Amazonka/LookoutVision/StartModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/StartModel.hs
@@ -0,0 +1,295 @@
+{-# 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.LookoutVision.StartModel
+-- 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 the running of the version of an Amazon Lookout for Vision model.
+-- Starting a model takes a while to complete. To check the current state
+-- of the model, use DescribeModel.
+--
+-- A model is ready to use when its status is @HOSTED@.
+--
+-- Once the model is running, you can detect custom labels in new images by
+-- calling DetectAnomalies.
+--
+-- You are charged for the amount of time that the model is running. To
+-- stop a running model, call StopModel.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:StartModel@ operation.
+module Amazonka.LookoutVision.StartModel
+  ( -- * Creating a Request
+    StartModel (..),
+    newStartModel,
+
+    -- * Request Lenses
+    startModel_clientToken,
+    startModel_maxInferenceUnits,
+    startModel_projectName,
+    startModel_modelVersion,
+    startModel_minInferenceUnits,
+
+    -- * Destructuring the Response
+    StartModelResponse (..),
+    newStartModelResponse,
+
+    -- * Response Lenses
+    startModelResponse_status,
+    startModelResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStartModel' smart constructor.
+data StartModel = StartModel'
+  { -- | ClientToken is an idempotency token that ensures a call to @StartModel@
+    -- completes only once. You choose the value to pass. For example, An issue
+    -- might prevent you from getting a response from @StartModel@. In this
+    -- case, safely retry your call to @StartModel@ by using the same
+    -- @ClientToken@ parameter value.
+    --
+    -- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+    -- using inserts a value for you. This prevents retries after a network
+    -- error from making multiple start requests. You\'ll need to provide your
+    -- own value for other use cases.
+    --
+    -- An error occurs if the other input parameters are not the same as in the
+    -- first request. Using a different value for @ClientToken@ is considered a
+    -- new call to @StartModel@. An idempotency token is active for 8 hours.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of inference units to use for auto-scaling the model.
+    -- If you don\'t specify a value, Amazon Lookout for Vision doesn\'t
+    -- auto-scale the model.
+    maxInferenceUnits :: Prelude.Maybe Prelude.Natural,
+    -- | The name of the project that contains the model that you want to start.
+    projectName :: Prelude.Text,
+    -- | The version of the model that you want to start.
+    modelVersion :: Prelude.Text,
+    -- | The minimum number of inference units to use. A single inference unit
+    -- represents 1 hour of processing. Use a higher number to increase the TPS
+    -- throughput of your model. You are charged for the number of inference
+    -- units that you use.
+    minInferenceUnits :: Prelude.Natural
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartModel' 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:
+--
+-- 'clientToken', 'startModel_clientToken' - ClientToken is an idempotency token that ensures a call to @StartModel@
+-- completes only once. You choose the value to pass. For example, An issue
+-- might prevent you from getting a response from @StartModel@. In this
+-- case, safely retry your call to @StartModel@ by using the same
+-- @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple start requests. You\'ll need to provide your
+-- own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @StartModel@. An idempotency token is active for 8 hours.
+--
+-- 'maxInferenceUnits', 'startModel_maxInferenceUnits' - The maximum number of inference units to use for auto-scaling the model.
+-- If you don\'t specify a value, Amazon Lookout for Vision doesn\'t
+-- auto-scale the model.
+--
+-- 'projectName', 'startModel_projectName' - The name of the project that contains the model that you want to start.
+--
+-- 'modelVersion', 'startModel_modelVersion' - The version of the model that you want to start.
+--
+-- 'minInferenceUnits', 'startModel_minInferenceUnits' - The minimum number of inference units to use. A single inference unit
+-- represents 1 hour of processing. Use a higher number to increase the TPS
+-- throughput of your model. You are charged for the number of inference
+-- units that you use.
+newStartModel ::
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'modelVersion'
+  Prelude.Text ->
+  -- | 'minInferenceUnits'
+  Prelude.Natural ->
+  StartModel
+newStartModel
+  pProjectName_
+  pModelVersion_
+  pMinInferenceUnits_ =
+    StartModel'
+      { clientToken = Prelude.Nothing,
+        maxInferenceUnits = Prelude.Nothing,
+        projectName = pProjectName_,
+        modelVersion = pModelVersion_,
+        minInferenceUnits = pMinInferenceUnits_
+      }
+
+-- | ClientToken is an idempotency token that ensures a call to @StartModel@
+-- completes only once. You choose the value to pass. For example, An issue
+-- might prevent you from getting a response from @StartModel@. In this
+-- case, safely retry your call to @StartModel@ by using the same
+-- @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple start requests. You\'ll need to provide your
+-- own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @StartModel@. An idempotency token is active for 8 hours.
+startModel_clientToken :: Lens.Lens' StartModel (Prelude.Maybe Prelude.Text)
+startModel_clientToken = Lens.lens (\StartModel' {clientToken} -> clientToken) (\s@StartModel' {} a -> s {clientToken = a} :: StartModel)
+
+-- | The maximum number of inference units to use for auto-scaling the model.
+-- If you don\'t specify a value, Amazon Lookout for Vision doesn\'t
+-- auto-scale the model.
+startModel_maxInferenceUnits :: Lens.Lens' StartModel (Prelude.Maybe Prelude.Natural)
+startModel_maxInferenceUnits = Lens.lens (\StartModel' {maxInferenceUnits} -> maxInferenceUnits) (\s@StartModel' {} a -> s {maxInferenceUnits = a} :: StartModel)
+
+-- | The name of the project that contains the model that you want to start.
+startModel_projectName :: Lens.Lens' StartModel Prelude.Text
+startModel_projectName = Lens.lens (\StartModel' {projectName} -> projectName) (\s@StartModel' {} a -> s {projectName = a} :: StartModel)
+
+-- | The version of the model that you want to start.
+startModel_modelVersion :: Lens.Lens' StartModel Prelude.Text
+startModel_modelVersion = Lens.lens (\StartModel' {modelVersion} -> modelVersion) (\s@StartModel' {} a -> s {modelVersion = a} :: StartModel)
+
+-- | The minimum number of inference units to use. A single inference unit
+-- represents 1 hour of processing. Use a higher number to increase the TPS
+-- throughput of your model. You are charged for the number of inference
+-- units that you use.
+startModel_minInferenceUnits :: Lens.Lens' StartModel Prelude.Natural
+startModel_minInferenceUnits = Lens.lens (\StartModel' {minInferenceUnits} -> minInferenceUnits) (\s@StartModel' {} a -> s {minInferenceUnits = a} :: StartModel)
+
+instance Core.AWSRequest StartModel where
+  type AWSResponse StartModel = StartModelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartModelResponse'
+            Prelude.<$> (x Data..?> "Status")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartModel where
+  hashWithSalt _salt StartModel' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` maxInferenceUnits
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` modelVersion
+      `Prelude.hashWithSalt` minInferenceUnits
+
+instance Prelude.NFData StartModel where
+  rnf StartModel' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf maxInferenceUnits
+      `Prelude.seq` Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf modelVersion
+      `Prelude.seq` Prelude.rnf minInferenceUnits
+
+instance Data.ToHeaders StartModel where
+  toHeaders StartModel' {..} =
+    Prelude.mconcat
+      [ "X-Amzn-Client-Token" Data.=# clientToken,
+        "Content-Type"
+          Data.=# ("application/x-amz-json-1.1" :: Prelude.ByteString)
+      ]
+
+instance Data.ToJSON StartModel where
+  toJSON StartModel' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("MaxInferenceUnits" Data..=)
+              Prelude.<$> maxInferenceUnits,
+            Prelude.Just
+              ("MinInferenceUnits" Data..= minInferenceUnits)
+          ]
+      )
+
+instance Data.ToPath StartModel where
+  toPath StartModel' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/models/",
+        Data.toBS modelVersion,
+        "/start"
+      ]
+
+instance Data.ToQuery StartModel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartModelResponse' smart constructor.
+data StartModelResponse = StartModelResponse'
+  { -- | The current running status of the model.
+    status :: Prelude.Maybe ModelHostingStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartModelResponse' 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:
+--
+-- 'status', 'startModelResponse_status' - The current running status of the model.
+--
+-- 'httpStatus', 'startModelResponse_httpStatus' - The response's http status code.
+newStartModelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartModelResponse
+newStartModelResponse pHttpStatus_ =
+  StartModelResponse'
+    { status = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The current running status of the model.
+startModelResponse_status :: Lens.Lens' StartModelResponse (Prelude.Maybe ModelHostingStatus)
+startModelResponse_status = Lens.lens (\StartModelResponse' {status} -> status) (\s@StartModelResponse' {} a -> s {status = a} :: StartModelResponse)
+
+-- | The response's http status code.
+startModelResponse_httpStatus :: Lens.Lens' StartModelResponse Prelude.Int
+startModelResponse_httpStatus = Lens.lens (\StartModelResponse' {httpStatus} -> httpStatus) (\s@StartModelResponse' {} a -> s {httpStatus = a} :: StartModelResponse)
+
+instance Prelude.NFData StartModelResponse where
+  rnf StartModelResponse' {..} =
+    Prelude.rnf status
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/StartModelPackagingJob.hs b/gen/Amazonka/LookoutVision/StartModelPackagingJob.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/StartModelPackagingJob.hs
@@ -0,0 +1,335 @@
+{-# 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.LookoutVision.StartModelPackagingJob
+-- 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 an Amazon Lookout for Vision model packaging job. A model
+-- packaging job creates an AWS IoT Greengrass component for a Lookout for
+-- Vision model. You can use the component to deploy your model to an edge
+-- device managed by Greengrass.
+--
+-- Use the DescribeModelPackagingJob API to determine the current status of
+-- the job. The model packaging job is complete if the value of @Status@ is
+-- @SUCCEEDED@.
+--
+-- To deploy the component to the target device, use the component name and
+-- component version with the AWS IoT Greengrass
+-- <https://docs.aws.amazon.com/greengrass/v2/APIReference/API_CreateDeployment.html CreateDeployment>
+-- API.
+--
+-- This operation requires the following permissions:
+--
+-- -   @lookoutvision:StartModelPackagingJob@
+--
+-- -   @s3:PutObject@
+--
+-- -   @s3:GetBucketLocation@
+--
+-- -   @kms:GenerateDataKey@
+--
+-- -   @greengrass:CreateComponentVersion@
+--
+-- -   @greengrass:DescribeComponent@
+--
+-- -   (Optional) @greengrass:TagResource@. Only required if you want to
+--     tag the component.
+--
+-- For more information, see /Using your Amazon Lookout for Vision model on
+-- an edge device/ in the Amazon Lookout for Vision Developer Guide.
+module Amazonka.LookoutVision.StartModelPackagingJob
+  ( -- * Creating a Request
+    StartModelPackagingJob (..),
+    newStartModelPackagingJob,
+
+    -- * Request Lenses
+    startModelPackagingJob_clientToken,
+    startModelPackagingJob_description,
+    startModelPackagingJob_jobName,
+    startModelPackagingJob_projectName,
+    startModelPackagingJob_modelVersion,
+    startModelPackagingJob_configuration,
+
+    -- * Destructuring the Response
+    StartModelPackagingJobResponse (..),
+    newStartModelPackagingJobResponse,
+
+    -- * Response Lenses
+    startModelPackagingJobResponse_jobName,
+    startModelPackagingJobResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStartModelPackagingJob' smart constructor.
+data StartModelPackagingJob = StartModelPackagingJob'
+  { -- | ClientToken is an idempotency token that ensures a call to
+    -- @StartModelPackagingJob@ completes only once. You choose the value to
+    -- pass. For example, An issue might prevent you from getting a response
+    -- from @StartModelPackagingJob@. In this case, safely retry your call to
+    -- @StartModelPackagingJob@ by using the same @ClientToken@ parameter
+    -- value.
+    --
+    -- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+    -- using inserts a value for you. This prevents retries after a network
+    -- error from making multiple dataset creation requests. You\'ll need to
+    -- provide your own value for other use cases.
+    --
+    -- An error occurs if the other input parameters are not the same as in the
+    -- first request. Using a different value for @ClientToken@ is considered a
+    -- new call to @StartModelPackagingJob@. An idempotency token is active for
+    -- 8 hours.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | A description for the model packaging job.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | A name for the model packaging job. If you don\'t supply a value, the
+    -- service creates a job name for you.
+    jobName :: Prelude.Maybe Prelude.Text,
+    -- | The name of the project which contains the version of the model that you
+    -- want to package.
+    projectName :: Prelude.Text,
+    -- | The version of the model within the project that you want to package.
+    modelVersion :: Prelude.Text,
+    -- | The configuration for the model packaging job.
+    configuration :: ModelPackagingConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StartModelPackagingJob' 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:
+--
+-- 'clientToken', 'startModelPackagingJob_clientToken' - ClientToken is an idempotency token that ensures a call to
+-- @StartModelPackagingJob@ completes only once. You choose the value to
+-- pass. For example, An issue might prevent you from getting a response
+-- from @StartModelPackagingJob@. In this case, safely retry your call to
+-- @StartModelPackagingJob@ by using the same @ClientToken@ parameter
+-- value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple dataset creation requests. You\'ll need to
+-- provide your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @StartModelPackagingJob@. An idempotency token is active for
+-- 8 hours.
+--
+-- 'description', 'startModelPackagingJob_description' - A description for the model packaging job.
+--
+-- 'jobName', 'startModelPackagingJob_jobName' - A name for the model packaging job. If you don\'t supply a value, the
+-- service creates a job name for you.
+--
+-- 'projectName', 'startModelPackagingJob_projectName' - The name of the project which contains the version of the model that you
+-- want to package.
+--
+-- 'modelVersion', 'startModelPackagingJob_modelVersion' - The version of the model within the project that you want to package.
+--
+-- 'configuration', 'startModelPackagingJob_configuration' - The configuration for the model packaging job.
+newStartModelPackagingJob ::
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'modelVersion'
+  Prelude.Text ->
+  -- | 'configuration'
+  ModelPackagingConfiguration ->
+  StartModelPackagingJob
+newStartModelPackagingJob
+  pProjectName_
+  pModelVersion_
+  pConfiguration_ =
+    StartModelPackagingJob'
+      { clientToken =
+          Prelude.Nothing,
+        description = Prelude.Nothing,
+        jobName = Prelude.Nothing,
+        projectName = pProjectName_,
+        modelVersion = pModelVersion_,
+        configuration = pConfiguration_
+      }
+
+-- | ClientToken is an idempotency token that ensures a call to
+-- @StartModelPackagingJob@ completes only once. You choose the value to
+-- pass. For example, An issue might prevent you from getting a response
+-- from @StartModelPackagingJob@. In this case, safely retry your call to
+-- @StartModelPackagingJob@ by using the same @ClientToken@ parameter
+-- value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple dataset creation requests. You\'ll need to
+-- provide your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @StartModelPackagingJob@. An idempotency token is active for
+-- 8 hours.
+startModelPackagingJob_clientToken :: Lens.Lens' StartModelPackagingJob (Prelude.Maybe Prelude.Text)
+startModelPackagingJob_clientToken = Lens.lens (\StartModelPackagingJob' {clientToken} -> clientToken) (\s@StartModelPackagingJob' {} a -> s {clientToken = a} :: StartModelPackagingJob)
+
+-- | A description for the model packaging job.
+startModelPackagingJob_description :: Lens.Lens' StartModelPackagingJob (Prelude.Maybe Prelude.Text)
+startModelPackagingJob_description = Lens.lens (\StartModelPackagingJob' {description} -> description) (\s@StartModelPackagingJob' {} a -> s {description = a} :: StartModelPackagingJob)
+
+-- | A name for the model packaging job. If you don\'t supply a value, the
+-- service creates a job name for you.
+startModelPackagingJob_jobName :: Lens.Lens' StartModelPackagingJob (Prelude.Maybe Prelude.Text)
+startModelPackagingJob_jobName = Lens.lens (\StartModelPackagingJob' {jobName} -> jobName) (\s@StartModelPackagingJob' {} a -> s {jobName = a} :: StartModelPackagingJob)
+
+-- | The name of the project which contains the version of the model that you
+-- want to package.
+startModelPackagingJob_projectName :: Lens.Lens' StartModelPackagingJob Prelude.Text
+startModelPackagingJob_projectName = Lens.lens (\StartModelPackagingJob' {projectName} -> projectName) (\s@StartModelPackagingJob' {} a -> s {projectName = a} :: StartModelPackagingJob)
+
+-- | The version of the model within the project that you want to package.
+startModelPackagingJob_modelVersion :: Lens.Lens' StartModelPackagingJob Prelude.Text
+startModelPackagingJob_modelVersion = Lens.lens (\StartModelPackagingJob' {modelVersion} -> modelVersion) (\s@StartModelPackagingJob' {} a -> s {modelVersion = a} :: StartModelPackagingJob)
+
+-- | The configuration for the model packaging job.
+startModelPackagingJob_configuration :: Lens.Lens' StartModelPackagingJob ModelPackagingConfiguration
+startModelPackagingJob_configuration = Lens.lens (\StartModelPackagingJob' {configuration} -> configuration) (\s@StartModelPackagingJob' {} a -> s {configuration = a} :: StartModelPackagingJob)
+
+instance Core.AWSRequest StartModelPackagingJob where
+  type
+    AWSResponse StartModelPackagingJob =
+      StartModelPackagingJobResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StartModelPackagingJobResponse'
+            Prelude.<$> (x Data..?> "JobName")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StartModelPackagingJob where
+  hashWithSalt _salt StartModelPackagingJob' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` modelVersion
+      `Prelude.hashWithSalt` configuration
+
+instance Prelude.NFData StartModelPackagingJob where
+  rnf StartModelPackagingJob' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf modelVersion
+      `Prelude.seq` Prelude.rnf configuration
+
+instance Data.ToHeaders StartModelPackagingJob where
+  toHeaders StartModelPackagingJob' {..} =
+    Prelude.mconcat
+      [ "X-Amzn-Client-Token" Data.=# clientToken,
+        "Content-Type"
+          Data.=# ("application/x-amz-json-1.1" :: Prelude.ByteString)
+      ]
+
+instance Data.ToJSON StartModelPackagingJob where
+  toJSON StartModelPackagingJob' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Description" Data..=) Prelude.<$> description,
+            ("JobName" Data..=) Prelude.<$> jobName,
+            Prelude.Just ("ModelVersion" Data..= modelVersion),
+            Prelude.Just
+              ("Configuration" Data..= configuration)
+          ]
+      )
+
+instance Data.ToPath StartModelPackagingJob where
+  toPath StartModelPackagingJob' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/modelpackagingjobs"
+      ]
+
+instance Data.ToQuery StartModelPackagingJob where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStartModelPackagingJobResponse' smart constructor.
+data StartModelPackagingJobResponse = StartModelPackagingJobResponse'
+  { -- | The job name for the model packaging job. If you don\'t supply a job
+    -- name in the @JobName@ input parameter, the service creates a job name
+    -- for you.
+    jobName :: 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 'StartModelPackagingJobResponse' 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:
+--
+-- 'jobName', 'startModelPackagingJobResponse_jobName' - The job name for the model packaging job. If you don\'t supply a job
+-- name in the @JobName@ input parameter, the service creates a job name
+-- for you.
+--
+-- 'httpStatus', 'startModelPackagingJobResponse_httpStatus' - The response's http status code.
+newStartModelPackagingJobResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StartModelPackagingJobResponse
+newStartModelPackagingJobResponse pHttpStatus_ =
+  StartModelPackagingJobResponse'
+    { jobName =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The job name for the model packaging job. If you don\'t supply a job
+-- name in the @JobName@ input parameter, the service creates a job name
+-- for you.
+startModelPackagingJobResponse_jobName :: Lens.Lens' StartModelPackagingJobResponse (Prelude.Maybe Prelude.Text)
+startModelPackagingJobResponse_jobName = Lens.lens (\StartModelPackagingJobResponse' {jobName} -> jobName) (\s@StartModelPackagingJobResponse' {} a -> s {jobName = a} :: StartModelPackagingJobResponse)
+
+-- | The response's http status code.
+startModelPackagingJobResponse_httpStatus :: Lens.Lens' StartModelPackagingJobResponse Prelude.Int
+startModelPackagingJobResponse_httpStatus = Lens.lens (\StartModelPackagingJobResponse' {httpStatus} -> httpStatus) (\s@StartModelPackagingJobResponse' {} a -> s {httpStatus = a} :: StartModelPackagingJobResponse)
+
+instance
+  Prelude.NFData
+    StartModelPackagingJobResponse
+  where
+  rnf StartModelPackagingJobResponse' {..} =
+    Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/StopModel.hs b/gen/Amazonka/LookoutVision/StopModel.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/StopModel.hs
@@ -0,0 +1,236 @@
+{-# 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.LookoutVision.StopModel
+-- 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 the hosting of a running model. The operation might take a while
+-- to complete. To check the current status, call DescribeModel.
+--
+-- After the model hosting stops, the @Status@ of the model is @TRAINED@.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:StopModel@ operation.
+module Amazonka.LookoutVision.StopModel
+  ( -- * Creating a Request
+    StopModel (..),
+    newStopModel,
+
+    -- * Request Lenses
+    stopModel_clientToken,
+    stopModel_projectName,
+    stopModel_modelVersion,
+
+    -- * Destructuring the Response
+    StopModelResponse (..),
+    newStopModelResponse,
+
+    -- * Response Lenses
+    stopModelResponse_status,
+    stopModelResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newStopModel' smart constructor.
+data StopModel = StopModel'
+  { -- | ClientToken is an idempotency token that ensures a call to @StopModel@
+    -- completes only once. You choose the value to pass. For example, An issue
+    -- might prevent you from getting a response from @StopModel@. In this
+    -- case, safely retry your call to @StopModel@ by using the same
+    -- @ClientToken@ parameter value.
+    --
+    -- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+    -- using inserts a value for you. This prevents retries after a network
+    -- error from making multiple stop requests. You\'ll need to provide your
+    -- own value for other use cases.
+    --
+    -- An error occurs if the other input parameters are not the same as in the
+    -- first request. Using a different value for @ClientToken@ is considered a
+    -- new call to @StopModel@. An idempotency token is active for 8 hours.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the project that contains the model that you want to stop.
+    projectName :: Prelude.Text,
+    -- | The version of the model that you want to stop.
+    modelVersion :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StopModel' 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:
+--
+-- 'clientToken', 'stopModel_clientToken' - ClientToken is an idempotency token that ensures a call to @StopModel@
+-- completes only once. You choose the value to pass. For example, An issue
+-- might prevent you from getting a response from @StopModel@. In this
+-- case, safely retry your call to @StopModel@ by using the same
+-- @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple stop requests. You\'ll need to provide your
+-- own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @StopModel@. An idempotency token is active for 8 hours.
+--
+-- 'projectName', 'stopModel_projectName' - The name of the project that contains the model that you want to stop.
+--
+-- 'modelVersion', 'stopModel_modelVersion' - The version of the model that you want to stop.
+newStopModel ::
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'modelVersion'
+  Prelude.Text ->
+  StopModel
+newStopModel pProjectName_ pModelVersion_ =
+  StopModel'
+    { clientToken = Prelude.Nothing,
+      projectName = pProjectName_,
+      modelVersion = pModelVersion_
+    }
+
+-- | ClientToken is an idempotency token that ensures a call to @StopModel@
+-- completes only once. You choose the value to pass. For example, An issue
+-- might prevent you from getting a response from @StopModel@. In this
+-- case, safely retry your call to @StopModel@ by using the same
+-- @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple stop requests. You\'ll need to provide your
+-- own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @StopModel@. An idempotency token is active for 8 hours.
+stopModel_clientToken :: Lens.Lens' StopModel (Prelude.Maybe Prelude.Text)
+stopModel_clientToken = Lens.lens (\StopModel' {clientToken} -> clientToken) (\s@StopModel' {} a -> s {clientToken = a} :: StopModel)
+
+-- | The name of the project that contains the model that you want to stop.
+stopModel_projectName :: Lens.Lens' StopModel Prelude.Text
+stopModel_projectName = Lens.lens (\StopModel' {projectName} -> projectName) (\s@StopModel' {} a -> s {projectName = a} :: StopModel)
+
+-- | The version of the model that you want to stop.
+stopModel_modelVersion :: Lens.Lens' StopModel Prelude.Text
+stopModel_modelVersion = Lens.lens (\StopModel' {modelVersion} -> modelVersion) (\s@StopModel' {} a -> s {modelVersion = a} :: StopModel)
+
+instance Core.AWSRequest StopModel where
+  type AWSResponse StopModel = StopModelResponse
+  request overrides =
+    Request.postJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          StopModelResponse'
+            Prelude.<$> (x Data..?> "Status")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable StopModel where
+  hashWithSalt _salt StopModel' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` modelVersion
+
+instance Prelude.NFData StopModel where
+  rnf StopModel' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf modelVersion
+
+instance Data.ToHeaders StopModel where
+  toHeaders StopModel' {..} =
+    Prelude.mconcat
+      [ "X-Amzn-Client-Token" Data.=# clientToken,
+        "Content-Type"
+          Data.=# ("application/x-amz-json-1.1" :: Prelude.ByteString)
+      ]
+
+instance Data.ToJSON StopModel where
+  toJSON = Prelude.const (Data.Object Prelude.mempty)
+
+instance Data.ToPath StopModel where
+  toPath StopModel' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/models/",
+        Data.toBS modelVersion,
+        "/stop"
+      ]
+
+instance Data.ToQuery StopModel where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newStopModelResponse' smart constructor.
+data StopModelResponse = StopModelResponse'
+  { -- | The status of the model.
+    status :: Prelude.Maybe ModelHostingStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'StopModelResponse' 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:
+--
+-- 'status', 'stopModelResponse_status' - The status of the model.
+--
+-- 'httpStatus', 'stopModelResponse_httpStatus' - The response's http status code.
+newStopModelResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  StopModelResponse
+newStopModelResponse pHttpStatus_ =
+  StopModelResponse'
+    { status = Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The status of the model.
+stopModelResponse_status :: Lens.Lens' StopModelResponse (Prelude.Maybe ModelHostingStatus)
+stopModelResponse_status = Lens.lens (\StopModelResponse' {status} -> status) (\s@StopModelResponse' {} a -> s {status = a} :: StopModelResponse)
+
+-- | The response's http status code.
+stopModelResponse_httpStatus :: Lens.Lens' StopModelResponse Prelude.Int
+stopModelResponse_httpStatus = Lens.lens (\StopModelResponse' {httpStatus} -> httpStatus) (\s@StopModelResponse' {} a -> s {httpStatus = a} :: StopModelResponse)
+
+instance Prelude.NFData StopModelResponse where
+  rnf StopModelResponse' {..} =
+    Prelude.rnf status
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/TagResource.hs b/gen/Amazonka/LookoutVision/TagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/TagResource.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.LookoutVision.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)
+--
+-- Adds one or more key-value tags to an Amazon Lookout for Vision model.
+-- For more information, see /Tagging a model/ in the /Amazon Lookout for
+-- Vision Developer Guide/.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:TagResource@ operation.
+module Amazonka.LookoutVision.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.LookoutVision.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 Amazon Resource Name (ARN) of the model to assign the tags.
+    resourceArn :: Prelude.Text,
+    -- | The key-value tags to assign to the model.
+    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 Amazon Resource Name (ARN) of the model to assign the tags.
+--
+-- 'tags', 'tagResource_tags' - The key-value tags to assign to the model.
+newTagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  TagResource
+newTagResource pResourceArn_ =
+  TagResource'
+    { resourceArn = pResourceArn_,
+      tags = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the model to assign the tags.
+tagResource_resourceArn :: Lens.Lens' TagResource Prelude.Text
+tagResource_resourceArn = Lens.lens (\TagResource' {resourceArn} -> resourceArn) (\s@TagResource' {} a -> s {resourceArn = a} :: TagResource)
+
+-- | The key-value tags to assign to the model.
+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
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToJSON TagResource where
+  toJSON TagResource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("Tags" Data..= tags)]
+      )
+
+instance Data.ToPath TagResource where
+  toPath TagResource' {..} =
+    Prelude.mconcat
+      ["/2020-11-20/tags/", Data.toBS resourceArn]
+
+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/LookoutVision/Types.hs b/gen/Amazonka/LookoutVision/Types.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types.hs
@@ -0,0 +1,431 @@
+{-# 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.LookoutVision.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.LookoutVision.Types
+  ( -- * Service Configuration
+    defaultService,
+
+    -- * Errors
+    _AccessDeniedException,
+    _ConflictException,
+    _InternalServerException,
+    _ResourceNotFoundException,
+    _ServiceQuotaExceededException,
+    _ThrottlingException,
+    _ValidationException,
+
+    -- * DatasetStatus
+    DatasetStatus (..),
+
+    -- * ModelHostingStatus
+    ModelHostingStatus (..),
+
+    -- * ModelPackagingJobStatus
+    ModelPackagingJobStatus (..),
+
+    -- * ModelStatus
+    ModelStatus (..),
+
+    -- * TargetDevice
+    TargetDevice (..),
+
+    -- * TargetPlatformAccelerator
+    TargetPlatformAccelerator (..),
+
+    -- * TargetPlatformArch
+    TargetPlatformArch (..),
+
+    -- * TargetPlatformOs
+    TargetPlatformOs (..),
+
+    -- * Anomaly
+    Anomaly (..),
+    newAnomaly,
+    anomaly_name,
+    anomaly_pixelAnomaly,
+
+    -- * DatasetDescription
+    DatasetDescription (..),
+    newDatasetDescription,
+    datasetDescription_creationTimestamp,
+    datasetDescription_datasetType,
+    datasetDescription_imageStats,
+    datasetDescription_lastUpdatedTimestamp,
+    datasetDescription_projectName,
+    datasetDescription_status,
+    datasetDescription_statusMessage,
+
+    -- * DatasetGroundTruthManifest
+    DatasetGroundTruthManifest (..),
+    newDatasetGroundTruthManifest,
+    datasetGroundTruthManifest_s3Object,
+
+    -- * DatasetImageStats
+    DatasetImageStats (..),
+    newDatasetImageStats,
+    datasetImageStats_anomaly,
+    datasetImageStats_labeled,
+    datasetImageStats_normal,
+    datasetImageStats_total,
+
+    -- * DatasetMetadata
+    DatasetMetadata (..),
+    newDatasetMetadata,
+    datasetMetadata_creationTimestamp,
+    datasetMetadata_datasetType,
+    datasetMetadata_status,
+    datasetMetadata_statusMessage,
+
+    -- * DatasetSource
+    DatasetSource (..),
+    newDatasetSource,
+    datasetSource_groundTruthManifest,
+
+    -- * DetectAnomalyResult
+    DetectAnomalyResult (..),
+    newDetectAnomalyResult,
+    detectAnomalyResult_anomalies,
+    detectAnomalyResult_anomalyMask,
+    detectAnomalyResult_confidence,
+    detectAnomalyResult_isAnomalous,
+    detectAnomalyResult_source,
+
+    -- * GreengrassConfiguration
+    GreengrassConfiguration (..),
+    newGreengrassConfiguration,
+    greengrassConfiguration_compilerOptions,
+    greengrassConfiguration_componentDescription,
+    greengrassConfiguration_componentVersion,
+    greengrassConfiguration_tags,
+    greengrassConfiguration_targetDevice,
+    greengrassConfiguration_targetPlatform,
+    greengrassConfiguration_s3OutputLocation,
+    greengrassConfiguration_componentName,
+
+    -- * GreengrassOutputDetails
+    GreengrassOutputDetails (..),
+    newGreengrassOutputDetails,
+    greengrassOutputDetails_componentName,
+    greengrassOutputDetails_componentVersion,
+    greengrassOutputDetails_componentVersionArn,
+
+    -- * ImageSource
+    ImageSource (..),
+    newImageSource,
+    imageSource_type,
+
+    -- * InputS3Object
+    InputS3Object (..),
+    newInputS3Object,
+    inputS3Object_versionId,
+    inputS3Object_bucket,
+    inputS3Object_key,
+
+    -- * ModelDescription
+    ModelDescription (..),
+    newModelDescription,
+    modelDescription_creationTimestamp,
+    modelDescription_description,
+    modelDescription_evaluationEndTimestamp,
+    modelDescription_evaluationManifest,
+    modelDescription_evaluationResult,
+    modelDescription_kmsKeyId,
+    modelDescription_maxInferenceUnits,
+    modelDescription_minInferenceUnits,
+    modelDescription_modelArn,
+    modelDescription_modelVersion,
+    modelDescription_outputConfig,
+    modelDescription_performance,
+    modelDescription_status,
+    modelDescription_statusMessage,
+
+    -- * ModelMetadata
+    ModelMetadata (..),
+    newModelMetadata,
+    modelMetadata_creationTimestamp,
+    modelMetadata_description,
+    modelMetadata_modelArn,
+    modelMetadata_modelVersion,
+    modelMetadata_performance,
+    modelMetadata_status,
+    modelMetadata_statusMessage,
+
+    -- * ModelPackagingConfiguration
+    ModelPackagingConfiguration (..),
+    newModelPackagingConfiguration,
+    modelPackagingConfiguration_greengrass,
+
+    -- * ModelPackagingDescription
+    ModelPackagingDescription (..),
+    newModelPackagingDescription,
+    modelPackagingDescription_creationTimestamp,
+    modelPackagingDescription_jobName,
+    modelPackagingDescription_lastUpdatedTimestamp,
+    modelPackagingDescription_modelPackagingConfiguration,
+    modelPackagingDescription_modelPackagingJobDescription,
+    modelPackagingDescription_modelPackagingMethod,
+    modelPackagingDescription_modelPackagingOutputDetails,
+    modelPackagingDescription_modelVersion,
+    modelPackagingDescription_projectName,
+    modelPackagingDescription_status,
+    modelPackagingDescription_statusMessage,
+
+    -- * ModelPackagingJobMetadata
+    ModelPackagingJobMetadata (..),
+    newModelPackagingJobMetadata,
+    modelPackagingJobMetadata_creationTimestamp,
+    modelPackagingJobMetadata_jobName,
+    modelPackagingJobMetadata_lastUpdatedTimestamp,
+    modelPackagingJobMetadata_modelPackagingJobDescription,
+    modelPackagingJobMetadata_modelPackagingMethod,
+    modelPackagingJobMetadata_modelVersion,
+    modelPackagingJobMetadata_projectName,
+    modelPackagingJobMetadata_status,
+    modelPackagingJobMetadata_statusMessage,
+
+    -- * ModelPackagingOutputDetails
+    ModelPackagingOutputDetails (..),
+    newModelPackagingOutputDetails,
+    modelPackagingOutputDetails_greengrass,
+
+    -- * ModelPerformance
+    ModelPerformance (..),
+    newModelPerformance,
+    modelPerformance_f1Score,
+    modelPerformance_precision,
+    modelPerformance_recall,
+
+    -- * OutputConfig
+    OutputConfig (..),
+    newOutputConfig,
+    outputConfig_s3Location,
+
+    -- * OutputS3Object
+    OutputS3Object (..),
+    newOutputS3Object,
+    outputS3Object_bucket,
+    outputS3Object_key,
+
+    -- * PixelAnomaly
+    PixelAnomaly (..),
+    newPixelAnomaly,
+    pixelAnomaly_color,
+    pixelAnomaly_totalPercentageArea,
+
+    -- * ProjectDescription
+    ProjectDescription (..),
+    newProjectDescription,
+    projectDescription_creationTimestamp,
+    projectDescription_datasets,
+    projectDescription_projectArn,
+    projectDescription_projectName,
+
+    -- * ProjectMetadata
+    ProjectMetadata (..),
+    newProjectMetadata,
+    projectMetadata_creationTimestamp,
+    projectMetadata_projectArn,
+    projectMetadata_projectName,
+
+    -- * S3Location
+    S3Location (..),
+    newS3Location,
+    s3Location_prefix,
+    s3Location_bucket,
+
+    -- * Tag
+    Tag (..),
+    newTag,
+    tag_key,
+    tag_value,
+
+    -- * TargetPlatform
+    TargetPlatform (..),
+    newTargetPlatform,
+    targetPlatform_accelerator,
+    targetPlatform_os,
+    targetPlatform_arch,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import Amazonka.LookoutVision.Types.Anomaly
+import Amazonka.LookoutVision.Types.DatasetDescription
+import Amazonka.LookoutVision.Types.DatasetGroundTruthManifest
+import Amazonka.LookoutVision.Types.DatasetImageStats
+import Amazonka.LookoutVision.Types.DatasetMetadata
+import Amazonka.LookoutVision.Types.DatasetSource
+import Amazonka.LookoutVision.Types.DatasetStatus
+import Amazonka.LookoutVision.Types.DetectAnomalyResult
+import Amazonka.LookoutVision.Types.GreengrassConfiguration
+import Amazonka.LookoutVision.Types.GreengrassOutputDetails
+import Amazonka.LookoutVision.Types.ImageSource
+import Amazonka.LookoutVision.Types.InputS3Object
+import Amazonka.LookoutVision.Types.ModelDescription
+import Amazonka.LookoutVision.Types.ModelHostingStatus
+import Amazonka.LookoutVision.Types.ModelMetadata
+import Amazonka.LookoutVision.Types.ModelPackagingConfiguration
+import Amazonka.LookoutVision.Types.ModelPackagingDescription
+import Amazonka.LookoutVision.Types.ModelPackagingJobMetadata
+import Amazonka.LookoutVision.Types.ModelPackagingJobStatus
+import Amazonka.LookoutVision.Types.ModelPackagingOutputDetails
+import Amazonka.LookoutVision.Types.ModelPerformance
+import Amazonka.LookoutVision.Types.ModelStatus
+import Amazonka.LookoutVision.Types.OutputConfig
+import Amazonka.LookoutVision.Types.OutputS3Object
+import Amazonka.LookoutVision.Types.PixelAnomaly
+import Amazonka.LookoutVision.Types.ProjectDescription
+import Amazonka.LookoutVision.Types.ProjectMetadata
+import Amazonka.LookoutVision.Types.S3Location
+import Amazonka.LookoutVision.Types.Tag
+import Amazonka.LookoutVision.Types.TargetDevice
+import Amazonka.LookoutVision.Types.TargetPlatform
+import Amazonka.LookoutVision.Types.TargetPlatformAccelerator
+import Amazonka.LookoutVision.Types.TargetPlatformArch
+import Amazonka.LookoutVision.Types.TargetPlatformOs
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Sign.V4 as Sign
+
+-- | API version @2020-11-20@ of the Amazon Lookout for Vision SDK configuration.
+defaultService :: Core.Service
+defaultService =
+  Core.Service
+    { Core.abbrev = "LookoutVision",
+      Core.signer = Sign.v4,
+      Core.endpointPrefix = "lookoutvision",
+      Core.signingName = "lookoutvision",
+      Core.version = "2020-11-20",
+      Core.s3AddressingStyle = Core.S3AddressingStyleAuto,
+      Core.endpoint = Core.defaultEndpoint defaultService,
+      Core.timeout = Prelude.Just 70,
+      Core.check = Core.statusSuccess,
+      Core.error = Core.parseJSONError "LookoutVision",
+      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
+
+-- | You are not authorized to perform the action.
+_AccessDeniedException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_AccessDeniedException =
+  Core._MatchServiceError
+    defaultService
+    "AccessDeniedException"
+    Prelude.. Core.hasStatus 403
+
+-- | The update or deletion of a resource caused an inconsistent state.
+_ConflictException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ConflictException =
+  Core._MatchServiceError
+    defaultService
+    "ConflictException"
+    Prelude.. Core.hasStatus 409
+
+-- | Amazon Lookout for Vision experienced a service issue. Try your call
+-- again.
+_InternalServerException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_InternalServerException =
+  Core._MatchServiceError
+    defaultService
+    "InternalServerException"
+    Prelude.. Core.hasStatus 500
+
+-- | The resource could not be found.
+_ResourceNotFoundException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ResourceNotFoundException =
+  Core._MatchServiceError
+    defaultService
+    "ResourceNotFoundException"
+    Prelude.. Core.hasStatus 404
+
+-- | A service quota was exceeded the allowed limit. For more information,
+-- see Limits in Amazon Lookout for Vision in the Amazon Lookout for Vision
+-- Developer Guide.
+_ServiceQuotaExceededException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ServiceQuotaExceededException =
+  Core._MatchServiceError
+    defaultService
+    "ServiceQuotaExceededException"
+    Prelude.. Core.hasStatus 402
+
+-- | Amazon Lookout for Vision is temporarily unable to process the request.
+-- Try your call again.
+_ThrottlingException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ThrottlingException =
+  Core._MatchServiceError
+    defaultService
+    "ThrottlingException"
+    Prelude.. Core.hasStatus 429
+
+-- | An input validation error occured. For example, invalid characters in a
+-- project name, or if a pagination token is invalid.
+_ValidationException :: (Core.AsError a) => Lens.Fold a Core.ServiceError
+_ValidationException =
+  Core._MatchServiceError
+    defaultService
+    "ValidationException"
+    Prelude.. Core.hasStatus 400
diff --git a/gen/Amazonka/LookoutVision/Types/Anomaly.hs b/gen/Amazonka/LookoutVision/Types/Anomaly.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/Anomaly.hs
@@ -0,0 +1,95 @@
+{-# 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.LookoutVision.Types.Anomaly
+-- 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.LookoutVision.Types.Anomaly where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.PixelAnomaly
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about an anomaly type found on an image by an image
+-- segmentation model. For more information, see DetectAnomalies.
+--
+-- /See:/ 'newAnomaly' smart constructor.
+data Anomaly = Anomaly'
+  { -- | The name of an anomaly type found in an image. @Name@ maps to an anomaly
+    -- type in the training dataset, apart from the anomaly type @background@.
+    -- The service automatically inserts the @background@ anomaly type into the
+    -- response from @DetectAnomalies@.
+    name :: Prelude.Maybe Prelude.Text,
+    -- | Information about the pixel mask that covers an anomaly type.
+    pixelAnomaly :: Prelude.Maybe PixelAnomaly
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'Anomaly' 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', 'anomaly_name' - The name of an anomaly type found in an image. @Name@ maps to an anomaly
+-- type in the training dataset, apart from the anomaly type @background@.
+-- The service automatically inserts the @background@ anomaly type into the
+-- response from @DetectAnomalies@.
+--
+-- 'pixelAnomaly', 'anomaly_pixelAnomaly' - Information about the pixel mask that covers an anomaly type.
+newAnomaly ::
+  Anomaly
+newAnomaly =
+  Anomaly'
+    { name = Prelude.Nothing,
+      pixelAnomaly = Prelude.Nothing
+    }
+
+-- | The name of an anomaly type found in an image. @Name@ maps to an anomaly
+-- type in the training dataset, apart from the anomaly type @background@.
+-- The service automatically inserts the @background@ anomaly type into the
+-- response from @DetectAnomalies@.
+anomaly_name :: Lens.Lens' Anomaly (Prelude.Maybe Prelude.Text)
+anomaly_name = Lens.lens (\Anomaly' {name} -> name) (\s@Anomaly' {} a -> s {name = a} :: Anomaly)
+
+-- | Information about the pixel mask that covers an anomaly type.
+anomaly_pixelAnomaly :: Lens.Lens' Anomaly (Prelude.Maybe PixelAnomaly)
+anomaly_pixelAnomaly = Lens.lens (\Anomaly' {pixelAnomaly} -> pixelAnomaly) (\s@Anomaly' {} a -> s {pixelAnomaly = a} :: Anomaly)
+
+instance Data.FromJSON Anomaly where
+  parseJSON =
+    Data.withObject
+      "Anomaly"
+      ( \x ->
+          Anomaly'
+            Prelude.<$> (x Data..:? "Name")
+            Prelude.<*> (x Data..:? "PixelAnomaly")
+      )
+
+instance Prelude.Hashable Anomaly where
+  hashWithSalt _salt Anomaly' {..} =
+    _salt
+      `Prelude.hashWithSalt` name
+      `Prelude.hashWithSalt` pixelAnomaly
+
+instance Prelude.NFData Anomaly where
+  rnf Anomaly' {..} =
+    Prelude.rnf name
+      `Prelude.seq` Prelude.rnf pixelAnomaly
diff --git a/gen/Amazonka/LookoutVision/Types/DatasetDescription.hs b/gen/Amazonka/LookoutVision/Types/DatasetDescription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/DatasetDescription.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.LookoutVision.Types.DatasetDescription
+-- 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.LookoutVision.Types.DatasetDescription where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.DatasetImageStats
+import Amazonka.LookoutVision.Types.DatasetStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | The description for a dataset. For more information, see
+-- DescribeDataset.
+--
+-- /See:/ 'newDatasetDescription' smart constructor.
+data DatasetDescription = DatasetDescription'
+  { -- | The Unix timestamp for the time and date that the dataset was created.
+    creationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The type of the dataset. The value @train@ represents a training dataset
+    -- or single dataset project. The value @test@ represents a test dataset.
+    datasetType :: Prelude.Maybe Prelude.Text,
+    -- | Statistics about the images in a dataset.
+    imageStats :: Prelude.Maybe DatasetImageStats,
+    -- | The Unix timestamp for the date and time that the dataset was last
+    -- updated.
+    lastUpdatedTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The name of the project that contains the dataset.
+    projectName :: Prelude.Maybe Prelude.Text,
+    -- | The status of the dataset.
+    status :: Prelude.Maybe DatasetStatus,
+    -- | The status message for the dataset.
+    statusMessage :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetDescription' 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:
+--
+-- 'creationTimestamp', 'datasetDescription_creationTimestamp' - The Unix timestamp for the time and date that the dataset was created.
+--
+-- 'datasetType', 'datasetDescription_datasetType' - The type of the dataset. The value @train@ represents a training dataset
+-- or single dataset project. The value @test@ represents a test dataset.
+--
+-- 'imageStats', 'datasetDescription_imageStats' - Statistics about the images in a dataset.
+--
+-- 'lastUpdatedTimestamp', 'datasetDescription_lastUpdatedTimestamp' - The Unix timestamp for the date and time that the dataset was last
+-- updated.
+--
+-- 'projectName', 'datasetDescription_projectName' - The name of the project that contains the dataset.
+--
+-- 'status', 'datasetDescription_status' - The status of the dataset.
+--
+-- 'statusMessage', 'datasetDescription_statusMessage' - The status message for the dataset.
+newDatasetDescription ::
+  DatasetDescription
+newDatasetDescription =
+  DatasetDescription'
+    { creationTimestamp =
+        Prelude.Nothing,
+      datasetType = Prelude.Nothing,
+      imageStats = Prelude.Nothing,
+      lastUpdatedTimestamp = Prelude.Nothing,
+      projectName = Prelude.Nothing,
+      status = Prelude.Nothing,
+      statusMessage = Prelude.Nothing
+    }
+
+-- | The Unix timestamp for the time and date that the dataset was created.
+datasetDescription_creationTimestamp :: Lens.Lens' DatasetDescription (Prelude.Maybe Prelude.UTCTime)
+datasetDescription_creationTimestamp = Lens.lens (\DatasetDescription' {creationTimestamp} -> creationTimestamp) (\s@DatasetDescription' {} a -> s {creationTimestamp = a} :: DatasetDescription) Prelude.. Lens.mapping Data._Time
+
+-- | The type of the dataset. The value @train@ represents a training dataset
+-- or single dataset project. The value @test@ represents a test dataset.
+datasetDescription_datasetType :: Lens.Lens' DatasetDescription (Prelude.Maybe Prelude.Text)
+datasetDescription_datasetType = Lens.lens (\DatasetDescription' {datasetType} -> datasetType) (\s@DatasetDescription' {} a -> s {datasetType = a} :: DatasetDescription)
+
+-- | Statistics about the images in a dataset.
+datasetDescription_imageStats :: Lens.Lens' DatasetDescription (Prelude.Maybe DatasetImageStats)
+datasetDescription_imageStats = Lens.lens (\DatasetDescription' {imageStats} -> imageStats) (\s@DatasetDescription' {} a -> s {imageStats = a} :: DatasetDescription)
+
+-- | The Unix timestamp for the date and time that the dataset was last
+-- updated.
+datasetDescription_lastUpdatedTimestamp :: Lens.Lens' DatasetDescription (Prelude.Maybe Prelude.UTCTime)
+datasetDescription_lastUpdatedTimestamp = Lens.lens (\DatasetDescription' {lastUpdatedTimestamp} -> lastUpdatedTimestamp) (\s@DatasetDescription' {} a -> s {lastUpdatedTimestamp = a} :: DatasetDescription) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the project that contains the dataset.
+datasetDescription_projectName :: Lens.Lens' DatasetDescription (Prelude.Maybe Prelude.Text)
+datasetDescription_projectName = Lens.lens (\DatasetDescription' {projectName} -> projectName) (\s@DatasetDescription' {} a -> s {projectName = a} :: DatasetDescription)
+
+-- | The status of the dataset.
+datasetDescription_status :: Lens.Lens' DatasetDescription (Prelude.Maybe DatasetStatus)
+datasetDescription_status = Lens.lens (\DatasetDescription' {status} -> status) (\s@DatasetDescription' {} a -> s {status = a} :: DatasetDescription)
+
+-- | The status message for the dataset.
+datasetDescription_statusMessage :: Lens.Lens' DatasetDescription (Prelude.Maybe Prelude.Text)
+datasetDescription_statusMessage = Lens.lens (\DatasetDescription' {statusMessage} -> statusMessage) (\s@DatasetDescription' {} a -> s {statusMessage = a} :: DatasetDescription)
+
+instance Data.FromJSON DatasetDescription where
+  parseJSON =
+    Data.withObject
+      "DatasetDescription"
+      ( \x ->
+          DatasetDescription'
+            Prelude.<$> (x Data..:? "CreationTimestamp")
+            Prelude.<*> (x Data..:? "DatasetType")
+            Prelude.<*> (x Data..:? "ImageStats")
+            Prelude.<*> (x Data..:? "LastUpdatedTimestamp")
+            Prelude.<*> (x Data..:? "ProjectName")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "StatusMessage")
+      )
+
+instance Prelude.Hashable DatasetDescription where
+  hashWithSalt _salt DatasetDescription' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationTimestamp
+      `Prelude.hashWithSalt` datasetType
+      `Prelude.hashWithSalt` imageStats
+      `Prelude.hashWithSalt` lastUpdatedTimestamp
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` statusMessage
+
+instance Prelude.NFData DatasetDescription where
+  rnf DatasetDescription' {..} =
+    Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf datasetType
+      `Prelude.seq` Prelude.rnf imageStats
+      `Prelude.seq` Prelude.rnf lastUpdatedTimestamp
+      `Prelude.seq` Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf statusMessage
diff --git a/gen/Amazonka/LookoutVision/Types/DatasetGroundTruthManifest.hs b/gen/Amazonka/LookoutVision/Types/DatasetGroundTruthManifest.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/DatasetGroundTruthManifest.hs
@@ -0,0 +1,72 @@
+{-# 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.LookoutVision.Types.DatasetGroundTruthManifest
+-- 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.LookoutVision.Types.DatasetGroundTruthManifest where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.InputS3Object
+import qualified Amazonka.Prelude as Prelude
+
+-- | Location information about a manifest file. You can use a manifest file
+-- to create a dataset.
+--
+-- /See:/ 'newDatasetGroundTruthManifest' smart constructor.
+data DatasetGroundTruthManifest = DatasetGroundTruthManifest'
+  { -- | The S3 bucket location for the manifest file.
+    s3Object :: Prelude.Maybe InputS3Object
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetGroundTruthManifest' 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:
+--
+-- 's3Object', 'datasetGroundTruthManifest_s3Object' - The S3 bucket location for the manifest file.
+newDatasetGroundTruthManifest ::
+  DatasetGroundTruthManifest
+newDatasetGroundTruthManifest =
+  DatasetGroundTruthManifest'
+    { s3Object =
+        Prelude.Nothing
+    }
+
+-- | The S3 bucket location for the manifest file.
+datasetGroundTruthManifest_s3Object :: Lens.Lens' DatasetGroundTruthManifest (Prelude.Maybe InputS3Object)
+datasetGroundTruthManifest_s3Object = Lens.lens (\DatasetGroundTruthManifest' {s3Object} -> s3Object) (\s@DatasetGroundTruthManifest' {} a -> s {s3Object = a} :: DatasetGroundTruthManifest)
+
+instance Prelude.Hashable DatasetGroundTruthManifest where
+  hashWithSalt _salt DatasetGroundTruthManifest' {..} =
+    _salt `Prelude.hashWithSalt` s3Object
+
+instance Prelude.NFData DatasetGroundTruthManifest where
+  rnf DatasetGroundTruthManifest' {..} =
+    Prelude.rnf s3Object
+
+instance Data.ToJSON DatasetGroundTruthManifest where
+  toJSON DatasetGroundTruthManifest' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [("S3Object" Data..=) Prelude.<$> s3Object]
+      )
diff --git a/gen/Amazonka/LookoutVision/Types/DatasetImageStats.hs b/gen/Amazonka/LookoutVision/Types/DatasetImageStats.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/DatasetImageStats.hs
@@ -0,0 +1,108 @@
+{-# 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.LookoutVision.Types.DatasetImageStats
+-- 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.LookoutVision.Types.DatasetImageStats 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
+
+-- | Statistics about the images in a dataset.
+--
+-- /See:/ 'newDatasetImageStats' smart constructor.
+data DatasetImageStats = DatasetImageStats'
+  { -- | the total number of images labeled as an anomaly.
+    anomaly :: Prelude.Maybe Prelude.Int,
+    -- | The total number of labeled images.
+    labeled :: Prelude.Maybe Prelude.Int,
+    -- | The total number of images labeled as normal.
+    normal :: Prelude.Maybe Prelude.Int,
+    -- | The total number of images in the dataset.
+    total :: Prelude.Maybe Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetImageStats' 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:
+--
+-- 'anomaly', 'datasetImageStats_anomaly' - the total number of images labeled as an anomaly.
+--
+-- 'labeled', 'datasetImageStats_labeled' - The total number of labeled images.
+--
+-- 'normal', 'datasetImageStats_normal' - The total number of images labeled as normal.
+--
+-- 'total', 'datasetImageStats_total' - The total number of images in the dataset.
+newDatasetImageStats ::
+  DatasetImageStats
+newDatasetImageStats =
+  DatasetImageStats'
+    { anomaly = Prelude.Nothing,
+      labeled = Prelude.Nothing,
+      normal = Prelude.Nothing,
+      total = Prelude.Nothing
+    }
+
+-- | the total number of images labeled as an anomaly.
+datasetImageStats_anomaly :: Lens.Lens' DatasetImageStats (Prelude.Maybe Prelude.Int)
+datasetImageStats_anomaly = Lens.lens (\DatasetImageStats' {anomaly} -> anomaly) (\s@DatasetImageStats' {} a -> s {anomaly = a} :: DatasetImageStats)
+
+-- | The total number of labeled images.
+datasetImageStats_labeled :: Lens.Lens' DatasetImageStats (Prelude.Maybe Prelude.Int)
+datasetImageStats_labeled = Lens.lens (\DatasetImageStats' {labeled} -> labeled) (\s@DatasetImageStats' {} a -> s {labeled = a} :: DatasetImageStats)
+
+-- | The total number of images labeled as normal.
+datasetImageStats_normal :: Lens.Lens' DatasetImageStats (Prelude.Maybe Prelude.Int)
+datasetImageStats_normal = Lens.lens (\DatasetImageStats' {normal} -> normal) (\s@DatasetImageStats' {} a -> s {normal = a} :: DatasetImageStats)
+
+-- | The total number of images in the dataset.
+datasetImageStats_total :: Lens.Lens' DatasetImageStats (Prelude.Maybe Prelude.Int)
+datasetImageStats_total = Lens.lens (\DatasetImageStats' {total} -> total) (\s@DatasetImageStats' {} a -> s {total = a} :: DatasetImageStats)
+
+instance Data.FromJSON DatasetImageStats where
+  parseJSON =
+    Data.withObject
+      "DatasetImageStats"
+      ( \x ->
+          DatasetImageStats'
+            Prelude.<$> (x Data..:? "Anomaly")
+            Prelude.<*> (x Data..:? "Labeled")
+            Prelude.<*> (x Data..:? "Normal")
+            Prelude.<*> (x Data..:? "Total")
+      )
+
+instance Prelude.Hashable DatasetImageStats where
+  hashWithSalt _salt DatasetImageStats' {..} =
+    _salt
+      `Prelude.hashWithSalt` anomaly
+      `Prelude.hashWithSalt` labeled
+      `Prelude.hashWithSalt` normal
+      `Prelude.hashWithSalt` total
+
+instance Prelude.NFData DatasetImageStats where
+  rnf DatasetImageStats' {..} =
+    Prelude.rnf anomaly
+      `Prelude.seq` Prelude.rnf labeled
+      `Prelude.seq` Prelude.rnf normal
+      `Prelude.seq` Prelude.rnf total
diff --git a/gen/Amazonka/LookoutVision/Types/DatasetMetadata.hs b/gen/Amazonka/LookoutVision/Types/DatasetMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/DatasetMetadata.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.LookoutVision.Types.DatasetMetadata
+-- 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.LookoutVision.Types.DatasetMetadata where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.DatasetStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Summary information for an Amazon Lookout for Vision dataset. For more
+-- information, see DescribeDataset and ProjectDescription.
+--
+-- /See:/ 'newDatasetMetadata' smart constructor.
+data DatasetMetadata = DatasetMetadata'
+  { -- | The Unix timestamp for the date and time that the dataset was created.
+    creationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The type of the dataset.
+    datasetType :: Prelude.Maybe Prelude.Text,
+    -- | The status for the dataset.
+    status :: Prelude.Maybe DatasetStatus,
+    -- | The status message for the dataset.
+    statusMessage :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetMetadata' 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:
+--
+-- 'creationTimestamp', 'datasetMetadata_creationTimestamp' - The Unix timestamp for the date and time that the dataset was created.
+--
+-- 'datasetType', 'datasetMetadata_datasetType' - The type of the dataset.
+--
+-- 'status', 'datasetMetadata_status' - The status for the dataset.
+--
+-- 'statusMessage', 'datasetMetadata_statusMessage' - The status message for the dataset.
+newDatasetMetadata ::
+  DatasetMetadata
+newDatasetMetadata =
+  DatasetMetadata'
+    { creationTimestamp =
+        Prelude.Nothing,
+      datasetType = Prelude.Nothing,
+      status = Prelude.Nothing,
+      statusMessage = Prelude.Nothing
+    }
+
+-- | The Unix timestamp for the date and time that the dataset was created.
+datasetMetadata_creationTimestamp :: Lens.Lens' DatasetMetadata (Prelude.Maybe Prelude.UTCTime)
+datasetMetadata_creationTimestamp = Lens.lens (\DatasetMetadata' {creationTimestamp} -> creationTimestamp) (\s@DatasetMetadata' {} a -> s {creationTimestamp = a} :: DatasetMetadata) Prelude.. Lens.mapping Data._Time
+
+-- | The type of the dataset.
+datasetMetadata_datasetType :: Lens.Lens' DatasetMetadata (Prelude.Maybe Prelude.Text)
+datasetMetadata_datasetType = Lens.lens (\DatasetMetadata' {datasetType} -> datasetType) (\s@DatasetMetadata' {} a -> s {datasetType = a} :: DatasetMetadata)
+
+-- | The status for the dataset.
+datasetMetadata_status :: Lens.Lens' DatasetMetadata (Prelude.Maybe DatasetStatus)
+datasetMetadata_status = Lens.lens (\DatasetMetadata' {status} -> status) (\s@DatasetMetadata' {} a -> s {status = a} :: DatasetMetadata)
+
+-- | The status message for the dataset.
+datasetMetadata_statusMessage :: Lens.Lens' DatasetMetadata (Prelude.Maybe Prelude.Text)
+datasetMetadata_statusMessage = Lens.lens (\DatasetMetadata' {statusMessage} -> statusMessage) (\s@DatasetMetadata' {} a -> s {statusMessage = a} :: DatasetMetadata)
+
+instance Data.FromJSON DatasetMetadata where
+  parseJSON =
+    Data.withObject
+      "DatasetMetadata"
+      ( \x ->
+          DatasetMetadata'
+            Prelude.<$> (x Data..:? "CreationTimestamp")
+            Prelude.<*> (x Data..:? "DatasetType")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "StatusMessage")
+      )
+
+instance Prelude.Hashable DatasetMetadata where
+  hashWithSalt _salt DatasetMetadata' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationTimestamp
+      `Prelude.hashWithSalt` datasetType
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` statusMessage
+
+instance Prelude.NFData DatasetMetadata where
+  rnf DatasetMetadata' {..} =
+    Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf datasetType
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf statusMessage
diff --git a/gen/Amazonka/LookoutVision/Types/DatasetSource.hs b/gen/Amazonka/LookoutVision/Types/DatasetSource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/DatasetSource.hs
@@ -0,0 +1,74 @@
+{-# 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.LookoutVision.Types.DatasetSource
+-- 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.LookoutVision.Types.DatasetSource where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.DatasetGroundTruthManifest
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the location of a manifest file that Amazon Lookout
+-- for Vision uses to to create a dataset.
+--
+-- /See:/ 'newDatasetSource' smart constructor.
+data DatasetSource = DatasetSource'
+  { -- | Location information for the manifest file.
+    groundTruthManifest :: Prelude.Maybe DatasetGroundTruthManifest
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DatasetSource' 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:
+--
+-- 'groundTruthManifest', 'datasetSource_groundTruthManifest' - Location information for the manifest file.
+newDatasetSource ::
+  DatasetSource
+newDatasetSource =
+  DatasetSource'
+    { groundTruthManifest =
+        Prelude.Nothing
+    }
+
+-- | Location information for the manifest file.
+datasetSource_groundTruthManifest :: Lens.Lens' DatasetSource (Prelude.Maybe DatasetGroundTruthManifest)
+datasetSource_groundTruthManifest = Lens.lens (\DatasetSource' {groundTruthManifest} -> groundTruthManifest) (\s@DatasetSource' {} a -> s {groundTruthManifest = a} :: DatasetSource)
+
+instance Prelude.Hashable DatasetSource where
+  hashWithSalt _salt DatasetSource' {..} =
+    _salt `Prelude.hashWithSalt` groundTruthManifest
+
+instance Prelude.NFData DatasetSource where
+  rnf DatasetSource' {..} =
+    Prelude.rnf groundTruthManifest
+
+instance Data.ToJSON DatasetSource where
+  toJSON DatasetSource' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("GroundTruthManifest" Data..=)
+              Prelude.<$> groundTruthManifest
+          ]
+      )
diff --git a/gen/Amazonka/LookoutVision/Types/DatasetStatus.hs b/gen/Amazonka/LookoutVision/Types/DatasetStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/DatasetStatus.hs
@@ -0,0 +1,111 @@
+{-# 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.LookoutVision.Types.DatasetStatus
+-- 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.LookoutVision.Types.DatasetStatus
+  ( DatasetStatus
+      ( ..,
+        DatasetStatus_CREATE_COMPLETE,
+        DatasetStatus_CREATE_FAILED,
+        DatasetStatus_CREATE_IN_PROGRESS,
+        DatasetStatus_DELETE_COMPLETE,
+        DatasetStatus_DELETE_FAILED,
+        DatasetStatus_DELETE_IN_PROGRESS,
+        DatasetStatus_UPDATE_COMPLETE,
+        DatasetStatus_UPDATE_FAILED_ROLLBACK_COMPLETE,
+        DatasetStatus_UPDATE_FAILED_ROLLBACK_IN_PROGRESS,
+        DatasetStatus_UPDATE_IN_PROGRESS
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype DatasetStatus = DatasetStatus'
+  { fromDatasetStatus ::
+      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 DatasetStatus_CREATE_COMPLETE :: DatasetStatus
+pattern DatasetStatus_CREATE_COMPLETE = DatasetStatus' "CREATE_COMPLETE"
+
+pattern DatasetStatus_CREATE_FAILED :: DatasetStatus
+pattern DatasetStatus_CREATE_FAILED = DatasetStatus' "CREATE_FAILED"
+
+pattern DatasetStatus_CREATE_IN_PROGRESS :: DatasetStatus
+pattern DatasetStatus_CREATE_IN_PROGRESS = DatasetStatus' "CREATE_IN_PROGRESS"
+
+pattern DatasetStatus_DELETE_COMPLETE :: DatasetStatus
+pattern DatasetStatus_DELETE_COMPLETE = DatasetStatus' "DELETE_COMPLETE"
+
+pattern DatasetStatus_DELETE_FAILED :: DatasetStatus
+pattern DatasetStatus_DELETE_FAILED = DatasetStatus' "DELETE_FAILED"
+
+pattern DatasetStatus_DELETE_IN_PROGRESS :: DatasetStatus
+pattern DatasetStatus_DELETE_IN_PROGRESS = DatasetStatus' "DELETE_IN_PROGRESS"
+
+pattern DatasetStatus_UPDATE_COMPLETE :: DatasetStatus
+pattern DatasetStatus_UPDATE_COMPLETE = DatasetStatus' "UPDATE_COMPLETE"
+
+pattern DatasetStatus_UPDATE_FAILED_ROLLBACK_COMPLETE :: DatasetStatus
+pattern DatasetStatus_UPDATE_FAILED_ROLLBACK_COMPLETE = DatasetStatus' "UPDATE_FAILED_ROLLBACK_COMPLETE"
+
+pattern DatasetStatus_UPDATE_FAILED_ROLLBACK_IN_PROGRESS :: DatasetStatus
+pattern DatasetStatus_UPDATE_FAILED_ROLLBACK_IN_PROGRESS = DatasetStatus' "UPDATE_FAILED_ROLLBACK_IN_PROGRESS"
+
+pattern DatasetStatus_UPDATE_IN_PROGRESS :: DatasetStatus
+pattern DatasetStatus_UPDATE_IN_PROGRESS = DatasetStatus' "UPDATE_IN_PROGRESS"
+
+{-# COMPLETE
+  DatasetStatus_CREATE_COMPLETE,
+  DatasetStatus_CREATE_FAILED,
+  DatasetStatus_CREATE_IN_PROGRESS,
+  DatasetStatus_DELETE_COMPLETE,
+  DatasetStatus_DELETE_FAILED,
+  DatasetStatus_DELETE_IN_PROGRESS,
+  DatasetStatus_UPDATE_COMPLETE,
+  DatasetStatus_UPDATE_FAILED_ROLLBACK_COMPLETE,
+  DatasetStatus_UPDATE_FAILED_ROLLBACK_IN_PROGRESS,
+  DatasetStatus_UPDATE_IN_PROGRESS,
+  DatasetStatus'
+  #-}
diff --git a/gen/Amazonka/LookoutVision/Types/DetectAnomalyResult.hs b/gen/Amazonka/LookoutVision/Types/DetectAnomalyResult.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/DetectAnomalyResult.hs
@@ -0,0 +1,199 @@
+{-# 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.LookoutVision.Types.DetectAnomalyResult
+-- 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.LookoutVision.Types.DetectAnomalyResult where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.Anomaly
+import Amazonka.LookoutVision.Types.ImageSource
+import qualified Amazonka.Prelude as Prelude
+
+-- | The prediction results from a call to DetectAnomalies.
+-- @DetectAnomalyResult@ includes classification information for the
+-- prediction (@IsAnomalous@ and @Confidence@). If the model you use is an
+-- image segementation model, @DetectAnomalyResult@ also includes
+-- segmentation information (@Anomalies@ and @AnomalyMask@). Classification
+-- information is calculated separately from segmentation information and
+-- you shouldn\'t assume a relationship between them.
+--
+-- /See:/ 'newDetectAnomalyResult' smart constructor.
+data DetectAnomalyResult = DetectAnomalyResult'
+  { -- | If the model is an image segmentation model, @Anomalies@ contains a list
+    -- of anomaly types found in the image. There is one entry for each type of
+    -- anomaly found (even if multiple instances of an anomaly type exist on
+    -- the image). The first element in the list is always an anomaly type
+    -- representing the image background (\'background\') and shouldn\'t be
+    -- considered an anomaly. Amazon Lookout for Vision automatically add the
+    -- background anomaly type to the response, and you don\'t need to declare
+    -- a background anomaly type in your dataset.
+    --
+    -- If the list has one entry (\'background\'), no anomalies were found on
+    -- the image.
+    --
+    -- An image classification model doesn\'t return an @Anomalies@ list.
+    anomalies :: Prelude.Maybe [Anomaly],
+    -- | If the model is an image segmentation model, @AnomalyMask@ contains
+    -- pixel masks that covers all anomaly types found on the image. Each
+    -- anomaly type has a different mask color. To map a color to an anomaly
+    -- type, see the @color@ field of the PixelAnomaly object.
+    --
+    -- An image classification model doesn\'t return an @Anomalies@ list.
+    anomalyMask :: Prelude.Maybe Data.Base64,
+    -- | The confidence that Lookout for Vision has in the accuracy of the
+    -- classification in @IsAnomalous@.
+    confidence :: Prelude.Maybe Prelude.Double,
+    -- | True if Amazon Lookout for Vision classifies the image as containing an
+    -- anomaly, otherwise false.
+    isAnomalous :: Prelude.Maybe Prelude.Bool,
+    -- | The source of the image that was analyzed. @direct@ means that the
+    -- images was supplied from the local computer. No other values are
+    -- supported.
+    source :: Prelude.Maybe ImageSource
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'DetectAnomalyResult' 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:
+--
+-- 'anomalies', 'detectAnomalyResult_anomalies' - If the model is an image segmentation model, @Anomalies@ contains a list
+-- of anomaly types found in the image. There is one entry for each type of
+-- anomaly found (even if multiple instances of an anomaly type exist on
+-- the image). The first element in the list is always an anomaly type
+-- representing the image background (\'background\') and shouldn\'t be
+-- considered an anomaly. Amazon Lookout for Vision automatically add the
+-- background anomaly type to the response, and you don\'t need to declare
+-- a background anomaly type in your dataset.
+--
+-- If the list has one entry (\'background\'), no anomalies were found on
+-- the image.
+--
+-- An image classification model doesn\'t return an @Anomalies@ list.
+--
+-- 'anomalyMask', 'detectAnomalyResult_anomalyMask' - If the model is an image segmentation model, @AnomalyMask@ contains
+-- pixel masks that covers all anomaly types found on the image. Each
+-- anomaly type has a different mask color. To map a color to an anomaly
+-- type, see the @color@ field of the PixelAnomaly object.
+--
+-- An image classification model doesn\'t return an @Anomalies@ list.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+--
+-- 'confidence', 'detectAnomalyResult_confidence' - The confidence that Lookout for Vision has in the accuracy of the
+-- classification in @IsAnomalous@.
+--
+-- 'isAnomalous', 'detectAnomalyResult_isAnomalous' - True if Amazon Lookout for Vision classifies the image as containing an
+-- anomaly, otherwise false.
+--
+-- 'source', 'detectAnomalyResult_source' - The source of the image that was analyzed. @direct@ means that the
+-- images was supplied from the local computer. No other values are
+-- supported.
+newDetectAnomalyResult ::
+  DetectAnomalyResult
+newDetectAnomalyResult =
+  DetectAnomalyResult'
+    { anomalies = Prelude.Nothing,
+      anomalyMask = Prelude.Nothing,
+      confidence = Prelude.Nothing,
+      isAnomalous = Prelude.Nothing,
+      source = Prelude.Nothing
+    }
+
+-- | If the model is an image segmentation model, @Anomalies@ contains a list
+-- of anomaly types found in the image. There is one entry for each type of
+-- anomaly found (even if multiple instances of an anomaly type exist on
+-- the image). The first element in the list is always an anomaly type
+-- representing the image background (\'background\') and shouldn\'t be
+-- considered an anomaly. Amazon Lookout for Vision automatically add the
+-- background anomaly type to the response, and you don\'t need to declare
+-- a background anomaly type in your dataset.
+--
+-- If the list has one entry (\'background\'), no anomalies were found on
+-- the image.
+--
+-- An image classification model doesn\'t return an @Anomalies@ list.
+detectAnomalyResult_anomalies :: Lens.Lens' DetectAnomalyResult (Prelude.Maybe [Anomaly])
+detectAnomalyResult_anomalies = Lens.lens (\DetectAnomalyResult' {anomalies} -> anomalies) (\s@DetectAnomalyResult' {} a -> s {anomalies = a} :: DetectAnomalyResult) Prelude.. Lens.mapping Lens.coerced
+
+-- | If the model is an image segmentation model, @AnomalyMask@ contains
+-- pixel masks that covers all anomaly types found on the image. Each
+-- anomaly type has a different mask color. To map a color to an anomaly
+-- type, see the @color@ field of the PixelAnomaly object.
+--
+-- An image classification model doesn\'t return an @Anomalies@ list.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+detectAnomalyResult_anomalyMask :: Lens.Lens' DetectAnomalyResult (Prelude.Maybe Prelude.ByteString)
+detectAnomalyResult_anomalyMask = Lens.lens (\DetectAnomalyResult' {anomalyMask} -> anomalyMask) (\s@DetectAnomalyResult' {} a -> s {anomalyMask = a} :: DetectAnomalyResult) Prelude.. Lens.mapping Data._Base64
+
+-- | The confidence that Lookout for Vision has in the accuracy of the
+-- classification in @IsAnomalous@.
+detectAnomalyResult_confidence :: Lens.Lens' DetectAnomalyResult (Prelude.Maybe Prelude.Double)
+detectAnomalyResult_confidence = Lens.lens (\DetectAnomalyResult' {confidence} -> confidence) (\s@DetectAnomalyResult' {} a -> s {confidence = a} :: DetectAnomalyResult)
+
+-- | True if Amazon Lookout for Vision classifies the image as containing an
+-- anomaly, otherwise false.
+detectAnomalyResult_isAnomalous :: Lens.Lens' DetectAnomalyResult (Prelude.Maybe Prelude.Bool)
+detectAnomalyResult_isAnomalous = Lens.lens (\DetectAnomalyResult' {isAnomalous} -> isAnomalous) (\s@DetectAnomalyResult' {} a -> s {isAnomalous = a} :: DetectAnomalyResult)
+
+-- | The source of the image that was analyzed. @direct@ means that the
+-- images was supplied from the local computer. No other values are
+-- supported.
+detectAnomalyResult_source :: Lens.Lens' DetectAnomalyResult (Prelude.Maybe ImageSource)
+detectAnomalyResult_source = Lens.lens (\DetectAnomalyResult' {source} -> source) (\s@DetectAnomalyResult' {} a -> s {source = a} :: DetectAnomalyResult)
+
+instance Data.FromJSON DetectAnomalyResult where
+  parseJSON =
+    Data.withObject
+      "DetectAnomalyResult"
+      ( \x ->
+          DetectAnomalyResult'
+            Prelude.<$> (x Data..:? "Anomalies" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "AnomalyMask")
+            Prelude.<*> (x Data..:? "Confidence")
+            Prelude.<*> (x Data..:? "IsAnomalous")
+            Prelude.<*> (x Data..:? "Source")
+      )
+
+instance Prelude.Hashable DetectAnomalyResult where
+  hashWithSalt _salt DetectAnomalyResult' {..} =
+    _salt
+      `Prelude.hashWithSalt` anomalies
+      `Prelude.hashWithSalt` anomalyMask
+      `Prelude.hashWithSalt` confidence
+      `Prelude.hashWithSalt` isAnomalous
+      `Prelude.hashWithSalt` source
+
+instance Prelude.NFData DetectAnomalyResult where
+  rnf DetectAnomalyResult' {..} =
+    Prelude.rnf anomalies
+      `Prelude.seq` Prelude.rnf anomalyMask
+      `Prelude.seq` Prelude.rnf confidence
+      `Prelude.seq` Prelude.rnf isAnomalous
+      `Prelude.seq` Prelude.rnf source
diff --git a/gen/Amazonka/LookoutVision/Types/GreengrassConfiguration.hs b/gen/Amazonka/LookoutVision/Types/GreengrassConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/GreengrassConfiguration.hs
@@ -0,0 +1,230 @@
+{-# 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.LookoutVision.Types.GreengrassConfiguration
+-- 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.LookoutVision.Types.GreengrassConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.S3Location
+import Amazonka.LookoutVision.Types.Tag
+import Amazonka.LookoutVision.Types.TargetDevice
+import Amazonka.LookoutVision.Types.TargetPlatform
+import qualified Amazonka.Prelude as Prelude
+
+-- | Configuration information for the AWS IoT Greengrass component created
+-- in a model packaging job. For more information, see
+-- StartModelPackagingJob.
+--
+-- You can\'t specify a component with the same @ComponentName@ and
+-- @Componentversion@ as an existing component with the same component name
+-- and component version.
+--
+-- /See:/ 'newGreengrassConfiguration' smart constructor.
+data GreengrassConfiguration = GreengrassConfiguration'
+  { -- | Additional compiler options for the Greengrass component. Currently,
+    -- only NVIDIA Graphics Processing Units (GPU) and CPU accelerators are
+    -- supported. If you specify @TargetDevice@, don\'t specify
+    -- @CompilerOptions@.
+    --
+    -- For more information, see /Compiler options/ in the Amazon Lookout for
+    -- Vision Developer Guide.
+    compilerOptions :: Prelude.Maybe Prelude.Text,
+    -- | A description for the AWS IoT Greengrass component.
+    componentDescription :: Prelude.Maybe Prelude.Text,
+    -- | A Version for the AWS IoT Greengrass component. If you don\'t provide a
+    -- value, a default value of @ @/@Model Version@/@.0.0@ is used.
+    componentVersion :: Prelude.Maybe Prelude.Text,
+    -- | A set of tags (key-value pairs) that you want to attach to the AWS IoT
+    -- Greengrass component.
+    tags :: Prelude.Maybe [Tag],
+    -- | The target device for the model. Currently the only supported value is
+    -- @jetson_xavier@. If you specify @TargetDevice@, you can\'t specify
+    -- @TargetPlatform@.
+    targetDevice :: Prelude.Maybe TargetDevice,
+    -- | The target platform for the model. If you specify @TargetPlatform@, you
+    -- can\'t specify @TargetDevice@.
+    targetPlatform :: Prelude.Maybe TargetPlatform,
+    -- | An S3 location in which Lookout for Vision stores the component
+    -- artifacts.
+    s3OutputLocation :: S3Location,
+    -- | A name for the AWS IoT Greengrass component.
+    componentName :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GreengrassConfiguration' 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:
+--
+-- 'compilerOptions', 'greengrassConfiguration_compilerOptions' - Additional compiler options for the Greengrass component. Currently,
+-- only NVIDIA Graphics Processing Units (GPU) and CPU accelerators are
+-- supported. If you specify @TargetDevice@, don\'t specify
+-- @CompilerOptions@.
+--
+-- For more information, see /Compiler options/ in the Amazon Lookout for
+-- Vision Developer Guide.
+--
+-- 'componentDescription', 'greengrassConfiguration_componentDescription' - A description for the AWS IoT Greengrass component.
+--
+-- 'componentVersion', 'greengrassConfiguration_componentVersion' - A Version for the AWS IoT Greengrass component. If you don\'t provide a
+-- value, a default value of @ @/@Model Version@/@.0.0@ is used.
+--
+-- 'tags', 'greengrassConfiguration_tags' - A set of tags (key-value pairs) that you want to attach to the AWS IoT
+-- Greengrass component.
+--
+-- 'targetDevice', 'greengrassConfiguration_targetDevice' - The target device for the model. Currently the only supported value is
+-- @jetson_xavier@. If you specify @TargetDevice@, you can\'t specify
+-- @TargetPlatform@.
+--
+-- 'targetPlatform', 'greengrassConfiguration_targetPlatform' - The target platform for the model. If you specify @TargetPlatform@, you
+-- can\'t specify @TargetDevice@.
+--
+-- 's3OutputLocation', 'greengrassConfiguration_s3OutputLocation' - An S3 location in which Lookout for Vision stores the component
+-- artifacts.
+--
+-- 'componentName', 'greengrassConfiguration_componentName' - A name for the AWS IoT Greengrass component.
+newGreengrassConfiguration ::
+  -- | 's3OutputLocation'
+  S3Location ->
+  -- | 'componentName'
+  Prelude.Text ->
+  GreengrassConfiguration
+newGreengrassConfiguration
+  pS3OutputLocation_
+  pComponentName_ =
+    GreengrassConfiguration'
+      { compilerOptions =
+          Prelude.Nothing,
+        componentDescription = Prelude.Nothing,
+        componentVersion = Prelude.Nothing,
+        tags = Prelude.Nothing,
+        targetDevice = Prelude.Nothing,
+        targetPlatform = Prelude.Nothing,
+        s3OutputLocation = pS3OutputLocation_,
+        componentName = pComponentName_
+      }
+
+-- | Additional compiler options for the Greengrass component. Currently,
+-- only NVIDIA Graphics Processing Units (GPU) and CPU accelerators are
+-- supported. If you specify @TargetDevice@, don\'t specify
+-- @CompilerOptions@.
+--
+-- For more information, see /Compiler options/ in the Amazon Lookout for
+-- Vision Developer Guide.
+greengrassConfiguration_compilerOptions :: Lens.Lens' GreengrassConfiguration (Prelude.Maybe Prelude.Text)
+greengrassConfiguration_compilerOptions = Lens.lens (\GreengrassConfiguration' {compilerOptions} -> compilerOptions) (\s@GreengrassConfiguration' {} a -> s {compilerOptions = a} :: GreengrassConfiguration)
+
+-- | A description for the AWS IoT Greengrass component.
+greengrassConfiguration_componentDescription :: Lens.Lens' GreengrassConfiguration (Prelude.Maybe Prelude.Text)
+greengrassConfiguration_componentDescription = Lens.lens (\GreengrassConfiguration' {componentDescription} -> componentDescription) (\s@GreengrassConfiguration' {} a -> s {componentDescription = a} :: GreengrassConfiguration)
+
+-- | A Version for the AWS IoT Greengrass component. If you don\'t provide a
+-- value, a default value of @ @/@Model Version@/@.0.0@ is used.
+greengrassConfiguration_componentVersion :: Lens.Lens' GreengrassConfiguration (Prelude.Maybe Prelude.Text)
+greengrassConfiguration_componentVersion = Lens.lens (\GreengrassConfiguration' {componentVersion} -> componentVersion) (\s@GreengrassConfiguration' {} a -> s {componentVersion = a} :: GreengrassConfiguration)
+
+-- | A set of tags (key-value pairs) that you want to attach to the AWS IoT
+-- Greengrass component.
+greengrassConfiguration_tags :: Lens.Lens' GreengrassConfiguration (Prelude.Maybe [Tag])
+greengrassConfiguration_tags = Lens.lens (\GreengrassConfiguration' {tags} -> tags) (\s@GreengrassConfiguration' {} a -> s {tags = a} :: GreengrassConfiguration) Prelude.. Lens.mapping Lens.coerced
+
+-- | The target device for the model. Currently the only supported value is
+-- @jetson_xavier@. If you specify @TargetDevice@, you can\'t specify
+-- @TargetPlatform@.
+greengrassConfiguration_targetDevice :: Lens.Lens' GreengrassConfiguration (Prelude.Maybe TargetDevice)
+greengrassConfiguration_targetDevice = Lens.lens (\GreengrassConfiguration' {targetDevice} -> targetDevice) (\s@GreengrassConfiguration' {} a -> s {targetDevice = a} :: GreengrassConfiguration)
+
+-- | The target platform for the model. If you specify @TargetPlatform@, you
+-- can\'t specify @TargetDevice@.
+greengrassConfiguration_targetPlatform :: Lens.Lens' GreengrassConfiguration (Prelude.Maybe TargetPlatform)
+greengrassConfiguration_targetPlatform = Lens.lens (\GreengrassConfiguration' {targetPlatform} -> targetPlatform) (\s@GreengrassConfiguration' {} a -> s {targetPlatform = a} :: GreengrassConfiguration)
+
+-- | An S3 location in which Lookout for Vision stores the component
+-- artifacts.
+greengrassConfiguration_s3OutputLocation :: Lens.Lens' GreengrassConfiguration S3Location
+greengrassConfiguration_s3OutputLocation = Lens.lens (\GreengrassConfiguration' {s3OutputLocation} -> s3OutputLocation) (\s@GreengrassConfiguration' {} a -> s {s3OutputLocation = a} :: GreengrassConfiguration)
+
+-- | A name for the AWS IoT Greengrass component.
+greengrassConfiguration_componentName :: Lens.Lens' GreengrassConfiguration Prelude.Text
+greengrassConfiguration_componentName = Lens.lens (\GreengrassConfiguration' {componentName} -> componentName) (\s@GreengrassConfiguration' {} a -> s {componentName = a} :: GreengrassConfiguration)
+
+instance Data.FromJSON GreengrassConfiguration where
+  parseJSON =
+    Data.withObject
+      "GreengrassConfiguration"
+      ( \x ->
+          GreengrassConfiguration'
+            Prelude.<$> (x Data..:? "CompilerOptions")
+            Prelude.<*> (x Data..:? "ComponentDescription")
+            Prelude.<*> (x Data..:? "ComponentVersion")
+            Prelude.<*> (x Data..:? "Tags" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "TargetDevice")
+            Prelude.<*> (x Data..:? "TargetPlatform")
+            Prelude.<*> (x Data..: "S3OutputLocation")
+            Prelude.<*> (x Data..: "ComponentName")
+      )
+
+instance Prelude.Hashable GreengrassConfiguration where
+  hashWithSalt _salt GreengrassConfiguration' {..} =
+    _salt
+      `Prelude.hashWithSalt` compilerOptions
+      `Prelude.hashWithSalt` componentDescription
+      `Prelude.hashWithSalt` componentVersion
+      `Prelude.hashWithSalt` tags
+      `Prelude.hashWithSalt` targetDevice
+      `Prelude.hashWithSalt` targetPlatform
+      `Prelude.hashWithSalt` s3OutputLocation
+      `Prelude.hashWithSalt` componentName
+
+instance Prelude.NFData GreengrassConfiguration where
+  rnf GreengrassConfiguration' {..} =
+    Prelude.rnf compilerOptions
+      `Prelude.seq` Prelude.rnf componentDescription
+      `Prelude.seq` Prelude.rnf componentVersion
+      `Prelude.seq` Prelude.rnf tags
+      `Prelude.seq` Prelude.rnf targetDevice
+      `Prelude.seq` Prelude.rnf targetPlatform
+      `Prelude.seq` Prelude.rnf s3OutputLocation
+      `Prelude.seq` Prelude.rnf componentName
+
+instance Data.ToJSON GreengrassConfiguration where
+  toJSON GreengrassConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("CompilerOptions" Data..=)
+              Prelude.<$> compilerOptions,
+            ("ComponentDescription" Data..=)
+              Prelude.<$> componentDescription,
+            ("ComponentVersion" Data..=)
+              Prelude.<$> componentVersion,
+            ("Tags" Data..=) Prelude.<$> tags,
+            ("TargetDevice" Data..=) Prelude.<$> targetDevice,
+            ("TargetPlatform" Data..=)
+              Prelude.<$> targetPlatform,
+            Prelude.Just
+              ("S3OutputLocation" Data..= s3OutputLocation),
+            Prelude.Just
+              ("ComponentName" Data..= componentName)
+          ]
+      )
diff --git a/gen/Amazonka/LookoutVision/Types/GreengrassOutputDetails.hs b/gen/Amazonka/LookoutVision/Types/GreengrassOutputDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/GreengrassOutputDetails.hs
@@ -0,0 +1,98 @@
+{-# 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.LookoutVision.Types.GreengrassOutputDetails
+-- 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.LookoutVision.Types.GreengrassOutputDetails 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
+
+-- | Information about the AWS IoT Greengrass component created by a model
+-- packaging job.
+--
+-- /See:/ 'newGreengrassOutputDetails' smart constructor.
+data GreengrassOutputDetails = GreengrassOutputDetails'
+  { -- | The name of the component.
+    componentName :: Prelude.Maybe Prelude.Text,
+    -- | The version of the component.
+    componentVersion :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the component.
+    componentVersionArn :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'GreengrassOutputDetails' 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:
+--
+-- 'componentName', 'greengrassOutputDetails_componentName' - The name of the component.
+--
+-- 'componentVersion', 'greengrassOutputDetails_componentVersion' - The version of the component.
+--
+-- 'componentVersionArn', 'greengrassOutputDetails_componentVersionArn' - The Amazon Resource Name (ARN) of the component.
+newGreengrassOutputDetails ::
+  GreengrassOutputDetails
+newGreengrassOutputDetails =
+  GreengrassOutputDetails'
+    { componentName =
+        Prelude.Nothing,
+      componentVersion = Prelude.Nothing,
+      componentVersionArn = Prelude.Nothing
+    }
+
+-- | The name of the component.
+greengrassOutputDetails_componentName :: Lens.Lens' GreengrassOutputDetails (Prelude.Maybe Prelude.Text)
+greengrassOutputDetails_componentName = Lens.lens (\GreengrassOutputDetails' {componentName} -> componentName) (\s@GreengrassOutputDetails' {} a -> s {componentName = a} :: GreengrassOutputDetails)
+
+-- | The version of the component.
+greengrassOutputDetails_componentVersion :: Lens.Lens' GreengrassOutputDetails (Prelude.Maybe Prelude.Text)
+greengrassOutputDetails_componentVersion = Lens.lens (\GreengrassOutputDetails' {componentVersion} -> componentVersion) (\s@GreengrassOutputDetails' {} a -> s {componentVersion = a} :: GreengrassOutputDetails)
+
+-- | The Amazon Resource Name (ARN) of the component.
+greengrassOutputDetails_componentVersionArn :: Lens.Lens' GreengrassOutputDetails (Prelude.Maybe Prelude.Text)
+greengrassOutputDetails_componentVersionArn = Lens.lens (\GreengrassOutputDetails' {componentVersionArn} -> componentVersionArn) (\s@GreengrassOutputDetails' {} a -> s {componentVersionArn = a} :: GreengrassOutputDetails)
+
+instance Data.FromJSON GreengrassOutputDetails where
+  parseJSON =
+    Data.withObject
+      "GreengrassOutputDetails"
+      ( \x ->
+          GreengrassOutputDetails'
+            Prelude.<$> (x Data..:? "ComponentName")
+            Prelude.<*> (x Data..:? "ComponentVersion")
+            Prelude.<*> (x Data..:? "ComponentVersionArn")
+      )
+
+instance Prelude.Hashable GreengrassOutputDetails where
+  hashWithSalt _salt GreengrassOutputDetails' {..} =
+    _salt
+      `Prelude.hashWithSalt` componentName
+      `Prelude.hashWithSalt` componentVersion
+      `Prelude.hashWithSalt` componentVersionArn
+
+instance Prelude.NFData GreengrassOutputDetails where
+  rnf GreengrassOutputDetails' {..} =
+    Prelude.rnf componentName
+      `Prelude.seq` Prelude.rnf componentVersion
+      `Prelude.seq` Prelude.rnf componentVersionArn
diff --git a/gen/Amazonka/LookoutVision/Types/ImageSource.hs b/gen/Amazonka/LookoutVision/Types/ImageSource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/ImageSource.hs
@@ -0,0 +1,65 @@
+{-# 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.LookoutVision.Types.ImageSource
+-- 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.LookoutVision.Types.ImageSource 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 source for an image.
+--
+-- /See:/ 'newImageSource' smart constructor.
+data ImageSource = ImageSource'
+  { -- | The type of the image.
+    type' :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ImageSource' 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:
+--
+-- 'type'', 'imageSource_type' - The type of the image.
+newImageSource ::
+  ImageSource
+newImageSource =
+  ImageSource' {type' = Prelude.Nothing}
+
+-- | The type of the image.
+imageSource_type :: Lens.Lens' ImageSource (Prelude.Maybe Prelude.Text)
+imageSource_type = Lens.lens (\ImageSource' {type'} -> type') (\s@ImageSource' {} a -> s {type' = a} :: ImageSource)
+
+instance Data.FromJSON ImageSource where
+  parseJSON =
+    Data.withObject
+      "ImageSource"
+      (\x -> ImageSource' Prelude.<$> (x Data..:? "Type"))
+
+instance Prelude.Hashable ImageSource where
+  hashWithSalt _salt ImageSource' {..} =
+    _salt `Prelude.hashWithSalt` type'
+
+instance Prelude.NFData ImageSource where
+  rnf ImageSource' {..} = Prelude.rnf type'
diff --git a/gen/Amazonka/LookoutVision/Types/InputS3Object.hs b/gen/Amazonka/LookoutVision/Types/InputS3Object.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/InputS3Object.hs
@@ -0,0 +1,99 @@
+{-# 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.LookoutVision.Types.InputS3Object
+-- 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.LookoutVision.Types.InputS3Object 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
+
+-- | Amazon S3 Location information for an input manifest file.
+--
+-- /See:/ 'newInputS3Object' smart constructor.
+data InputS3Object = InputS3Object'
+  { -- | The version ID of the bucket.
+    versionId :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon S3 bucket that contains the manifest.
+    bucket :: Prelude.Text,
+    -- | The name and location of the manifest file withiin the bucket.
+    key :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'InputS3Object' 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:
+--
+-- 'versionId', 'inputS3Object_versionId' - The version ID of the bucket.
+--
+-- 'bucket', 'inputS3Object_bucket' - The Amazon S3 bucket that contains the manifest.
+--
+-- 'key', 'inputS3Object_key' - The name and location of the manifest file withiin the bucket.
+newInputS3Object ::
+  -- | 'bucket'
+  Prelude.Text ->
+  -- | 'key'
+  Prelude.Text ->
+  InputS3Object
+newInputS3Object pBucket_ pKey_ =
+  InputS3Object'
+    { versionId = Prelude.Nothing,
+      bucket = pBucket_,
+      key = pKey_
+    }
+
+-- | The version ID of the bucket.
+inputS3Object_versionId :: Lens.Lens' InputS3Object (Prelude.Maybe Prelude.Text)
+inputS3Object_versionId = Lens.lens (\InputS3Object' {versionId} -> versionId) (\s@InputS3Object' {} a -> s {versionId = a} :: InputS3Object)
+
+-- | The Amazon S3 bucket that contains the manifest.
+inputS3Object_bucket :: Lens.Lens' InputS3Object Prelude.Text
+inputS3Object_bucket = Lens.lens (\InputS3Object' {bucket} -> bucket) (\s@InputS3Object' {} a -> s {bucket = a} :: InputS3Object)
+
+-- | The name and location of the manifest file withiin the bucket.
+inputS3Object_key :: Lens.Lens' InputS3Object Prelude.Text
+inputS3Object_key = Lens.lens (\InputS3Object' {key} -> key) (\s@InputS3Object' {} a -> s {key = a} :: InputS3Object)
+
+instance Prelude.Hashable InputS3Object where
+  hashWithSalt _salt InputS3Object' {..} =
+    _salt
+      `Prelude.hashWithSalt` versionId
+      `Prelude.hashWithSalt` bucket
+      `Prelude.hashWithSalt` key
+
+instance Prelude.NFData InputS3Object where
+  rnf InputS3Object' {..} =
+    Prelude.rnf versionId
+      `Prelude.seq` Prelude.rnf bucket
+      `Prelude.seq` Prelude.rnf key
+
+instance Data.ToJSON InputS3Object where
+  toJSON InputS3Object' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("VersionId" Data..=) Prelude.<$> versionId,
+            Prelude.Just ("Bucket" Data..= bucket),
+            Prelude.Just ("Key" Data..= key)
+          ]
+      )
diff --git a/gen/Amazonka/LookoutVision/Types/ModelDescription.hs b/gen/Amazonka/LookoutVision/Types/ModelDescription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/ModelDescription.hs
@@ -0,0 +1,254 @@
+{-# 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.LookoutVision.Types.ModelDescription
+-- 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.LookoutVision.Types.ModelDescription where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.ModelPerformance
+import Amazonka.LookoutVision.Types.ModelStatus
+import Amazonka.LookoutVision.Types.OutputConfig
+import Amazonka.LookoutVision.Types.OutputS3Object
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes an Amazon Lookout for Vision model.
+--
+-- /See:/ 'newModelDescription' smart constructor.
+data ModelDescription = ModelDescription'
+  { -- | The unix timestamp for the date and time that the model was created.
+    creationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The description for the model.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The unix timestamp for the date and time that the evaluation ended.
+    evaluationEndTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The S3 location where Amazon Lookout for Vision saves the manifest file
+    -- that was used to test the trained model and generate the performance
+    -- scores.
+    evaluationManifest :: Prelude.Maybe OutputS3Object,
+    -- | The S3 location where Amazon Lookout for Vision saves the performance
+    -- metrics.
+    evaluationResult :: Prelude.Maybe OutputS3Object,
+    -- | The identifer for the AWS Key Management Service (AWS KMS) key that was
+    -- used to encrypt the model during training.
+    kmsKeyId :: Prelude.Maybe Prelude.Text,
+    -- | The maximum number of inference units Amazon Lookout for Vision uses to
+    -- auto-scale the model. For more information, see StartModel.
+    maxInferenceUnits :: Prelude.Maybe Prelude.Natural,
+    -- | The minimum number of inference units used by the model. For more
+    -- information, see StartModel
+    minInferenceUnits :: Prelude.Maybe Prelude.Natural,
+    -- | The Amazon Resource Name (ARN) of the model.
+    modelArn :: Prelude.Maybe Prelude.Text,
+    -- | The version of the model
+    modelVersion :: Prelude.Maybe Prelude.Text,
+    -- | The S3 location where Amazon Lookout for Vision saves model training
+    -- files.
+    outputConfig :: Prelude.Maybe OutputConfig,
+    -- | Performance metrics for the model. Created during training.
+    performance :: Prelude.Maybe ModelPerformance,
+    -- | The status of the model.
+    status :: Prelude.Maybe ModelStatus,
+    -- | The status message for the model.
+    statusMessage :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ModelDescription' 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:
+--
+-- 'creationTimestamp', 'modelDescription_creationTimestamp' - The unix timestamp for the date and time that the model was created.
+--
+-- 'description', 'modelDescription_description' - The description for the model.
+--
+-- 'evaluationEndTimestamp', 'modelDescription_evaluationEndTimestamp' - The unix timestamp for the date and time that the evaluation ended.
+--
+-- 'evaluationManifest', 'modelDescription_evaluationManifest' - The S3 location where Amazon Lookout for Vision saves the manifest file
+-- that was used to test the trained model and generate the performance
+-- scores.
+--
+-- 'evaluationResult', 'modelDescription_evaluationResult' - The S3 location where Amazon Lookout for Vision saves the performance
+-- metrics.
+--
+-- 'kmsKeyId', 'modelDescription_kmsKeyId' - The identifer for the AWS Key Management Service (AWS KMS) key that was
+-- used to encrypt the model during training.
+--
+-- 'maxInferenceUnits', 'modelDescription_maxInferenceUnits' - The maximum number of inference units Amazon Lookout for Vision uses to
+-- auto-scale the model. For more information, see StartModel.
+--
+-- 'minInferenceUnits', 'modelDescription_minInferenceUnits' - The minimum number of inference units used by the model. For more
+-- information, see StartModel
+--
+-- 'modelArn', 'modelDescription_modelArn' - The Amazon Resource Name (ARN) of the model.
+--
+-- 'modelVersion', 'modelDescription_modelVersion' - The version of the model
+--
+-- 'outputConfig', 'modelDescription_outputConfig' - The S3 location where Amazon Lookout for Vision saves model training
+-- files.
+--
+-- 'performance', 'modelDescription_performance' - Performance metrics for the model. Created during training.
+--
+-- 'status', 'modelDescription_status' - The status of the model.
+--
+-- 'statusMessage', 'modelDescription_statusMessage' - The status message for the model.
+newModelDescription ::
+  ModelDescription
+newModelDescription =
+  ModelDescription'
+    { creationTimestamp =
+        Prelude.Nothing,
+      description = Prelude.Nothing,
+      evaluationEndTimestamp = Prelude.Nothing,
+      evaluationManifest = Prelude.Nothing,
+      evaluationResult = Prelude.Nothing,
+      kmsKeyId = Prelude.Nothing,
+      maxInferenceUnits = Prelude.Nothing,
+      minInferenceUnits = Prelude.Nothing,
+      modelArn = Prelude.Nothing,
+      modelVersion = Prelude.Nothing,
+      outputConfig = Prelude.Nothing,
+      performance = Prelude.Nothing,
+      status = Prelude.Nothing,
+      statusMessage = Prelude.Nothing
+    }
+
+-- | The unix timestamp for the date and time that the model was created.
+modelDescription_creationTimestamp :: Lens.Lens' ModelDescription (Prelude.Maybe Prelude.UTCTime)
+modelDescription_creationTimestamp = Lens.lens (\ModelDescription' {creationTimestamp} -> creationTimestamp) (\s@ModelDescription' {} a -> s {creationTimestamp = a} :: ModelDescription) Prelude.. Lens.mapping Data._Time
+
+-- | The description for the model.
+modelDescription_description :: Lens.Lens' ModelDescription (Prelude.Maybe Prelude.Text)
+modelDescription_description = Lens.lens (\ModelDescription' {description} -> description) (\s@ModelDescription' {} a -> s {description = a} :: ModelDescription)
+
+-- | The unix timestamp for the date and time that the evaluation ended.
+modelDescription_evaluationEndTimestamp :: Lens.Lens' ModelDescription (Prelude.Maybe Prelude.UTCTime)
+modelDescription_evaluationEndTimestamp = Lens.lens (\ModelDescription' {evaluationEndTimestamp} -> evaluationEndTimestamp) (\s@ModelDescription' {} a -> s {evaluationEndTimestamp = a} :: ModelDescription) Prelude.. Lens.mapping Data._Time
+
+-- | The S3 location where Amazon Lookout for Vision saves the manifest file
+-- that was used to test the trained model and generate the performance
+-- scores.
+modelDescription_evaluationManifest :: Lens.Lens' ModelDescription (Prelude.Maybe OutputS3Object)
+modelDescription_evaluationManifest = Lens.lens (\ModelDescription' {evaluationManifest} -> evaluationManifest) (\s@ModelDescription' {} a -> s {evaluationManifest = a} :: ModelDescription)
+
+-- | The S3 location where Amazon Lookout for Vision saves the performance
+-- metrics.
+modelDescription_evaluationResult :: Lens.Lens' ModelDescription (Prelude.Maybe OutputS3Object)
+modelDescription_evaluationResult = Lens.lens (\ModelDescription' {evaluationResult} -> evaluationResult) (\s@ModelDescription' {} a -> s {evaluationResult = a} :: ModelDescription)
+
+-- | The identifer for the AWS Key Management Service (AWS KMS) key that was
+-- used to encrypt the model during training.
+modelDescription_kmsKeyId :: Lens.Lens' ModelDescription (Prelude.Maybe Prelude.Text)
+modelDescription_kmsKeyId = Lens.lens (\ModelDescription' {kmsKeyId} -> kmsKeyId) (\s@ModelDescription' {} a -> s {kmsKeyId = a} :: ModelDescription)
+
+-- | The maximum number of inference units Amazon Lookout for Vision uses to
+-- auto-scale the model. For more information, see StartModel.
+modelDescription_maxInferenceUnits :: Lens.Lens' ModelDescription (Prelude.Maybe Prelude.Natural)
+modelDescription_maxInferenceUnits = Lens.lens (\ModelDescription' {maxInferenceUnits} -> maxInferenceUnits) (\s@ModelDescription' {} a -> s {maxInferenceUnits = a} :: ModelDescription)
+
+-- | The minimum number of inference units used by the model. For more
+-- information, see StartModel
+modelDescription_minInferenceUnits :: Lens.Lens' ModelDescription (Prelude.Maybe Prelude.Natural)
+modelDescription_minInferenceUnits = Lens.lens (\ModelDescription' {minInferenceUnits} -> minInferenceUnits) (\s@ModelDescription' {} a -> s {minInferenceUnits = a} :: ModelDescription)
+
+-- | The Amazon Resource Name (ARN) of the model.
+modelDescription_modelArn :: Lens.Lens' ModelDescription (Prelude.Maybe Prelude.Text)
+modelDescription_modelArn = Lens.lens (\ModelDescription' {modelArn} -> modelArn) (\s@ModelDescription' {} a -> s {modelArn = a} :: ModelDescription)
+
+-- | The version of the model
+modelDescription_modelVersion :: Lens.Lens' ModelDescription (Prelude.Maybe Prelude.Text)
+modelDescription_modelVersion = Lens.lens (\ModelDescription' {modelVersion} -> modelVersion) (\s@ModelDescription' {} a -> s {modelVersion = a} :: ModelDescription)
+
+-- | The S3 location where Amazon Lookout for Vision saves model training
+-- files.
+modelDescription_outputConfig :: Lens.Lens' ModelDescription (Prelude.Maybe OutputConfig)
+modelDescription_outputConfig = Lens.lens (\ModelDescription' {outputConfig} -> outputConfig) (\s@ModelDescription' {} a -> s {outputConfig = a} :: ModelDescription)
+
+-- | Performance metrics for the model. Created during training.
+modelDescription_performance :: Lens.Lens' ModelDescription (Prelude.Maybe ModelPerformance)
+modelDescription_performance = Lens.lens (\ModelDescription' {performance} -> performance) (\s@ModelDescription' {} a -> s {performance = a} :: ModelDescription)
+
+-- | The status of the model.
+modelDescription_status :: Lens.Lens' ModelDescription (Prelude.Maybe ModelStatus)
+modelDescription_status = Lens.lens (\ModelDescription' {status} -> status) (\s@ModelDescription' {} a -> s {status = a} :: ModelDescription)
+
+-- | The status message for the model.
+modelDescription_statusMessage :: Lens.Lens' ModelDescription (Prelude.Maybe Prelude.Text)
+modelDescription_statusMessage = Lens.lens (\ModelDescription' {statusMessage} -> statusMessage) (\s@ModelDescription' {} a -> s {statusMessage = a} :: ModelDescription)
+
+instance Data.FromJSON ModelDescription where
+  parseJSON =
+    Data.withObject
+      "ModelDescription"
+      ( \x ->
+          ModelDescription'
+            Prelude.<$> (x Data..:? "CreationTimestamp")
+            Prelude.<*> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "EvaluationEndTimestamp")
+            Prelude.<*> (x Data..:? "EvaluationManifest")
+            Prelude.<*> (x Data..:? "EvaluationResult")
+            Prelude.<*> (x Data..:? "KmsKeyId")
+            Prelude.<*> (x Data..:? "MaxInferenceUnits")
+            Prelude.<*> (x Data..:? "MinInferenceUnits")
+            Prelude.<*> (x Data..:? "ModelArn")
+            Prelude.<*> (x Data..:? "ModelVersion")
+            Prelude.<*> (x Data..:? "OutputConfig")
+            Prelude.<*> (x Data..:? "Performance")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "StatusMessage")
+      )
+
+instance Prelude.Hashable ModelDescription where
+  hashWithSalt _salt ModelDescription' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationTimestamp
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` evaluationEndTimestamp
+      `Prelude.hashWithSalt` evaluationManifest
+      `Prelude.hashWithSalt` evaluationResult
+      `Prelude.hashWithSalt` kmsKeyId
+      `Prelude.hashWithSalt` maxInferenceUnits
+      `Prelude.hashWithSalt` minInferenceUnits
+      `Prelude.hashWithSalt` modelArn
+      `Prelude.hashWithSalt` modelVersion
+      `Prelude.hashWithSalt` outputConfig
+      `Prelude.hashWithSalt` performance
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` statusMessage
+
+instance Prelude.NFData ModelDescription where
+  rnf ModelDescription' {..} =
+    Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf evaluationEndTimestamp
+      `Prelude.seq` Prelude.rnf evaluationManifest
+      `Prelude.seq` Prelude.rnf evaluationResult
+      `Prelude.seq` Prelude.rnf kmsKeyId
+      `Prelude.seq` Prelude.rnf maxInferenceUnits
+      `Prelude.seq` Prelude.rnf minInferenceUnits
+      `Prelude.seq` Prelude.rnf modelArn
+      `Prelude.seq` Prelude.rnf modelVersion
+      `Prelude.seq` Prelude.rnf outputConfig
+      `Prelude.seq` Prelude.rnf performance
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf statusMessage
diff --git a/gen/Amazonka/LookoutVision/Types/ModelHostingStatus.hs b/gen/Amazonka/LookoutVision/Types/ModelHostingStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/ModelHostingStatus.hs
@@ -0,0 +1,86 @@
+{-# 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.LookoutVision.Types.ModelHostingStatus
+-- 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.LookoutVision.Types.ModelHostingStatus
+  ( ModelHostingStatus
+      ( ..,
+        ModelHostingStatus_HOSTED,
+        ModelHostingStatus_HOSTING_FAILED,
+        ModelHostingStatus_STARTING_HOSTING,
+        ModelHostingStatus_STOPPING_HOSTING,
+        ModelHostingStatus_SYSTEM_UPDATING
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ModelHostingStatus = ModelHostingStatus'
+  { fromModelHostingStatus ::
+      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 ModelHostingStatus_HOSTED :: ModelHostingStatus
+pattern ModelHostingStatus_HOSTED = ModelHostingStatus' "HOSTED"
+
+pattern ModelHostingStatus_HOSTING_FAILED :: ModelHostingStatus
+pattern ModelHostingStatus_HOSTING_FAILED = ModelHostingStatus' "HOSTING_FAILED"
+
+pattern ModelHostingStatus_STARTING_HOSTING :: ModelHostingStatus
+pattern ModelHostingStatus_STARTING_HOSTING = ModelHostingStatus' "STARTING_HOSTING"
+
+pattern ModelHostingStatus_STOPPING_HOSTING :: ModelHostingStatus
+pattern ModelHostingStatus_STOPPING_HOSTING = ModelHostingStatus' "STOPPING_HOSTING"
+
+pattern ModelHostingStatus_SYSTEM_UPDATING :: ModelHostingStatus
+pattern ModelHostingStatus_SYSTEM_UPDATING = ModelHostingStatus' "SYSTEM_UPDATING"
+
+{-# COMPLETE
+  ModelHostingStatus_HOSTED,
+  ModelHostingStatus_HOSTING_FAILED,
+  ModelHostingStatus_STARTING_HOSTING,
+  ModelHostingStatus_STOPPING_HOSTING,
+  ModelHostingStatus_SYSTEM_UPDATING,
+  ModelHostingStatus'
+  #-}
diff --git a/gen/Amazonka/LookoutVision/Types/ModelMetadata.hs b/gen/Amazonka/LookoutVision/Types/ModelMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/ModelMetadata.hs
@@ -0,0 +1,149 @@
+{-# 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.LookoutVision.Types.ModelMetadata
+-- 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.LookoutVision.Types.ModelMetadata where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.ModelPerformance
+import Amazonka.LookoutVision.Types.ModelStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describes an Amazon Lookout for Vision model.
+--
+-- /See:/ 'newModelMetadata' smart constructor.
+data ModelMetadata = ModelMetadata'
+  { -- | The unix timestamp for the date and time that the model was created.
+    creationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The description for the model.
+    description :: Prelude.Maybe Prelude.Text,
+    -- | The Amazon Resource Name (ARN) of the model.
+    modelArn :: Prelude.Maybe Prelude.Text,
+    -- | The version of the model.
+    modelVersion :: Prelude.Maybe Prelude.Text,
+    -- | Performance metrics for the model. Not available until training has
+    -- successfully completed.
+    performance :: Prelude.Maybe ModelPerformance,
+    -- | The status of the model.
+    status :: Prelude.Maybe ModelStatus,
+    -- | The status message for the model.
+    statusMessage :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ModelMetadata' 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:
+--
+-- 'creationTimestamp', 'modelMetadata_creationTimestamp' - The unix timestamp for the date and time that the model was created.
+--
+-- 'description', 'modelMetadata_description' - The description for the model.
+--
+-- 'modelArn', 'modelMetadata_modelArn' - The Amazon Resource Name (ARN) of the model.
+--
+-- 'modelVersion', 'modelMetadata_modelVersion' - The version of the model.
+--
+-- 'performance', 'modelMetadata_performance' - Performance metrics for the model. Not available until training has
+-- successfully completed.
+--
+-- 'status', 'modelMetadata_status' - The status of the model.
+--
+-- 'statusMessage', 'modelMetadata_statusMessage' - The status message for the model.
+newModelMetadata ::
+  ModelMetadata
+newModelMetadata =
+  ModelMetadata'
+    { creationTimestamp = Prelude.Nothing,
+      description = Prelude.Nothing,
+      modelArn = Prelude.Nothing,
+      modelVersion = Prelude.Nothing,
+      performance = Prelude.Nothing,
+      status = Prelude.Nothing,
+      statusMessage = Prelude.Nothing
+    }
+
+-- | The unix timestamp for the date and time that the model was created.
+modelMetadata_creationTimestamp :: Lens.Lens' ModelMetadata (Prelude.Maybe Prelude.UTCTime)
+modelMetadata_creationTimestamp = Lens.lens (\ModelMetadata' {creationTimestamp} -> creationTimestamp) (\s@ModelMetadata' {} a -> s {creationTimestamp = a} :: ModelMetadata) Prelude.. Lens.mapping Data._Time
+
+-- | The description for the model.
+modelMetadata_description :: Lens.Lens' ModelMetadata (Prelude.Maybe Prelude.Text)
+modelMetadata_description = Lens.lens (\ModelMetadata' {description} -> description) (\s@ModelMetadata' {} a -> s {description = a} :: ModelMetadata)
+
+-- | The Amazon Resource Name (ARN) of the model.
+modelMetadata_modelArn :: Lens.Lens' ModelMetadata (Prelude.Maybe Prelude.Text)
+modelMetadata_modelArn = Lens.lens (\ModelMetadata' {modelArn} -> modelArn) (\s@ModelMetadata' {} a -> s {modelArn = a} :: ModelMetadata)
+
+-- | The version of the model.
+modelMetadata_modelVersion :: Lens.Lens' ModelMetadata (Prelude.Maybe Prelude.Text)
+modelMetadata_modelVersion = Lens.lens (\ModelMetadata' {modelVersion} -> modelVersion) (\s@ModelMetadata' {} a -> s {modelVersion = a} :: ModelMetadata)
+
+-- | Performance metrics for the model. Not available until training has
+-- successfully completed.
+modelMetadata_performance :: Lens.Lens' ModelMetadata (Prelude.Maybe ModelPerformance)
+modelMetadata_performance = Lens.lens (\ModelMetadata' {performance} -> performance) (\s@ModelMetadata' {} a -> s {performance = a} :: ModelMetadata)
+
+-- | The status of the model.
+modelMetadata_status :: Lens.Lens' ModelMetadata (Prelude.Maybe ModelStatus)
+modelMetadata_status = Lens.lens (\ModelMetadata' {status} -> status) (\s@ModelMetadata' {} a -> s {status = a} :: ModelMetadata)
+
+-- | The status message for the model.
+modelMetadata_statusMessage :: Lens.Lens' ModelMetadata (Prelude.Maybe Prelude.Text)
+modelMetadata_statusMessage = Lens.lens (\ModelMetadata' {statusMessage} -> statusMessage) (\s@ModelMetadata' {} a -> s {statusMessage = a} :: ModelMetadata)
+
+instance Data.FromJSON ModelMetadata where
+  parseJSON =
+    Data.withObject
+      "ModelMetadata"
+      ( \x ->
+          ModelMetadata'
+            Prelude.<$> (x Data..:? "CreationTimestamp")
+            Prelude.<*> (x Data..:? "Description")
+            Prelude.<*> (x Data..:? "ModelArn")
+            Prelude.<*> (x Data..:? "ModelVersion")
+            Prelude.<*> (x Data..:? "Performance")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "StatusMessage")
+      )
+
+instance Prelude.Hashable ModelMetadata where
+  hashWithSalt _salt ModelMetadata' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationTimestamp
+      `Prelude.hashWithSalt` description
+      `Prelude.hashWithSalt` modelArn
+      `Prelude.hashWithSalt` modelVersion
+      `Prelude.hashWithSalt` performance
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` statusMessage
+
+instance Prelude.NFData ModelMetadata where
+  rnf ModelMetadata' {..} =
+    Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf description
+      `Prelude.seq` Prelude.rnf modelArn
+      `Prelude.seq` Prelude.rnf modelVersion
+      `Prelude.seq` Prelude.rnf performance
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf statusMessage
diff --git a/gen/Amazonka/LookoutVision/Types/ModelPackagingConfiguration.hs b/gen/Amazonka/LookoutVision/Types/ModelPackagingConfiguration.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/ModelPackagingConfiguration.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.LookoutVision.Types.ModelPackagingConfiguration
+-- 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.LookoutVision.Types.ModelPackagingConfiguration where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.GreengrassConfiguration
+import qualified Amazonka.Prelude as Prelude
+
+-- | Configuration information for a Amazon Lookout for Vision model
+-- packaging job. For more information, see StartModelPackagingJob.
+--
+-- /See:/ 'newModelPackagingConfiguration' smart constructor.
+data ModelPackagingConfiguration = ModelPackagingConfiguration'
+  { -- | Configuration information for the AWS IoT Greengrass component in a
+    -- model packaging job.
+    greengrass :: GreengrassConfiguration
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ModelPackagingConfiguration' 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:
+--
+-- 'greengrass', 'modelPackagingConfiguration_greengrass' - Configuration information for the AWS IoT Greengrass component in a
+-- model packaging job.
+newModelPackagingConfiguration ::
+  -- | 'greengrass'
+  GreengrassConfiguration ->
+  ModelPackagingConfiguration
+newModelPackagingConfiguration pGreengrass_ =
+  ModelPackagingConfiguration'
+    { greengrass =
+        pGreengrass_
+    }
+
+-- | Configuration information for the AWS IoT Greengrass component in a
+-- model packaging job.
+modelPackagingConfiguration_greengrass :: Lens.Lens' ModelPackagingConfiguration GreengrassConfiguration
+modelPackagingConfiguration_greengrass = Lens.lens (\ModelPackagingConfiguration' {greengrass} -> greengrass) (\s@ModelPackagingConfiguration' {} a -> s {greengrass = a} :: ModelPackagingConfiguration)
+
+instance Data.FromJSON ModelPackagingConfiguration where
+  parseJSON =
+    Data.withObject
+      "ModelPackagingConfiguration"
+      ( \x ->
+          ModelPackagingConfiguration'
+            Prelude.<$> (x Data..: "Greengrass")
+      )
+
+instance Prelude.Hashable ModelPackagingConfiguration where
+  hashWithSalt _salt ModelPackagingConfiguration' {..} =
+    _salt `Prelude.hashWithSalt` greengrass
+
+instance Prelude.NFData ModelPackagingConfiguration where
+  rnf ModelPackagingConfiguration' {..} =
+    Prelude.rnf greengrass
+
+instance Data.ToJSON ModelPackagingConfiguration where
+  toJSON ModelPackagingConfiguration' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("Greengrass" Data..= greengrass)]
+      )
diff --git a/gen/Amazonka/LookoutVision/Types/ModelPackagingDescription.hs b/gen/Amazonka/LookoutVision/Types/ModelPackagingDescription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/ModelPackagingDescription.hs
@@ -0,0 +1,212 @@
+{-# 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.LookoutVision.Types.ModelPackagingDescription
+-- 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.LookoutVision.Types.ModelPackagingDescription where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.ModelPackagingConfiguration
+import Amazonka.LookoutVision.Types.ModelPackagingJobStatus
+import Amazonka.LookoutVision.Types.ModelPackagingOutputDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about a model packaging job. For more information, see
+-- DescribeModelPackagingJob.
+--
+-- /See:/ 'newModelPackagingDescription' smart constructor.
+data ModelPackagingDescription = ModelPackagingDescription'
+  { -- | The Unix timestamp for the time and date that the model packaging job
+    -- was created.
+    creationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The name of the model packaging job.
+    jobName :: Prelude.Maybe Prelude.Text,
+    -- | The Unix timestamp for the time and date that the model packaging job
+    -- was last updated.
+    lastUpdatedTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The configuration information used in the model packaging job.
+    modelPackagingConfiguration :: Prelude.Maybe ModelPackagingConfiguration,
+    -- | The description for the model packaging job.
+    modelPackagingJobDescription :: Prelude.Maybe Prelude.Text,
+    -- | The AWS service used to package the job. Currently Lookout for Vision
+    -- can package jobs with AWS IoT Greengrass.
+    modelPackagingMethod :: Prelude.Maybe Prelude.Text,
+    -- | Information about the output of the model packaging job. For more
+    -- information, see DescribeModelPackagingJob.
+    modelPackagingOutputDetails :: Prelude.Maybe ModelPackagingOutputDetails,
+    -- | The version of the model used in the model packaging job.
+    modelVersion :: Prelude.Maybe Prelude.Text,
+    -- | The name of the project that\'s associated with a model that\'s in the
+    -- model package.
+    projectName :: Prelude.Maybe Prelude.Text,
+    -- | The status of the model packaging job.
+    status :: Prelude.Maybe ModelPackagingJobStatus,
+    -- | The status message for the model packaging job.
+    statusMessage :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ModelPackagingDescription' 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:
+--
+-- 'creationTimestamp', 'modelPackagingDescription_creationTimestamp' - The Unix timestamp for the time and date that the model packaging job
+-- was created.
+--
+-- 'jobName', 'modelPackagingDescription_jobName' - The name of the model packaging job.
+--
+-- 'lastUpdatedTimestamp', 'modelPackagingDescription_lastUpdatedTimestamp' - The Unix timestamp for the time and date that the model packaging job
+-- was last updated.
+--
+-- 'modelPackagingConfiguration', 'modelPackagingDescription_modelPackagingConfiguration' - The configuration information used in the model packaging job.
+--
+-- 'modelPackagingJobDescription', 'modelPackagingDescription_modelPackagingJobDescription' - The description for the model packaging job.
+--
+-- 'modelPackagingMethod', 'modelPackagingDescription_modelPackagingMethod' - The AWS service used to package the job. Currently Lookout for Vision
+-- can package jobs with AWS IoT Greengrass.
+--
+-- 'modelPackagingOutputDetails', 'modelPackagingDescription_modelPackagingOutputDetails' - Information about the output of the model packaging job. For more
+-- information, see DescribeModelPackagingJob.
+--
+-- 'modelVersion', 'modelPackagingDescription_modelVersion' - The version of the model used in the model packaging job.
+--
+-- 'projectName', 'modelPackagingDescription_projectName' - The name of the project that\'s associated with a model that\'s in the
+-- model package.
+--
+-- 'status', 'modelPackagingDescription_status' - The status of the model packaging job.
+--
+-- 'statusMessage', 'modelPackagingDescription_statusMessage' - The status message for the model packaging job.
+newModelPackagingDescription ::
+  ModelPackagingDescription
+newModelPackagingDescription =
+  ModelPackagingDescription'
+    { creationTimestamp =
+        Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      lastUpdatedTimestamp = Prelude.Nothing,
+      modelPackagingConfiguration = Prelude.Nothing,
+      modelPackagingJobDescription = Prelude.Nothing,
+      modelPackagingMethod = Prelude.Nothing,
+      modelPackagingOutputDetails = Prelude.Nothing,
+      modelVersion = Prelude.Nothing,
+      projectName = Prelude.Nothing,
+      status = Prelude.Nothing,
+      statusMessage = Prelude.Nothing
+    }
+
+-- | The Unix timestamp for the time and date that the model packaging job
+-- was created.
+modelPackagingDescription_creationTimestamp :: Lens.Lens' ModelPackagingDescription (Prelude.Maybe Prelude.UTCTime)
+modelPackagingDescription_creationTimestamp = Lens.lens (\ModelPackagingDescription' {creationTimestamp} -> creationTimestamp) (\s@ModelPackagingDescription' {} a -> s {creationTimestamp = a} :: ModelPackagingDescription) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the model packaging job.
+modelPackagingDescription_jobName :: Lens.Lens' ModelPackagingDescription (Prelude.Maybe Prelude.Text)
+modelPackagingDescription_jobName = Lens.lens (\ModelPackagingDescription' {jobName} -> jobName) (\s@ModelPackagingDescription' {} a -> s {jobName = a} :: ModelPackagingDescription)
+
+-- | The Unix timestamp for the time and date that the model packaging job
+-- was last updated.
+modelPackagingDescription_lastUpdatedTimestamp :: Lens.Lens' ModelPackagingDescription (Prelude.Maybe Prelude.UTCTime)
+modelPackagingDescription_lastUpdatedTimestamp = Lens.lens (\ModelPackagingDescription' {lastUpdatedTimestamp} -> lastUpdatedTimestamp) (\s@ModelPackagingDescription' {} a -> s {lastUpdatedTimestamp = a} :: ModelPackagingDescription) Prelude.. Lens.mapping Data._Time
+
+-- | The configuration information used in the model packaging job.
+modelPackagingDescription_modelPackagingConfiguration :: Lens.Lens' ModelPackagingDescription (Prelude.Maybe ModelPackagingConfiguration)
+modelPackagingDescription_modelPackagingConfiguration = Lens.lens (\ModelPackagingDescription' {modelPackagingConfiguration} -> modelPackagingConfiguration) (\s@ModelPackagingDescription' {} a -> s {modelPackagingConfiguration = a} :: ModelPackagingDescription)
+
+-- | The description for the model packaging job.
+modelPackagingDescription_modelPackagingJobDescription :: Lens.Lens' ModelPackagingDescription (Prelude.Maybe Prelude.Text)
+modelPackagingDescription_modelPackagingJobDescription = Lens.lens (\ModelPackagingDescription' {modelPackagingJobDescription} -> modelPackagingJobDescription) (\s@ModelPackagingDescription' {} a -> s {modelPackagingJobDescription = a} :: ModelPackagingDescription)
+
+-- | The AWS service used to package the job. Currently Lookout for Vision
+-- can package jobs with AWS IoT Greengrass.
+modelPackagingDescription_modelPackagingMethod :: Lens.Lens' ModelPackagingDescription (Prelude.Maybe Prelude.Text)
+modelPackagingDescription_modelPackagingMethod = Lens.lens (\ModelPackagingDescription' {modelPackagingMethod} -> modelPackagingMethod) (\s@ModelPackagingDescription' {} a -> s {modelPackagingMethod = a} :: ModelPackagingDescription)
+
+-- | Information about the output of the model packaging job. For more
+-- information, see DescribeModelPackagingJob.
+modelPackagingDescription_modelPackagingOutputDetails :: Lens.Lens' ModelPackagingDescription (Prelude.Maybe ModelPackagingOutputDetails)
+modelPackagingDescription_modelPackagingOutputDetails = Lens.lens (\ModelPackagingDescription' {modelPackagingOutputDetails} -> modelPackagingOutputDetails) (\s@ModelPackagingDescription' {} a -> s {modelPackagingOutputDetails = a} :: ModelPackagingDescription)
+
+-- | The version of the model used in the model packaging job.
+modelPackagingDescription_modelVersion :: Lens.Lens' ModelPackagingDescription (Prelude.Maybe Prelude.Text)
+modelPackagingDescription_modelVersion = Lens.lens (\ModelPackagingDescription' {modelVersion} -> modelVersion) (\s@ModelPackagingDescription' {} a -> s {modelVersion = a} :: ModelPackagingDescription)
+
+-- | The name of the project that\'s associated with a model that\'s in the
+-- model package.
+modelPackagingDescription_projectName :: Lens.Lens' ModelPackagingDescription (Prelude.Maybe Prelude.Text)
+modelPackagingDescription_projectName = Lens.lens (\ModelPackagingDescription' {projectName} -> projectName) (\s@ModelPackagingDescription' {} a -> s {projectName = a} :: ModelPackagingDescription)
+
+-- | The status of the model packaging job.
+modelPackagingDescription_status :: Lens.Lens' ModelPackagingDescription (Prelude.Maybe ModelPackagingJobStatus)
+modelPackagingDescription_status = Lens.lens (\ModelPackagingDescription' {status} -> status) (\s@ModelPackagingDescription' {} a -> s {status = a} :: ModelPackagingDescription)
+
+-- | The status message for the model packaging job.
+modelPackagingDescription_statusMessage :: Lens.Lens' ModelPackagingDescription (Prelude.Maybe Prelude.Text)
+modelPackagingDescription_statusMessage = Lens.lens (\ModelPackagingDescription' {statusMessage} -> statusMessage) (\s@ModelPackagingDescription' {} a -> s {statusMessage = a} :: ModelPackagingDescription)
+
+instance Data.FromJSON ModelPackagingDescription where
+  parseJSON =
+    Data.withObject
+      "ModelPackagingDescription"
+      ( \x ->
+          ModelPackagingDescription'
+            Prelude.<$> (x Data..:? "CreationTimestamp")
+            Prelude.<*> (x Data..:? "JobName")
+            Prelude.<*> (x Data..:? "LastUpdatedTimestamp")
+            Prelude.<*> (x Data..:? "ModelPackagingConfiguration")
+            Prelude.<*> (x Data..:? "ModelPackagingJobDescription")
+            Prelude.<*> (x Data..:? "ModelPackagingMethod")
+            Prelude.<*> (x Data..:? "ModelPackagingOutputDetails")
+            Prelude.<*> (x Data..:? "ModelVersion")
+            Prelude.<*> (x Data..:? "ProjectName")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "StatusMessage")
+      )
+
+instance Prelude.Hashable ModelPackagingDescription where
+  hashWithSalt _salt ModelPackagingDescription' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationTimestamp
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` lastUpdatedTimestamp
+      `Prelude.hashWithSalt` modelPackagingConfiguration
+      `Prelude.hashWithSalt` modelPackagingJobDescription
+      `Prelude.hashWithSalt` modelPackagingMethod
+      `Prelude.hashWithSalt` modelPackagingOutputDetails
+      `Prelude.hashWithSalt` modelVersion
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` statusMessage
+
+instance Prelude.NFData ModelPackagingDescription where
+  rnf ModelPackagingDescription' {..} =
+    Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf lastUpdatedTimestamp
+      `Prelude.seq` Prelude.rnf modelPackagingConfiguration
+      `Prelude.seq` Prelude.rnf modelPackagingJobDescription
+      `Prelude.seq` Prelude.rnf modelPackagingMethod
+      `Prelude.seq` Prelude.rnf modelPackagingOutputDetails
+      `Prelude.seq` Prelude.rnf modelVersion
+      `Prelude.seq` Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf statusMessage
diff --git a/gen/Amazonka/LookoutVision/Types/ModelPackagingJobMetadata.hs b/gen/Amazonka/LookoutVision/Types/ModelPackagingJobMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/ModelPackagingJobMetadata.hs
@@ -0,0 +1,180 @@
+{-# 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.LookoutVision.Types.ModelPackagingJobMetadata
+-- 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.LookoutVision.Types.ModelPackagingJobMetadata where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.ModelPackagingJobStatus
+import qualified Amazonka.Prelude as Prelude
+
+-- | Metadata for a model packaging job. For more information, see
+-- ListModelPackagingJobs.
+--
+-- /See:/ 'newModelPackagingJobMetadata' smart constructor.
+data ModelPackagingJobMetadata = ModelPackagingJobMetadata'
+  { -- | The Unix timestamp for the time and date that the model packaging job
+    -- was created.
+    creationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The name of the model packaging job.
+    jobName :: Prelude.Maybe Prelude.Text,
+    -- | The Unix timestamp for the time and date that the model packaging job
+    -- was last updated.
+    lastUpdatedTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The description for the model packaging job.
+    modelPackagingJobDescription :: Prelude.Maybe Prelude.Text,
+    -- | The AWS service used to package the job. Currently Lookout for Vision
+    -- can package jobs with AWS IoT Greengrass.
+    modelPackagingMethod :: Prelude.Maybe Prelude.Text,
+    -- | The version of the model that is in the model package.
+    modelVersion :: Prelude.Maybe Prelude.Text,
+    -- | The project that contains the model that is in the model package.
+    projectName :: Prelude.Maybe Prelude.Text,
+    -- | The status of the model packaging job.
+    status :: Prelude.Maybe ModelPackagingJobStatus,
+    -- | The status message for the model packaging job.
+    statusMessage :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ModelPackagingJobMetadata' 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:
+--
+-- 'creationTimestamp', 'modelPackagingJobMetadata_creationTimestamp' - The Unix timestamp for the time and date that the model packaging job
+-- was created.
+--
+-- 'jobName', 'modelPackagingJobMetadata_jobName' - The name of the model packaging job.
+--
+-- 'lastUpdatedTimestamp', 'modelPackagingJobMetadata_lastUpdatedTimestamp' - The Unix timestamp for the time and date that the model packaging job
+-- was last updated.
+--
+-- 'modelPackagingJobDescription', 'modelPackagingJobMetadata_modelPackagingJobDescription' - The description for the model packaging job.
+--
+-- 'modelPackagingMethod', 'modelPackagingJobMetadata_modelPackagingMethod' - The AWS service used to package the job. Currently Lookout for Vision
+-- can package jobs with AWS IoT Greengrass.
+--
+-- 'modelVersion', 'modelPackagingJobMetadata_modelVersion' - The version of the model that is in the model package.
+--
+-- 'projectName', 'modelPackagingJobMetadata_projectName' - The project that contains the model that is in the model package.
+--
+-- 'status', 'modelPackagingJobMetadata_status' - The status of the model packaging job.
+--
+-- 'statusMessage', 'modelPackagingJobMetadata_statusMessage' - The status message for the model packaging job.
+newModelPackagingJobMetadata ::
+  ModelPackagingJobMetadata
+newModelPackagingJobMetadata =
+  ModelPackagingJobMetadata'
+    { creationTimestamp =
+        Prelude.Nothing,
+      jobName = Prelude.Nothing,
+      lastUpdatedTimestamp = Prelude.Nothing,
+      modelPackagingJobDescription = Prelude.Nothing,
+      modelPackagingMethod = Prelude.Nothing,
+      modelVersion = Prelude.Nothing,
+      projectName = Prelude.Nothing,
+      status = Prelude.Nothing,
+      statusMessage = Prelude.Nothing
+    }
+
+-- | The Unix timestamp for the time and date that the model packaging job
+-- was created.
+modelPackagingJobMetadata_creationTimestamp :: Lens.Lens' ModelPackagingJobMetadata (Prelude.Maybe Prelude.UTCTime)
+modelPackagingJobMetadata_creationTimestamp = Lens.lens (\ModelPackagingJobMetadata' {creationTimestamp} -> creationTimestamp) (\s@ModelPackagingJobMetadata' {} a -> s {creationTimestamp = a} :: ModelPackagingJobMetadata) Prelude.. Lens.mapping Data._Time
+
+-- | The name of the model packaging job.
+modelPackagingJobMetadata_jobName :: Lens.Lens' ModelPackagingJobMetadata (Prelude.Maybe Prelude.Text)
+modelPackagingJobMetadata_jobName = Lens.lens (\ModelPackagingJobMetadata' {jobName} -> jobName) (\s@ModelPackagingJobMetadata' {} a -> s {jobName = a} :: ModelPackagingJobMetadata)
+
+-- | The Unix timestamp for the time and date that the model packaging job
+-- was last updated.
+modelPackagingJobMetadata_lastUpdatedTimestamp :: Lens.Lens' ModelPackagingJobMetadata (Prelude.Maybe Prelude.UTCTime)
+modelPackagingJobMetadata_lastUpdatedTimestamp = Lens.lens (\ModelPackagingJobMetadata' {lastUpdatedTimestamp} -> lastUpdatedTimestamp) (\s@ModelPackagingJobMetadata' {} a -> s {lastUpdatedTimestamp = a} :: ModelPackagingJobMetadata) Prelude.. Lens.mapping Data._Time
+
+-- | The description for the model packaging job.
+modelPackagingJobMetadata_modelPackagingJobDescription :: Lens.Lens' ModelPackagingJobMetadata (Prelude.Maybe Prelude.Text)
+modelPackagingJobMetadata_modelPackagingJobDescription = Lens.lens (\ModelPackagingJobMetadata' {modelPackagingJobDescription} -> modelPackagingJobDescription) (\s@ModelPackagingJobMetadata' {} a -> s {modelPackagingJobDescription = a} :: ModelPackagingJobMetadata)
+
+-- | The AWS service used to package the job. Currently Lookout for Vision
+-- can package jobs with AWS IoT Greengrass.
+modelPackagingJobMetadata_modelPackagingMethod :: Lens.Lens' ModelPackagingJobMetadata (Prelude.Maybe Prelude.Text)
+modelPackagingJobMetadata_modelPackagingMethod = Lens.lens (\ModelPackagingJobMetadata' {modelPackagingMethod} -> modelPackagingMethod) (\s@ModelPackagingJobMetadata' {} a -> s {modelPackagingMethod = a} :: ModelPackagingJobMetadata)
+
+-- | The version of the model that is in the model package.
+modelPackagingJobMetadata_modelVersion :: Lens.Lens' ModelPackagingJobMetadata (Prelude.Maybe Prelude.Text)
+modelPackagingJobMetadata_modelVersion = Lens.lens (\ModelPackagingJobMetadata' {modelVersion} -> modelVersion) (\s@ModelPackagingJobMetadata' {} a -> s {modelVersion = a} :: ModelPackagingJobMetadata)
+
+-- | The project that contains the model that is in the model package.
+modelPackagingJobMetadata_projectName :: Lens.Lens' ModelPackagingJobMetadata (Prelude.Maybe Prelude.Text)
+modelPackagingJobMetadata_projectName = Lens.lens (\ModelPackagingJobMetadata' {projectName} -> projectName) (\s@ModelPackagingJobMetadata' {} a -> s {projectName = a} :: ModelPackagingJobMetadata)
+
+-- | The status of the model packaging job.
+modelPackagingJobMetadata_status :: Lens.Lens' ModelPackagingJobMetadata (Prelude.Maybe ModelPackagingJobStatus)
+modelPackagingJobMetadata_status = Lens.lens (\ModelPackagingJobMetadata' {status} -> status) (\s@ModelPackagingJobMetadata' {} a -> s {status = a} :: ModelPackagingJobMetadata)
+
+-- | The status message for the model packaging job.
+modelPackagingJobMetadata_statusMessage :: Lens.Lens' ModelPackagingJobMetadata (Prelude.Maybe Prelude.Text)
+modelPackagingJobMetadata_statusMessage = Lens.lens (\ModelPackagingJobMetadata' {statusMessage} -> statusMessage) (\s@ModelPackagingJobMetadata' {} a -> s {statusMessage = a} :: ModelPackagingJobMetadata)
+
+instance Data.FromJSON ModelPackagingJobMetadata where
+  parseJSON =
+    Data.withObject
+      "ModelPackagingJobMetadata"
+      ( \x ->
+          ModelPackagingJobMetadata'
+            Prelude.<$> (x Data..:? "CreationTimestamp")
+            Prelude.<*> (x Data..:? "JobName")
+            Prelude.<*> (x Data..:? "LastUpdatedTimestamp")
+            Prelude.<*> (x Data..:? "ModelPackagingJobDescription")
+            Prelude.<*> (x Data..:? "ModelPackagingMethod")
+            Prelude.<*> (x Data..:? "ModelVersion")
+            Prelude.<*> (x Data..:? "ProjectName")
+            Prelude.<*> (x Data..:? "Status")
+            Prelude.<*> (x Data..:? "StatusMessage")
+      )
+
+instance Prelude.Hashable ModelPackagingJobMetadata where
+  hashWithSalt _salt ModelPackagingJobMetadata' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationTimestamp
+      `Prelude.hashWithSalt` jobName
+      `Prelude.hashWithSalt` lastUpdatedTimestamp
+      `Prelude.hashWithSalt` modelPackagingJobDescription
+      `Prelude.hashWithSalt` modelPackagingMethod
+      `Prelude.hashWithSalt` modelVersion
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` status
+      `Prelude.hashWithSalt` statusMessage
+
+instance Prelude.NFData ModelPackagingJobMetadata where
+  rnf ModelPackagingJobMetadata' {..} =
+    Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf jobName
+      `Prelude.seq` Prelude.rnf lastUpdatedTimestamp
+      `Prelude.seq` Prelude.rnf modelPackagingJobDescription
+      `Prelude.seq` Prelude.rnf modelPackagingMethod
+      `Prelude.seq` Prelude.rnf modelVersion
+      `Prelude.seq` Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf status
+      `Prelude.seq` Prelude.rnf statusMessage
diff --git a/gen/Amazonka/LookoutVision/Types/ModelPackagingJobStatus.hs b/gen/Amazonka/LookoutVision/Types/ModelPackagingJobStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/ModelPackagingJobStatus.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.LookoutVision.Types.ModelPackagingJobStatus
+-- 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.LookoutVision.Types.ModelPackagingJobStatus
+  ( ModelPackagingJobStatus
+      ( ..,
+        ModelPackagingJobStatus_CREATED,
+        ModelPackagingJobStatus_FAILED,
+        ModelPackagingJobStatus_RUNNING,
+        ModelPackagingJobStatus_SUCCEEDED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ModelPackagingJobStatus = ModelPackagingJobStatus'
+  { fromModelPackagingJobStatus ::
+      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 ModelPackagingJobStatus_CREATED :: ModelPackagingJobStatus
+pattern ModelPackagingJobStatus_CREATED = ModelPackagingJobStatus' "CREATED"
+
+pattern ModelPackagingJobStatus_FAILED :: ModelPackagingJobStatus
+pattern ModelPackagingJobStatus_FAILED = ModelPackagingJobStatus' "FAILED"
+
+pattern ModelPackagingJobStatus_RUNNING :: ModelPackagingJobStatus
+pattern ModelPackagingJobStatus_RUNNING = ModelPackagingJobStatus' "RUNNING"
+
+pattern ModelPackagingJobStatus_SUCCEEDED :: ModelPackagingJobStatus
+pattern ModelPackagingJobStatus_SUCCEEDED = ModelPackagingJobStatus' "SUCCEEDED"
+
+{-# COMPLETE
+  ModelPackagingJobStatus_CREATED,
+  ModelPackagingJobStatus_FAILED,
+  ModelPackagingJobStatus_RUNNING,
+  ModelPackagingJobStatus_SUCCEEDED,
+  ModelPackagingJobStatus'
+  #-}
diff --git a/gen/Amazonka/LookoutVision/Types/ModelPackagingOutputDetails.hs b/gen/Amazonka/LookoutVision/Types/ModelPackagingOutputDetails.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/ModelPackagingOutputDetails.hs
@@ -0,0 +1,76 @@
+{-# 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.LookoutVision.Types.ModelPackagingOutputDetails
+-- 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.LookoutVision.Types.ModelPackagingOutputDetails where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.GreengrassOutputDetails
+import qualified Amazonka.Prelude as Prelude
+
+-- | Information about the output from a model packaging job.
+--
+-- /See:/ 'newModelPackagingOutputDetails' smart constructor.
+data ModelPackagingOutputDetails = ModelPackagingOutputDetails'
+  { -- | Information about the AWS IoT Greengrass component in a model packaging
+    -- job.
+    greengrass :: Prelude.Maybe GreengrassOutputDetails
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ModelPackagingOutputDetails' 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:
+--
+-- 'greengrass', 'modelPackagingOutputDetails_greengrass' - Information about the AWS IoT Greengrass component in a model packaging
+-- job.
+newModelPackagingOutputDetails ::
+  ModelPackagingOutputDetails
+newModelPackagingOutputDetails =
+  ModelPackagingOutputDetails'
+    { greengrass =
+        Prelude.Nothing
+    }
+
+-- | Information about the AWS IoT Greengrass component in a model packaging
+-- job.
+modelPackagingOutputDetails_greengrass :: Lens.Lens' ModelPackagingOutputDetails (Prelude.Maybe GreengrassOutputDetails)
+modelPackagingOutputDetails_greengrass = Lens.lens (\ModelPackagingOutputDetails' {greengrass} -> greengrass) (\s@ModelPackagingOutputDetails' {} a -> s {greengrass = a} :: ModelPackagingOutputDetails)
+
+instance Data.FromJSON ModelPackagingOutputDetails where
+  parseJSON =
+    Data.withObject
+      "ModelPackagingOutputDetails"
+      ( \x ->
+          ModelPackagingOutputDetails'
+            Prelude.<$> (x Data..:? "Greengrass")
+      )
+
+instance Prelude.Hashable ModelPackagingOutputDetails where
+  hashWithSalt _salt ModelPackagingOutputDetails' {..} =
+    _salt `Prelude.hashWithSalt` greengrass
+
+instance Prelude.NFData ModelPackagingOutputDetails where
+  rnf ModelPackagingOutputDetails' {..} =
+    Prelude.rnf greengrass
diff --git a/gen/Amazonka/LookoutVision/Types/ModelPerformance.hs b/gen/Amazonka/LookoutVision/Types/ModelPerformance.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/ModelPerformance.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.LookoutVision.Types.ModelPerformance
+-- 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.LookoutVision.Types.ModelPerformance 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
+
+-- | Information about the evaluation performance of a trained model.
+--
+-- /See:/ 'newModelPerformance' smart constructor.
+data ModelPerformance = ModelPerformance'
+  { -- | The overall F1 score metric for the trained model.
+    f1Score :: Prelude.Maybe Prelude.Double,
+    -- | The overall precision metric value for the trained model.
+    precision :: Prelude.Maybe Prelude.Double,
+    -- | The overall recall metric value for the trained model.
+    recall :: Prelude.Maybe Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ModelPerformance' 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:
+--
+-- 'f1Score', 'modelPerformance_f1Score' - The overall F1 score metric for the trained model.
+--
+-- 'precision', 'modelPerformance_precision' - The overall precision metric value for the trained model.
+--
+-- 'recall', 'modelPerformance_recall' - The overall recall metric value for the trained model.
+newModelPerformance ::
+  ModelPerformance
+newModelPerformance =
+  ModelPerformance'
+    { f1Score = Prelude.Nothing,
+      precision = Prelude.Nothing,
+      recall = Prelude.Nothing
+    }
+
+-- | The overall F1 score metric for the trained model.
+modelPerformance_f1Score :: Lens.Lens' ModelPerformance (Prelude.Maybe Prelude.Double)
+modelPerformance_f1Score = Lens.lens (\ModelPerformance' {f1Score} -> f1Score) (\s@ModelPerformance' {} a -> s {f1Score = a} :: ModelPerformance)
+
+-- | The overall precision metric value for the trained model.
+modelPerformance_precision :: Lens.Lens' ModelPerformance (Prelude.Maybe Prelude.Double)
+modelPerformance_precision = Lens.lens (\ModelPerformance' {precision} -> precision) (\s@ModelPerformance' {} a -> s {precision = a} :: ModelPerformance)
+
+-- | The overall recall metric value for the trained model.
+modelPerformance_recall :: Lens.Lens' ModelPerformance (Prelude.Maybe Prelude.Double)
+modelPerformance_recall = Lens.lens (\ModelPerformance' {recall} -> recall) (\s@ModelPerformance' {} a -> s {recall = a} :: ModelPerformance)
+
+instance Data.FromJSON ModelPerformance where
+  parseJSON =
+    Data.withObject
+      "ModelPerformance"
+      ( \x ->
+          ModelPerformance'
+            Prelude.<$> (x Data..:? "F1Score")
+            Prelude.<*> (x Data..:? "Precision")
+            Prelude.<*> (x Data..:? "Recall")
+      )
+
+instance Prelude.Hashable ModelPerformance where
+  hashWithSalt _salt ModelPerformance' {..} =
+    _salt
+      `Prelude.hashWithSalt` f1Score
+      `Prelude.hashWithSalt` precision
+      `Prelude.hashWithSalt` recall
+
+instance Prelude.NFData ModelPerformance where
+  rnf ModelPerformance' {..} =
+    Prelude.rnf f1Score
+      `Prelude.seq` Prelude.rnf precision
+      `Prelude.seq` Prelude.rnf recall
diff --git a/gen/Amazonka/LookoutVision/Types/ModelStatus.hs b/gen/Amazonka/LookoutVision/Types/ModelStatus.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/ModelStatus.hs
@@ -0,0 +1,106 @@
+{-# 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.LookoutVision.Types.ModelStatus
+-- 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.LookoutVision.Types.ModelStatus
+  ( ModelStatus
+      ( ..,
+        ModelStatus_DELETING,
+        ModelStatus_HOSTED,
+        ModelStatus_HOSTING_FAILED,
+        ModelStatus_STARTING_HOSTING,
+        ModelStatus_STOPPING_HOSTING,
+        ModelStatus_SYSTEM_UPDATING,
+        ModelStatus_TRAINED,
+        ModelStatus_TRAINING,
+        ModelStatus_TRAINING_FAILED
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype ModelStatus = ModelStatus'
+  { fromModelStatus ::
+      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 ModelStatus_DELETING :: ModelStatus
+pattern ModelStatus_DELETING = ModelStatus' "DELETING"
+
+pattern ModelStatus_HOSTED :: ModelStatus
+pattern ModelStatus_HOSTED = ModelStatus' "HOSTED"
+
+pattern ModelStatus_HOSTING_FAILED :: ModelStatus
+pattern ModelStatus_HOSTING_FAILED = ModelStatus' "HOSTING_FAILED"
+
+pattern ModelStatus_STARTING_HOSTING :: ModelStatus
+pattern ModelStatus_STARTING_HOSTING = ModelStatus' "STARTING_HOSTING"
+
+pattern ModelStatus_STOPPING_HOSTING :: ModelStatus
+pattern ModelStatus_STOPPING_HOSTING = ModelStatus' "STOPPING_HOSTING"
+
+pattern ModelStatus_SYSTEM_UPDATING :: ModelStatus
+pattern ModelStatus_SYSTEM_UPDATING = ModelStatus' "SYSTEM_UPDATING"
+
+pattern ModelStatus_TRAINED :: ModelStatus
+pattern ModelStatus_TRAINED = ModelStatus' "TRAINED"
+
+pattern ModelStatus_TRAINING :: ModelStatus
+pattern ModelStatus_TRAINING = ModelStatus' "TRAINING"
+
+pattern ModelStatus_TRAINING_FAILED :: ModelStatus
+pattern ModelStatus_TRAINING_FAILED = ModelStatus' "TRAINING_FAILED"
+
+{-# COMPLETE
+  ModelStatus_DELETING,
+  ModelStatus_HOSTED,
+  ModelStatus_HOSTING_FAILED,
+  ModelStatus_STARTING_HOSTING,
+  ModelStatus_STOPPING_HOSTING,
+  ModelStatus_SYSTEM_UPDATING,
+  ModelStatus_TRAINED,
+  ModelStatus_TRAINING,
+  ModelStatus_TRAINING_FAILED,
+  ModelStatus'
+  #-}
diff --git a/gen/Amazonka/LookoutVision/Types/OutputConfig.hs b/gen/Amazonka/LookoutVision/Types/OutputConfig.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/OutputConfig.hs
@@ -0,0 +1,78 @@
+{-# 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.LookoutVision.Types.OutputConfig
+-- 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.LookoutVision.Types.OutputConfig where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.S3Location
+import qualified Amazonka.Prelude as Prelude
+
+-- | The S3 location where Amazon Lookout for Vision saves model training
+-- files.
+--
+-- /See:/ 'newOutputConfig' smart constructor.
+data OutputConfig = OutputConfig'
+  { -- | The S3 location for the output.
+    s3Location :: S3Location
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OutputConfig' 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:
+--
+-- 's3Location', 'outputConfig_s3Location' - The S3 location for the output.
+newOutputConfig ::
+  -- | 's3Location'
+  S3Location ->
+  OutputConfig
+newOutputConfig pS3Location_ =
+  OutputConfig' {s3Location = pS3Location_}
+
+-- | The S3 location for the output.
+outputConfig_s3Location :: Lens.Lens' OutputConfig S3Location
+outputConfig_s3Location = Lens.lens (\OutputConfig' {s3Location} -> s3Location) (\s@OutputConfig' {} a -> s {s3Location = a} :: OutputConfig)
+
+instance Data.FromJSON OutputConfig where
+  parseJSON =
+    Data.withObject
+      "OutputConfig"
+      ( \x ->
+          OutputConfig' Prelude.<$> (x Data..: "S3Location")
+      )
+
+instance Prelude.Hashable OutputConfig where
+  hashWithSalt _salt OutputConfig' {..} =
+    _salt `Prelude.hashWithSalt` s3Location
+
+instance Prelude.NFData OutputConfig where
+  rnf OutputConfig' {..} = Prelude.rnf s3Location
+
+instance Data.ToJSON OutputConfig where
+  toJSON OutputConfig' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("S3Location" Data..= s3Location)]
+      )
diff --git a/gen/Amazonka/LookoutVision/Types/OutputS3Object.hs b/gen/Amazonka/LookoutVision/Types/OutputS3Object.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/OutputS3Object.hs
@@ -0,0 +1,84 @@
+{-# 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.LookoutVision.Types.OutputS3Object
+-- 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.LookoutVision.Types.OutputS3Object 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 S3 location where Amazon Lookout for Vision saves training output.
+--
+-- /See:/ 'newOutputS3Object' smart constructor.
+data OutputS3Object = OutputS3Object'
+  { -- | The bucket that contains the training output.
+    bucket :: Prelude.Text,
+    -- | The location of the training output in the bucket.
+    key :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'OutputS3Object' 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:
+--
+-- 'bucket', 'outputS3Object_bucket' - The bucket that contains the training output.
+--
+-- 'key', 'outputS3Object_key' - The location of the training output in the bucket.
+newOutputS3Object ::
+  -- | 'bucket'
+  Prelude.Text ->
+  -- | 'key'
+  Prelude.Text ->
+  OutputS3Object
+newOutputS3Object pBucket_ pKey_ =
+  OutputS3Object' {bucket = pBucket_, key = pKey_}
+
+-- | The bucket that contains the training output.
+outputS3Object_bucket :: Lens.Lens' OutputS3Object Prelude.Text
+outputS3Object_bucket = Lens.lens (\OutputS3Object' {bucket} -> bucket) (\s@OutputS3Object' {} a -> s {bucket = a} :: OutputS3Object)
+
+-- | The location of the training output in the bucket.
+outputS3Object_key :: Lens.Lens' OutputS3Object Prelude.Text
+outputS3Object_key = Lens.lens (\OutputS3Object' {key} -> key) (\s@OutputS3Object' {} a -> s {key = a} :: OutputS3Object)
+
+instance Data.FromJSON OutputS3Object where
+  parseJSON =
+    Data.withObject
+      "OutputS3Object"
+      ( \x ->
+          OutputS3Object'
+            Prelude.<$> (x Data..: "Bucket")
+            Prelude.<*> (x Data..: "Key")
+      )
+
+instance Prelude.Hashable OutputS3Object where
+  hashWithSalt _salt OutputS3Object' {..} =
+    _salt
+      `Prelude.hashWithSalt` bucket
+      `Prelude.hashWithSalt` key
+
+instance Prelude.NFData OutputS3Object where
+  rnf OutputS3Object' {..} =
+    Prelude.rnf bucket `Prelude.seq` Prelude.rnf key
diff --git a/gen/Amazonka/LookoutVision/Types/PixelAnomaly.hs b/gen/Amazonka/LookoutVision/Types/PixelAnomaly.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/PixelAnomaly.hs
@@ -0,0 +1,92 @@
+{-# 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.LookoutVision.Types.PixelAnomaly
+-- 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.LookoutVision.Types.PixelAnomaly 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
+
+-- | Information about the pixels in an anomaly mask. For more information,
+-- see Anomaly. @PixelAnomaly@ is only returned by image segmentation
+-- models.
+--
+-- /See:/ 'newPixelAnomaly' smart constructor.
+data PixelAnomaly = PixelAnomaly'
+  { -- | A hex color value for the mask that covers an anomaly type. Each anomaly
+    -- type has a different mask color. The color maps to the color of the
+    -- anomaly type used in the training dataset.
+    color :: Prelude.Maybe Prelude.Text,
+    -- | The percentage area of the image that the anomaly type covers.
+    totalPercentageArea :: Prelude.Maybe Prelude.Double
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'PixelAnomaly' 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:
+--
+-- 'color', 'pixelAnomaly_color' - A hex color value for the mask that covers an anomaly type. Each anomaly
+-- type has a different mask color. The color maps to the color of the
+-- anomaly type used in the training dataset.
+--
+-- 'totalPercentageArea', 'pixelAnomaly_totalPercentageArea' - The percentage area of the image that the anomaly type covers.
+newPixelAnomaly ::
+  PixelAnomaly
+newPixelAnomaly =
+  PixelAnomaly'
+    { color = Prelude.Nothing,
+      totalPercentageArea = Prelude.Nothing
+    }
+
+-- | A hex color value for the mask that covers an anomaly type. Each anomaly
+-- type has a different mask color. The color maps to the color of the
+-- anomaly type used in the training dataset.
+pixelAnomaly_color :: Lens.Lens' PixelAnomaly (Prelude.Maybe Prelude.Text)
+pixelAnomaly_color = Lens.lens (\PixelAnomaly' {color} -> color) (\s@PixelAnomaly' {} a -> s {color = a} :: PixelAnomaly)
+
+-- | The percentage area of the image that the anomaly type covers.
+pixelAnomaly_totalPercentageArea :: Lens.Lens' PixelAnomaly (Prelude.Maybe Prelude.Double)
+pixelAnomaly_totalPercentageArea = Lens.lens (\PixelAnomaly' {totalPercentageArea} -> totalPercentageArea) (\s@PixelAnomaly' {} a -> s {totalPercentageArea = a} :: PixelAnomaly)
+
+instance Data.FromJSON PixelAnomaly where
+  parseJSON =
+    Data.withObject
+      "PixelAnomaly"
+      ( \x ->
+          PixelAnomaly'
+            Prelude.<$> (x Data..:? "Color")
+            Prelude.<*> (x Data..:? "TotalPercentageArea")
+      )
+
+instance Prelude.Hashable PixelAnomaly where
+  hashWithSalt _salt PixelAnomaly' {..} =
+    _salt
+      `Prelude.hashWithSalt` color
+      `Prelude.hashWithSalt` totalPercentageArea
+
+instance Prelude.NFData PixelAnomaly where
+  rnf PixelAnomaly' {..} =
+    Prelude.rnf color
+      `Prelude.seq` Prelude.rnf totalPercentageArea
diff --git a/gen/Amazonka/LookoutVision/Types/ProjectDescription.hs b/gen/Amazonka/LookoutVision/Types/ProjectDescription.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/ProjectDescription.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.LookoutVision.Types.ProjectDescription
+-- 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.LookoutVision.Types.ProjectDescription where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.DatasetMetadata
+import qualified Amazonka.Prelude as Prelude
+
+-- | Describe an Amazon Lookout for Vision project. For more information, see
+-- DescribeProject.
+--
+-- /See:/ 'newProjectDescription' smart constructor.
+data ProjectDescription = ProjectDescription'
+  { -- | The unix timestamp for the date and time that the project was created.
+    creationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | A list of datasets in the project.
+    datasets :: Prelude.Maybe [DatasetMetadata],
+    -- | The Amazon Resource Name (ARN) of the project.
+    projectArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the project.
+    projectName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ProjectDescription' 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:
+--
+-- 'creationTimestamp', 'projectDescription_creationTimestamp' - The unix timestamp for the date and time that the project was created.
+--
+-- 'datasets', 'projectDescription_datasets' - A list of datasets in the project.
+--
+-- 'projectArn', 'projectDescription_projectArn' - The Amazon Resource Name (ARN) of the project.
+--
+-- 'projectName', 'projectDescription_projectName' - The name of the project.
+newProjectDescription ::
+  ProjectDescription
+newProjectDescription =
+  ProjectDescription'
+    { creationTimestamp =
+        Prelude.Nothing,
+      datasets = Prelude.Nothing,
+      projectArn = Prelude.Nothing,
+      projectName = Prelude.Nothing
+    }
+
+-- | The unix timestamp for the date and time that the project was created.
+projectDescription_creationTimestamp :: Lens.Lens' ProjectDescription (Prelude.Maybe Prelude.UTCTime)
+projectDescription_creationTimestamp = Lens.lens (\ProjectDescription' {creationTimestamp} -> creationTimestamp) (\s@ProjectDescription' {} a -> s {creationTimestamp = a} :: ProjectDescription) Prelude.. Lens.mapping Data._Time
+
+-- | A list of datasets in the project.
+projectDescription_datasets :: Lens.Lens' ProjectDescription (Prelude.Maybe [DatasetMetadata])
+projectDescription_datasets = Lens.lens (\ProjectDescription' {datasets} -> datasets) (\s@ProjectDescription' {} a -> s {datasets = a} :: ProjectDescription) Prelude.. Lens.mapping Lens.coerced
+
+-- | The Amazon Resource Name (ARN) of the project.
+projectDescription_projectArn :: Lens.Lens' ProjectDescription (Prelude.Maybe Prelude.Text)
+projectDescription_projectArn = Lens.lens (\ProjectDescription' {projectArn} -> projectArn) (\s@ProjectDescription' {} a -> s {projectArn = a} :: ProjectDescription)
+
+-- | The name of the project.
+projectDescription_projectName :: Lens.Lens' ProjectDescription (Prelude.Maybe Prelude.Text)
+projectDescription_projectName = Lens.lens (\ProjectDescription' {projectName} -> projectName) (\s@ProjectDescription' {} a -> s {projectName = a} :: ProjectDescription)
+
+instance Data.FromJSON ProjectDescription where
+  parseJSON =
+    Data.withObject
+      "ProjectDescription"
+      ( \x ->
+          ProjectDescription'
+            Prelude.<$> (x Data..:? "CreationTimestamp")
+            Prelude.<*> (x Data..:? "Datasets" Data..!= Prelude.mempty)
+            Prelude.<*> (x Data..:? "ProjectArn")
+            Prelude.<*> (x Data..:? "ProjectName")
+      )
+
+instance Prelude.Hashable ProjectDescription where
+  hashWithSalt _salt ProjectDescription' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationTimestamp
+      `Prelude.hashWithSalt` datasets
+      `Prelude.hashWithSalt` projectArn
+      `Prelude.hashWithSalt` projectName
+
+instance Prelude.NFData ProjectDescription where
+  rnf ProjectDescription' {..} =
+    Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf datasets
+      `Prelude.seq` Prelude.rnf projectArn
+      `Prelude.seq` Prelude.rnf projectName
diff --git a/gen/Amazonka/LookoutVision/Types/ProjectMetadata.hs b/gen/Amazonka/LookoutVision/Types/ProjectMetadata.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/ProjectMetadata.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.LookoutVision.Types.ProjectMetadata
+-- 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.LookoutVision.Types.ProjectMetadata 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
+
+-- | Metadata about an Amazon Lookout for Vision project.
+--
+-- /See:/ 'newProjectMetadata' smart constructor.
+data ProjectMetadata = ProjectMetadata'
+  { -- | The unix timestamp for the date and time that the project was created.
+    creationTimestamp :: Prelude.Maybe Data.POSIX,
+    -- | The Amazon Resource Name (ARN) of the project.
+    projectArn :: Prelude.Maybe Prelude.Text,
+    -- | The name of the project.
+    projectName :: Prelude.Maybe Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'ProjectMetadata' 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:
+--
+-- 'creationTimestamp', 'projectMetadata_creationTimestamp' - The unix timestamp for the date and time that the project was created.
+--
+-- 'projectArn', 'projectMetadata_projectArn' - The Amazon Resource Name (ARN) of the project.
+--
+-- 'projectName', 'projectMetadata_projectName' - The name of the project.
+newProjectMetadata ::
+  ProjectMetadata
+newProjectMetadata =
+  ProjectMetadata'
+    { creationTimestamp =
+        Prelude.Nothing,
+      projectArn = Prelude.Nothing,
+      projectName = Prelude.Nothing
+    }
+
+-- | The unix timestamp for the date and time that the project was created.
+projectMetadata_creationTimestamp :: Lens.Lens' ProjectMetadata (Prelude.Maybe Prelude.UTCTime)
+projectMetadata_creationTimestamp = Lens.lens (\ProjectMetadata' {creationTimestamp} -> creationTimestamp) (\s@ProjectMetadata' {} a -> s {creationTimestamp = a} :: ProjectMetadata) Prelude.. Lens.mapping Data._Time
+
+-- | The Amazon Resource Name (ARN) of the project.
+projectMetadata_projectArn :: Lens.Lens' ProjectMetadata (Prelude.Maybe Prelude.Text)
+projectMetadata_projectArn = Lens.lens (\ProjectMetadata' {projectArn} -> projectArn) (\s@ProjectMetadata' {} a -> s {projectArn = a} :: ProjectMetadata)
+
+-- | The name of the project.
+projectMetadata_projectName :: Lens.Lens' ProjectMetadata (Prelude.Maybe Prelude.Text)
+projectMetadata_projectName = Lens.lens (\ProjectMetadata' {projectName} -> projectName) (\s@ProjectMetadata' {} a -> s {projectName = a} :: ProjectMetadata)
+
+instance Data.FromJSON ProjectMetadata where
+  parseJSON =
+    Data.withObject
+      "ProjectMetadata"
+      ( \x ->
+          ProjectMetadata'
+            Prelude.<$> (x Data..:? "CreationTimestamp")
+            Prelude.<*> (x Data..:? "ProjectArn")
+            Prelude.<*> (x Data..:? "ProjectName")
+      )
+
+instance Prelude.Hashable ProjectMetadata where
+  hashWithSalt _salt ProjectMetadata' {..} =
+    _salt
+      `Prelude.hashWithSalt` creationTimestamp
+      `Prelude.hashWithSalt` projectArn
+      `Prelude.hashWithSalt` projectName
+
+instance Prelude.NFData ProjectMetadata where
+  rnf ProjectMetadata' {..} =
+    Prelude.rnf creationTimestamp
+      `Prelude.seq` Prelude.rnf projectArn
+      `Prelude.seq` Prelude.rnf projectName
diff --git a/gen/Amazonka/LookoutVision/Types/S3Location.hs b/gen/Amazonka/LookoutVision/Types/S3Location.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/S3Location.hs
@@ -0,0 +1,104 @@
+{-# 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.LookoutVision.Types.S3Location
+-- 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.LookoutVision.Types.S3Location 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
+
+-- | Information about the location of training output or the output of a
+-- model packaging job.
+--
+-- /See:/ 'newS3Location' smart constructor.
+data S3Location = S3Location'
+  { -- | The path of the folder, within the S3 bucket, that contains the output.
+    prefix :: Prelude.Maybe Prelude.Text,
+    -- | The S3 bucket that contains the training or model packaging job output.
+    -- If you are training a model, the bucket must in your AWS account. If you
+    -- use an S3 bucket for a model packaging job, the S3 bucket must be in the
+    -- same AWS Region and AWS account in which you use AWS IoT Greengrass.
+    bucket :: Prelude.Text
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'S3Location' 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:
+--
+-- 'prefix', 's3Location_prefix' - The path of the folder, within the S3 bucket, that contains the output.
+--
+-- 'bucket', 's3Location_bucket' - The S3 bucket that contains the training or model packaging job output.
+-- If you are training a model, the bucket must in your AWS account. If you
+-- use an S3 bucket for a model packaging job, the S3 bucket must be in the
+-- same AWS Region and AWS account in which you use AWS IoT Greengrass.
+newS3Location ::
+  -- | 'bucket'
+  Prelude.Text ->
+  S3Location
+newS3Location pBucket_ =
+  S3Location'
+    { prefix = Prelude.Nothing,
+      bucket = pBucket_
+    }
+
+-- | The path of the folder, within the S3 bucket, that contains the output.
+s3Location_prefix :: Lens.Lens' S3Location (Prelude.Maybe Prelude.Text)
+s3Location_prefix = Lens.lens (\S3Location' {prefix} -> prefix) (\s@S3Location' {} a -> s {prefix = a} :: S3Location)
+
+-- | The S3 bucket that contains the training or model packaging job output.
+-- If you are training a model, the bucket must in your AWS account. If you
+-- use an S3 bucket for a model packaging job, the S3 bucket must be in the
+-- same AWS Region and AWS account in which you use AWS IoT Greengrass.
+s3Location_bucket :: Lens.Lens' S3Location Prelude.Text
+s3Location_bucket = Lens.lens (\S3Location' {bucket} -> bucket) (\s@S3Location' {} a -> s {bucket = a} :: S3Location)
+
+instance Data.FromJSON S3Location where
+  parseJSON =
+    Data.withObject
+      "S3Location"
+      ( \x ->
+          S3Location'
+            Prelude.<$> (x Data..:? "Prefix")
+            Prelude.<*> (x Data..: "Bucket")
+      )
+
+instance Prelude.Hashable S3Location where
+  hashWithSalt _salt S3Location' {..} =
+    _salt
+      `Prelude.hashWithSalt` prefix
+      `Prelude.hashWithSalt` bucket
+
+instance Prelude.NFData S3Location where
+  rnf S3Location' {..} =
+    Prelude.rnf prefix `Prelude.seq` Prelude.rnf bucket
+
+instance Data.ToJSON S3Location where
+  toJSON S3Location' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Prefix" Data..=) Prelude.<$> prefix,
+            Prelude.Just ("Bucket" Data..= bucket)
+          ]
+      )
diff --git a/gen/Amazonka/LookoutVision/Types/Tag.hs b/gen/Amazonka/LookoutVision/Types/Tag.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/Tag.hs
@@ -0,0 +1,94 @@
+{-# 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.LookoutVision.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.LookoutVision.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
+
+-- | A key and value pair that is attached to the specified Amazon Lookout
+-- for Vision model.
+--
+-- /See:/ 'newTag' smart constructor.
+data Tag = Tag'
+  { -- | The key of the tag that is attached to the specified model.
+    key :: Prelude.Text,
+    -- | The value of the tag that is attached to the specified model.
+    value :: 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:
+--
+-- 'key', 'tag_key' - The key of the tag that is attached to the specified model.
+--
+-- 'value', 'tag_value' - The value of the tag that is attached to the specified model.
+newTag ::
+  -- | 'key'
+  Prelude.Text ->
+  -- | 'value'
+  Prelude.Text ->
+  Tag
+newTag pKey_ pValue_ =
+  Tag' {key = pKey_, value = pValue_}
+
+-- | The key of the tag that is attached to the specified model.
+tag_key :: Lens.Lens' Tag Prelude.Text
+tag_key = Lens.lens (\Tag' {key} -> key) (\s@Tag' {} a -> s {key = a} :: Tag)
+
+-- | The value of the tag that is attached to the specified model.
+tag_value :: Lens.Lens' Tag Prelude.Text
+tag_value = Lens.lens (\Tag' {value} -> value) (\s@Tag' {} a -> s {value = a} :: Tag)
+
+instance Data.FromJSON Tag where
+  parseJSON =
+    Data.withObject
+      "Tag"
+      ( \x ->
+          Tag'
+            Prelude.<$> (x Data..: "Key")
+            Prelude.<*> (x Data..: "Value")
+      )
+
+instance Prelude.Hashable Tag where
+  hashWithSalt _salt Tag' {..} =
+    _salt
+      `Prelude.hashWithSalt` key
+      `Prelude.hashWithSalt` value
+
+instance Prelude.NFData Tag where
+  rnf Tag' {..} =
+    Prelude.rnf key `Prelude.seq` Prelude.rnf value
+
+instance Data.ToJSON Tag where
+  toJSON Tag' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ Prelude.Just ("Key" Data..= key),
+            Prelude.Just ("Value" Data..= value)
+          ]
+      )
diff --git a/gen/Amazonka/LookoutVision/Types/TargetDevice.hs b/gen/Amazonka/LookoutVision/Types/TargetDevice.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/TargetDevice.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.LookoutVision.Types.TargetDevice
+-- 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.LookoutVision.Types.TargetDevice
+  ( TargetDevice
+      ( ..,
+        TargetDevice_Jetson_xavier
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TargetDevice = TargetDevice'
+  { fromTargetDevice ::
+      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 TargetDevice_Jetson_xavier :: TargetDevice
+pattern TargetDevice_Jetson_xavier = TargetDevice' "jetson_xavier"
+
+{-# COMPLETE
+  TargetDevice_Jetson_xavier,
+  TargetDevice'
+  #-}
diff --git a/gen/Amazonka/LookoutVision/Types/TargetPlatform.hs b/gen/Amazonka/LookoutVision/Types/TargetPlatform.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/TargetPlatform.hs
@@ -0,0 +1,161 @@
+{-# 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.LookoutVision.Types.TargetPlatform
+-- 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.LookoutVision.Types.TargetPlatform where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types.TargetPlatformAccelerator
+import Amazonka.LookoutVision.Types.TargetPlatformArch
+import Amazonka.LookoutVision.Types.TargetPlatformOs
+import qualified Amazonka.Prelude as Prelude
+
+-- | The platform on which a model runs on an AWS IoT Greengrass core device.
+--
+-- /See:/ 'newTargetPlatform' smart constructor.
+data TargetPlatform = TargetPlatform'
+  { -- | The target accelerator for the model. Currently, Amazon Lookout for
+    -- Vision only supports NVIDIA (Nvidia graphics processing unit) and CPU
+    -- accelerators. If you specify NVIDIA as an accelerator, you must also
+    -- specify the @gpu-code@, @trt-ver@, and @cuda-ver@ compiler options. If
+    -- you don\'t specify an accelerator, Lookout for Vision uses the CPU for
+    -- compilation and we highly recommend that you use the
+    -- GreengrassConfiguration$CompilerOptions field. For example, you can use
+    -- the following compiler options for CPU:
+    --
+    -- -   @mcpu@: CPU micro-architecture. For example,
+    --     @{\'mcpu\': \'skylake-avx512\'}@
+    --
+    -- -   @mattr@: CPU flags. For example,
+    --     @{\'mattr\': [\'+neon\', \'+vfpv4\']}@
+    accelerator :: Prelude.Maybe TargetPlatformAccelerator,
+    -- | The target operating system for the model. Linux is the only operating
+    -- system that is currently supported.
+    os :: TargetPlatformOs,
+    -- | The target architecture for the model. The currently supported
+    -- architectures are X86_64 (64-bit version of the x86 instruction set) and
+    -- ARM_64 (ARMv8 64-bit CPU).
+    arch :: TargetPlatformArch
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'TargetPlatform' 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:
+--
+-- 'accelerator', 'targetPlatform_accelerator' - The target accelerator for the model. Currently, Amazon Lookout for
+-- Vision only supports NVIDIA (Nvidia graphics processing unit) and CPU
+-- accelerators. If you specify NVIDIA as an accelerator, you must also
+-- specify the @gpu-code@, @trt-ver@, and @cuda-ver@ compiler options. If
+-- you don\'t specify an accelerator, Lookout for Vision uses the CPU for
+-- compilation and we highly recommend that you use the
+-- GreengrassConfiguration$CompilerOptions field. For example, you can use
+-- the following compiler options for CPU:
+--
+-- -   @mcpu@: CPU micro-architecture. For example,
+--     @{\'mcpu\': \'skylake-avx512\'}@
+--
+-- -   @mattr@: CPU flags. For example,
+--     @{\'mattr\': [\'+neon\', \'+vfpv4\']}@
+--
+-- 'os', 'targetPlatform_os' - The target operating system for the model. Linux is the only operating
+-- system that is currently supported.
+--
+-- 'arch', 'targetPlatform_arch' - The target architecture for the model. The currently supported
+-- architectures are X86_64 (64-bit version of the x86 instruction set) and
+-- ARM_64 (ARMv8 64-bit CPU).
+newTargetPlatform ::
+  -- | 'os'
+  TargetPlatformOs ->
+  -- | 'arch'
+  TargetPlatformArch ->
+  TargetPlatform
+newTargetPlatform pOs_ pArch_ =
+  TargetPlatform'
+    { accelerator = Prelude.Nothing,
+      os = pOs_,
+      arch = pArch_
+    }
+
+-- | The target accelerator for the model. Currently, Amazon Lookout for
+-- Vision only supports NVIDIA (Nvidia graphics processing unit) and CPU
+-- accelerators. If you specify NVIDIA as an accelerator, you must also
+-- specify the @gpu-code@, @trt-ver@, and @cuda-ver@ compiler options. If
+-- you don\'t specify an accelerator, Lookout for Vision uses the CPU for
+-- compilation and we highly recommend that you use the
+-- GreengrassConfiguration$CompilerOptions field. For example, you can use
+-- the following compiler options for CPU:
+--
+-- -   @mcpu@: CPU micro-architecture. For example,
+--     @{\'mcpu\': \'skylake-avx512\'}@
+--
+-- -   @mattr@: CPU flags. For example,
+--     @{\'mattr\': [\'+neon\', \'+vfpv4\']}@
+targetPlatform_accelerator :: Lens.Lens' TargetPlatform (Prelude.Maybe TargetPlatformAccelerator)
+targetPlatform_accelerator = Lens.lens (\TargetPlatform' {accelerator} -> accelerator) (\s@TargetPlatform' {} a -> s {accelerator = a} :: TargetPlatform)
+
+-- | The target operating system for the model. Linux is the only operating
+-- system that is currently supported.
+targetPlatform_os :: Lens.Lens' TargetPlatform TargetPlatformOs
+targetPlatform_os = Lens.lens (\TargetPlatform' {os} -> os) (\s@TargetPlatform' {} a -> s {os = a} :: TargetPlatform)
+
+-- | The target architecture for the model. The currently supported
+-- architectures are X86_64 (64-bit version of the x86 instruction set) and
+-- ARM_64 (ARMv8 64-bit CPU).
+targetPlatform_arch :: Lens.Lens' TargetPlatform TargetPlatformArch
+targetPlatform_arch = Lens.lens (\TargetPlatform' {arch} -> arch) (\s@TargetPlatform' {} a -> s {arch = a} :: TargetPlatform)
+
+instance Data.FromJSON TargetPlatform where
+  parseJSON =
+    Data.withObject
+      "TargetPlatform"
+      ( \x ->
+          TargetPlatform'
+            Prelude.<$> (x Data..:? "Accelerator")
+            Prelude.<*> (x Data..: "Os")
+            Prelude.<*> (x Data..: "Arch")
+      )
+
+instance Prelude.Hashable TargetPlatform where
+  hashWithSalt _salt TargetPlatform' {..} =
+    _salt
+      `Prelude.hashWithSalt` accelerator
+      `Prelude.hashWithSalt` os
+      `Prelude.hashWithSalt` arch
+
+instance Prelude.NFData TargetPlatform where
+  rnf TargetPlatform' {..} =
+    Prelude.rnf accelerator
+      `Prelude.seq` Prelude.rnf os
+      `Prelude.seq` Prelude.rnf arch
+
+instance Data.ToJSON TargetPlatform where
+  toJSON TargetPlatform' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [ ("Accelerator" Data..=) Prelude.<$> accelerator,
+            Prelude.Just ("Os" Data..= os),
+            Prelude.Just ("Arch" Data..= arch)
+          ]
+      )
diff --git a/gen/Amazonka/LookoutVision/Types/TargetPlatformAccelerator.hs b/gen/Amazonka/LookoutVision/Types/TargetPlatformAccelerator.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/TargetPlatformAccelerator.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.LookoutVision.Types.TargetPlatformAccelerator
+-- 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.LookoutVision.Types.TargetPlatformAccelerator
+  ( TargetPlatformAccelerator
+      ( ..,
+        TargetPlatformAccelerator_NVIDIA
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TargetPlatformAccelerator = TargetPlatformAccelerator'
+  { fromTargetPlatformAccelerator ::
+      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 TargetPlatformAccelerator_NVIDIA :: TargetPlatformAccelerator
+pattern TargetPlatformAccelerator_NVIDIA = TargetPlatformAccelerator' "NVIDIA"
+
+{-# COMPLETE
+  TargetPlatformAccelerator_NVIDIA,
+  TargetPlatformAccelerator'
+  #-}
diff --git a/gen/Amazonka/LookoutVision/Types/TargetPlatformArch.hs b/gen/Amazonka/LookoutVision/Types/TargetPlatformArch.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/TargetPlatformArch.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.LookoutVision.Types.TargetPlatformArch
+-- 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.LookoutVision.Types.TargetPlatformArch
+  ( TargetPlatformArch
+      ( ..,
+        TargetPlatformArch_ARM64,
+        TargetPlatformArch_X86_64
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TargetPlatformArch = TargetPlatformArch'
+  { fromTargetPlatformArch ::
+      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 TargetPlatformArch_ARM64 :: TargetPlatformArch
+pattern TargetPlatformArch_ARM64 = TargetPlatformArch' "ARM64"
+
+pattern TargetPlatformArch_X86_64 :: TargetPlatformArch
+pattern TargetPlatformArch_X86_64 = TargetPlatformArch' "X86_64"
+
+{-# COMPLETE
+  TargetPlatformArch_ARM64,
+  TargetPlatformArch_X86_64,
+  TargetPlatformArch'
+  #-}
diff --git a/gen/Amazonka/LookoutVision/Types/TargetPlatformOs.hs b/gen/Amazonka/LookoutVision/Types/TargetPlatformOs.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/Types/TargetPlatformOs.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.LookoutVision.Types.TargetPlatformOs
+-- 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.LookoutVision.Types.TargetPlatformOs
+  ( TargetPlatformOs
+      ( ..,
+        TargetPlatformOs_LINUX
+      ),
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Data as Data
+import qualified Amazonka.Prelude as Prelude
+
+newtype TargetPlatformOs = TargetPlatformOs'
+  { fromTargetPlatformOs ::
+      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 TargetPlatformOs_LINUX :: TargetPlatformOs
+pattern TargetPlatformOs_LINUX = TargetPlatformOs' "LINUX"
+
+{-# COMPLETE
+  TargetPlatformOs_LINUX,
+  TargetPlatformOs'
+  #-}
diff --git a/gen/Amazonka/LookoutVision/UntagResource.hs b/gen/Amazonka/LookoutVision/UntagResource.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/UntagResource.hs
@@ -0,0 +1,170 @@
+{-# 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.LookoutVision.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)
+--
+-- Removes one or more tags from an Amazon Lookout for Vision model. For
+-- more information, see /Tagging a model/ in the /Amazon Lookout for
+-- Vision Developer Guide/.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:UntagResource@ operation.
+module Amazonka.LookoutVision.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.LookoutVision.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 Amazon Resource Name (ARN) of the model from which you want to
+    -- remove tags.
+    resourceArn :: Prelude.Text,
+    -- | A list of the keys of the tags that you want to remove.
+    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 Amazon Resource Name (ARN) of the model from which you want to
+-- remove tags.
+--
+-- 'tagKeys', 'untagResource_tagKeys' - A list of the keys of the tags that you want to remove.
+newUntagResource ::
+  -- | 'resourceArn'
+  Prelude.Text ->
+  UntagResource
+newUntagResource pResourceArn_ =
+  UntagResource'
+    { resourceArn = pResourceArn_,
+      tagKeys = Prelude.mempty
+    }
+
+-- | The Amazon Resource Name (ARN) of the model from which you want to
+-- remove tags.
+untagResource_resourceArn :: Lens.Lens' UntagResource Prelude.Text
+untagResource_resourceArn = Lens.lens (\UntagResource' {resourceArn} -> resourceArn) (\s@UntagResource' {} a -> s {resourceArn = a} :: UntagResource)
+
+-- | A list of the keys of the tags that you want to remove.
+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.delete (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
+          [ "Content-Type"
+              Data.=# ( "application/x-amz-json-1.1" ::
+                          Prelude.ByteString
+                      )
+          ]
+      )
+
+instance Data.ToPath UntagResource where
+  toPath UntagResource' {..} =
+    Prelude.mconcat
+      ["/2020-11-20/tags/", Data.toBS resourceArn]
+
+instance Data.ToQuery UntagResource where
+  toQuery UntagResource' {..} =
+    Prelude.mconcat
+      ["tagKeys" Data.=: Data.toQueryList "member" tagKeys]
+
+-- | /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/LookoutVision/UpdateDatasetEntries.hs b/gen/Amazonka/LookoutVision/UpdateDatasetEntries.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/UpdateDatasetEntries.hs
@@ -0,0 +1,295 @@
+{-# 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.LookoutVision.UpdateDatasetEntries
+-- Copyright   : (c) 2013-2023 Brendan Hay
+-- License     : Mozilla Public License, v. 2.0.
+-- Maintainer  : Brendan Hay
+-- Stability   : auto-generated
+-- Portability : non-portable (GHC extensions)
+--
+-- Adds or updates one or more JSON Line entries in a dataset. A JSON Line
+-- includes information about an image used for training or testing an
+-- Amazon Lookout for Vision model.
+--
+-- To update an existing JSON Line, use the @source-ref@ field to identify
+-- the JSON Line. The JSON line that you supply replaces the existing JSON
+-- line. Any existing annotations that are not in the new JSON line are
+-- removed from the dataset.
+--
+-- For more information, see /Defining JSON lines for anomaly
+-- classification/ in the Amazon Lookout for Vision Developer Guide.
+--
+-- The images you reference in the @source-ref@ field of a JSON line, must
+-- be in the same S3 bucket as the existing images in the dataset.
+--
+-- Updating a dataset might take a while to complete. To check the current
+-- status, call DescribeDataset and check the @Status@ field in the
+-- response.
+--
+-- This operation requires permissions to perform the
+-- @lookoutvision:UpdateDatasetEntries@ operation.
+module Amazonka.LookoutVision.UpdateDatasetEntries
+  ( -- * Creating a Request
+    UpdateDatasetEntries (..),
+    newUpdateDatasetEntries,
+
+    -- * Request Lenses
+    updateDatasetEntries_clientToken,
+    updateDatasetEntries_projectName,
+    updateDatasetEntries_datasetType,
+    updateDatasetEntries_changes,
+
+    -- * Destructuring the Response
+    UpdateDatasetEntriesResponse (..),
+    newUpdateDatasetEntriesResponse,
+
+    -- * Response Lenses
+    updateDatasetEntriesResponse_status,
+    updateDatasetEntriesResponse_httpStatus,
+  )
+where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Types
+import qualified Amazonka.Prelude as Prelude
+import qualified Amazonka.Request as Request
+import qualified Amazonka.Response as Response
+
+-- | /See:/ 'newUpdateDatasetEntries' smart constructor.
+data UpdateDatasetEntries = UpdateDatasetEntries'
+  { -- | ClientToken is an idempotency token that ensures a call to
+    -- @UpdateDatasetEntries@ completes only once. You choose the value to
+    -- pass. For example, An issue might prevent you from getting a response
+    -- from @UpdateDatasetEntries@. In this case, safely retry your call to
+    -- @UpdateDatasetEntries@ by using the same @ClientToken@ parameter value.
+    --
+    -- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+    -- using inserts a value for you. This prevents retries after a network
+    -- error from making multiple updates with the same dataset entries.
+    -- You\'ll need to provide your own value for other use cases.
+    --
+    -- An error occurs if the other input parameters are not the same as in the
+    -- first request. Using a different value for @ClientToken@ is considered a
+    -- new call to @UpdateDatasetEntries@. An idempotency token is active for 8
+    -- hours.
+    clientToken :: Prelude.Maybe Prelude.Text,
+    -- | The name of the project that contains the dataset that you want to
+    -- update.
+    projectName :: Prelude.Text,
+    -- | The type of the dataset that you want to update. Specify @train@ to
+    -- update the training dataset. Specify @test@ to update the test dataset.
+    -- If you have a single dataset project, specify @train@.
+    datasetType :: Prelude.Text,
+    -- | The entries to add to the dataset.
+    changes :: Data.Base64
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateDatasetEntries' 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:
+--
+-- 'clientToken', 'updateDatasetEntries_clientToken' - ClientToken is an idempotency token that ensures a call to
+-- @UpdateDatasetEntries@ completes only once. You choose the value to
+-- pass. For example, An issue might prevent you from getting a response
+-- from @UpdateDatasetEntries@. In this case, safely retry your call to
+-- @UpdateDatasetEntries@ by using the same @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple updates with the same dataset entries.
+-- You\'ll need to provide your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @UpdateDatasetEntries@. An idempotency token is active for 8
+-- hours.
+--
+-- 'projectName', 'updateDatasetEntries_projectName' - The name of the project that contains the dataset that you want to
+-- update.
+--
+-- 'datasetType', 'updateDatasetEntries_datasetType' - The type of the dataset that you want to update. Specify @train@ to
+-- update the training dataset. Specify @test@ to update the test dataset.
+-- If you have a single dataset project, specify @train@.
+--
+-- 'changes', 'updateDatasetEntries_changes' - The entries to add to the dataset.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+newUpdateDatasetEntries ::
+  -- | 'projectName'
+  Prelude.Text ->
+  -- | 'datasetType'
+  Prelude.Text ->
+  -- | 'changes'
+  Prelude.ByteString ->
+  UpdateDatasetEntries
+newUpdateDatasetEntries
+  pProjectName_
+  pDatasetType_
+  pChanges_ =
+    UpdateDatasetEntries'
+      { clientToken =
+          Prelude.Nothing,
+        projectName = pProjectName_,
+        datasetType = pDatasetType_,
+        changes = Data._Base64 Lens.# pChanges_
+      }
+
+-- | ClientToken is an idempotency token that ensures a call to
+-- @UpdateDatasetEntries@ completes only once. You choose the value to
+-- pass. For example, An issue might prevent you from getting a response
+-- from @UpdateDatasetEntries@. In this case, safely retry your call to
+-- @UpdateDatasetEntries@ by using the same @ClientToken@ parameter value.
+--
+-- If you don\'t supply a value for @ClientToken@, the AWS SDK you are
+-- using inserts a value for you. This prevents retries after a network
+-- error from making multiple updates with the same dataset entries.
+-- You\'ll need to provide your own value for other use cases.
+--
+-- An error occurs if the other input parameters are not the same as in the
+-- first request. Using a different value for @ClientToken@ is considered a
+-- new call to @UpdateDatasetEntries@. An idempotency token is active for 8
+-- hours.
+updateDatasetEntries_clientToken :: Lens.Lens' UpdateDatasetEntries (Prelude.Maybe Prelude.Text)
+updateDatasetEntries_clientToken = Lens.lens (\UpdateDatasetEntries' {clientToken} -> clientToken) (\s@UpdateDatasetEntries' {} a -> s {clientToken = a} :: UpdateDatasetEntries)
+
+-- | The name of the project that contains the dataset that you want to
+-- update.
+updateDatasetEntries_projectName :: Lens.Lens' UpdateDatasetEntries Prelude.Text
+updateDatasetEntries_projectName = Lens.lens (\UpdateDatasetEntries' {projectName} -> projectName) (\s@UpdateDatasetEntries' {} a -> s {projectName = a} :: UpdateDatasetEntries)
+
+-- | The type of the dataset that you want to update. Specify @train@ to
+-- update the training dataset. Specify @test@ to update the test dataset.
+-- If you have a single dataset project, specify @train@.
+updateDatasetEntries_datasetType :: Lens.Lens' UpdateDatasetEntries Prelude.Text
+updateDatasetEntries_datasetType = Lens.lens (\UpdateDatasetEntries' {datasetType} -> datasetType) (\s@UpdateDatasetEntries' {} a -> s {datasetType = a} :: UpdateDatasetEntries)
+
+-- | The entries to add to the dataset.--
+-- -- /Note:/ This 'Lens' automatically encodes and decodes Base64 data.
+-- -- The underlying isomorphism will encode to Base64 representation during
+-- -- serialisation, and decode from Base64 representation during deserialisation.
+-- -- This 'Lens' accepts and returns only raw unencoded data.
+updateDatasetEntries_changes :: Lens.Lens' UpdateDatasetEntries Prelude.ByteString
+updateDatasetEntries_changes = Lens.lens (\UpdateDatasetEntries' {changes} -> changes) (\s@UpdateDatasetEntries' {} a -> s {changes = a} :: UpdateDatasetEntries) Prelude.. Data._Base64
+
+instance Core.AWSRequest UpdateDatasetEntries where
+  type
+    AWSResponse UpdateDatasetEntries =
+      UpdateDatasetEntriesResponse
+  request overrides =
+    Request.patchJSON (overrides defaultService)
+  response =
+    Response.receiveJSON
+      ( \s h x ->
+          UpdateDatasetEntriesResponse'
+            Prelude.<$> (x Data..?> "Status")
+            Prelude.<*> (Prelude.pure (Prelude.fromEnum s))
+      )
+
+instance Prelude.Hashable UpdateDatasetEntries where
+  hashWithSalt _salt UpdateDatasetEntries' {..} =
+    _salt
+      `Prelude.hashWithSalt` clientToken
+      `Prelude.hashWithSalt` projectName
+      `Prelude.hashWithSalt` datasetType
+      `Prelude.hashWithSalt` changes
+
+instance Prelude.NFData UpdateDatasetEntries where
+  rnf UpdateDatasetEntries' {..} =
+    Prelude.rnf clientToken
+      `Prelude.seq` Prelude.rnf projectName
+      `Prelude.seq` Prelude.rnf datasetType
+      `Prelude.seq` Prelude.rnf changes
+
+instance Data.ToHeaders UpdateDatasetEntries where
+  toHeaders UpdateDatasetEntries' {..} =
+    Prelude.mconcat
+      [ "X-Amzn-Client-Token" Data.=# clientToken,
+        "Content-Type"
+          Data.=# ("application/x-amz-json-1.1" :: Prelude.ByteString)
+      ]
+
+instance Data.ToJSON UpdateDatasetEntries where
+  toJSON UpdateDatasetEntries' {..} =
+    Data.object
+      ( Prelude.catMaybes
+          [Prelude.Just ("Changes" Data..= changes)]
+      )
+
+instance Data.ToPath UpdateDatasetEntries where
+  toPath UpdateDatasetEntries' {..} =
+    Prelude.mconcat
+      [ "/2020-11-20/projects/",
+        Data.toBS projectName,
+        "/datasets/",
+        Data.toBS datasetType,
+        "/entries"
+      ]
+
+instance Data.ToQuery UpdateDatasetEntries where
+  toQuery = Prelude.const Prelude.mempty
+
+-- | /See:/ 'newUpdateDatasetEntriesResponse' smart constructor.
+data UpdateDatasetEntriesResponse = UpdateDatasetEntriesResponse'
+  { -- | The status of the dataset update.
+    status :: Prelude.Maybe DatasetStatus,
+    -- | The response's http status code.
+    httpStatus :: Prelude.Int
+  }
+  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)
+
+-- |
+-- Create a value of 'UpdateDatasetEntriesResponse' 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:
+--
+-- 'status', 'updateDatasetEntriesResponse_status' - The status of the dataset update.
+--
+-- 'httpStatus', 'updateDatasetEntriesResponse_httpStatus' - The response's http status code.
+newUpdateDatasetEntriesResponse ::
+  -- | 'httpStatus'
+  Prelude.Int ->
+  UpdateDatasetEntriesResponse
+newUpdateDatasetEntriesResponse pHttpStatus_ =
+  UpdateDatasetEntriesResponse'
+    { status =
+        Prelude.Nothing,
+      httpStatus = pHttpStatus_
+    }
+
+-- | The status of the dataset update.
+updateDatasetEntriesResponse_status :: Lens.Lens' UpdateDatasetEntriesResponse (Prelude.Maybe DatasetStatus)
+updateDatasetEntriesResponse_status = Lens.lens (\UpdateDatasetEntriesResponse' {status} -> status) (\s@UpdateDatasetEntriesResponse' {} a -> s {status = a} :: UpdateDatasetEntriesResponse)
+
+-- | The response's http status code.
+updateDatasetEntriesResponse_httpStatus :: Lens.Lens' UpdateDatasetEntriesResponse Prelude.Int
+updateDatasetEntriesResponse_httpStatus = Lens.lens (\UpdateDatasetEntriesResponse' {httpStatus} -> httpStatus) (\s@UpdateDatasetEntriesResponse' {} a -> s {httpStatus = a} :: UpdateDatasetEntriesResponse)
+
+instance Prelude.NFData UpdateDatasetEntriesResponse where
+  rnf UpdateDatasetEntriesResponse' {..} =
+    Prelude.rnf status
+      `Prelude.seq` Prelude.rnf httpStatus
diff --git a/gen/Amazonka/LookoutVision/Waiters.hs b/gen/Amazonka/LookoutVision/Waiters.hs
new file mode 100644
--- /dev/null
+++ b/gen/Amazonka/LookoutVision/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.LookoutVision.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.LookoutVision.Waiters where
+
+import qualified Amazonka.Core as Core
+import qualified Amazonka.Core.Lens.Internal as Lens
+import qualified Amazonka.Data as Data
+import Amazonka.LookoutVision.Lens
+import Amazonka.LookoutVision.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.LookoutVision
+import Test.Amazonka.LookoutVision.Internal
+import Test.Tasty
+
+main :: IO ()
+main =
+  defaultMain $
+    testGroup
+      "LookoutVision"
+      [ testGroup "tests" tests,
+        testGroup "fixtures" fixtures
+      ]
diff --git a/test/Test/Amazonka/Gen/LookoutVision.hs b/test/Test/Amazonka/Gen/LookoutVision.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/Gen/LookoutVision.hs
@@ -0,0 +1,472 @@
+{-# 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.LookoutVision
+-- 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.LookoutVision where
+
+import Amazonka.LookoutVision
+import qualified Data.Proxy as Proxy
+import Test.Amazonka.Fixture
+import Test.Amazonka.LookoutVision.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"
+--         [ requestCreateDataset $
+--             newCreateDataset
+--
+--         , requestCreateModel $
+--             newCreateModel
+--
+--         , requestCreateProject $
+--             newCreateProject
+--
+--         , requestDeleteDataset $
+--             newDeleteDataset
+--
+--         , requestDeleteModel $
+--             newDeleteModel
+--
+--         , requestDeleteProject $
+--             newDeleteProject
+--
+--         , requestDescribeDataset $
+--             newDescribeDataset
+--
+--         , requestDescribeModel $
+--             newDescribeModel
+--
+--         , requestDescribeModelPackagingJob $
+--             newDescribeModelPackagingJob
+--
+--         , requestDescribeProject $
+--             newDescribeProject
+--
+--         , requestDetectAnomalies $
+--             newDetectAnomalies
+--
+--         , requestListDatasetEntries $
+--             newListDatasetEntries
+--
+--         , requestListModelPackagingJobs $
+--             newListModelPackagingJobs
+--
+--         , requestListModels $
+--             newListModels
+--
+--         , requestListProjects $
+--             newListProjects
+--
+--         , requestListTagsForResource $
+--             newListTagsForResource
+--
+--         , requestStartModel $
+--             newStartModel
+--
+--         , requestStartModelPackagingJob $
+--             newStartModelPackagingJob
+--
+--         , requestStopModel $
+--             newStopModel
+--
+--         , requestTagResource $
+--             newTagResource
+--
+--         , requestUntagResource $
+--             newUntagResource
+--
+--         , requestUpdateDatasetEntries $
+--             newUpdateDatasetEntries
+--
+--           ]
+
+--     , testGroup "response"
+--         [ responseCreateDataset $
+--             newCreateDatasetResponse
+--
+--         , responseCreateModel $
+--             newCreateModelResponse
+--
+--         , responseCreateProject $
+--             newCreateProjectResponse
+--
+--         , responseDeleteDataset $
+--             newDeleteDatasetResponse
+--
+--         , responseDeleteModel $
+--             newDeleteModelResponse
+--
+--         , responseDeleteProject $
+--             newDeleteProjectResponse
+--
+--         , responseDescribeDataset $
+--             newDescribeDatasetResponse
+--
+--         , responseDescribeModel $
+--             newDescribeModelResponse
+--
+--         , responseDescribeModelPackagingJob $
+--             newDescribeModelPackagingJobResponse
+--
+--         , responseDescribeProject $
+--             newDescribeProjectResponse
+--
+--         , responseDetectAnomalies $
+--             newDetectAnomaliesResponse
+--
+--         , responseListDatasetEntries $
+--             newListDatasetEntriesResponse
+--
+--         , responseListModelPackagingJobs $
+--             newListModelPackagingJobsResponse
+--
+--         , responseListModels $
+--             newListModelsResponse
+--
+--         , responseListProjects $
+--             newListProjectsResponse
+--
+--         , responseListTagsForResource $
+--             newListTagsForResourceResponse
+--
+--         , responseStartModel $
+--             newStartModelResponse
+--
+--         , responseStartModelPackagingJob $
+--             newStartModelPackagingJobResponse
+--
+--         , responseStopModel $
+--             newStopModelResponse
+--
+--         , responseTagResource $
+--             newTagResourceResponse
+--
+--         , responseUntagResource $
+--             newUntagResourceResponse
+--
+--         , responseUpdateDatasetEntries $
+--             newUpdateDatasetEntriesResponse
+--
+--           ]
+--     ]
+
+-- Requests
+
+requestCreateDataset :: CreateDataset -> TestTree
+requestCreateDataset =
+  req
+    "CreateDataset"
+    "fixture/CreateDataset.yaml"
+
+requestCreateModel :: CreateModel -> TestTree
+requestCreateModel =
+  req
+    "CreateModel"
+    "fixture/CreateModel.yaml"
+
+requestCreateProject :: CreateProject -> TestTree
+requestCreateProject =
+  req
+    "CreateProject"
+    "fixture/CreateProject.yaml"
+
+requestDeleteDataset :: DeleteDataset -> TestTree
+requestDeleteDataset =
+  req
+    "DeleteDataset"
+    "fixture/DeleteDataset.yaml"
+
+requestDeleteModel :: DeleteModel -> TestTree
+requestDeleteModel =
+  req
+    "DeleteModel"
+    "fixture/DeleteModel.yaml"
+
+requestDeleteProject :: DeleteProject -> TestTree
+requestDeleteProject =
+  req
+    "DeleteProject"
+    "fixture/DeleteProject.yaml"
+
+requestDescribeDataset :: DescribeDataset -> TestTree
+requestDescribeDataset =
+  req
+    "DescribeDataset"
+    "fixture/DescribeDataset.yaml"
+
+requestDescribeModel :: DescribeModel -> TestTree
+requestDescribeModel =
+  req
+    "DescribeModel"
+    "fixture/DescribeModel.yaml"
+
+requestDescribeModelPackagingJob :: DescribeModelPackagingJob -> TestTree
+requestDescribeModelPackagingJob =
+  req
+    "DescribeModelPackagingJob"
+    "fixture/DescribeModelPackagingJob.yaml"
+
+requestDescribeProject :: DescribeProject -> TestTree
+requestDescribeProject =
+  req
+    "DescribeProject"
+    "fixture/DescribeProject.yaml"
+
+requestListDatasetEntries :: ListDatasetEntries -> TestTree
+requestListDatasetEntries =
+  req
+    "ListDatasetEntries"
+    "fixture/ListDatasetEntries.yaml"
+
+requestListModelPackagingJobs :: ListModelPackagingJobs -> TestTree
+requestListModelPackagingJobs =
+  req
+    "ListModelPackagingJobs"
+    "fixture/ListModelPackagingJobs.yaml"
+
+requestListModels :: ListModels -> TestTree
+requestListModels =
+  req
+    "ListModels"
+    "fixture/ListModels.yaml"
+
+requestListProjects :: ListProjects -> TestTree
+requestListProjects =
+  req
+    "ListProjects"
+    "fixture/ListProjects.yaml"
+
+requestListTagsForResource :: ListTagsForResource -> TestTree
+requestListTagsForResource =
+  req
+    "ListTagsForResource"
+    "fixture/ListTagsForResource.yaml"
+
+requestStartModel :: StartModel -> TestTree
+requestStartModel =
+  req
+    "StartModel"
+    "fixture/StartModel.yaml"
+
+requestStartModelPackagingJob :: StartModelPackagingJob -> TestTree
+requestStartModelPackagingJob =
+  req
+    "StartModelPackagingJob"
+    "fixture/StartModelPackagingJob.yaml"
+
+requestStopModel :: StopModel -> TestTree
+requestStopModel =
+  req
+    "StopModel"
+    "fixture/StopModel.yaml"
+
+requestTagResource :: TagResource -> TestTree
+requestTagResource =
+  req
+    "TagResource"
+    "fixture/TagResource.yaml"
+
+requestUntagResource :: UntagResource -> TestTree
+requestUntagResource =
+  req
+    "UntagResource"
+    "fixture/UntagResource.yaml"
+
+requestUpdateDatasetEntries :: UpdateDatasetEntries -> TestTree
+requestUpdateDatasetEntries =
+  req
+    "UpdateDatasetEntries"
+    "fixture/UpdateDatasetEntries.yaml"
+
+-- Responses
+
+responseCreateDataset :: CreateDatasetResponse -> TestTree
+responseCreateDataset =
+  res
+    "CreateDatasetResponse"
+    "fixture/CreateDatasetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateDataset)
+
+responseCreateModel :: CreateModelResponse -> TestTree
+responseCreateModel =
+  res
+    "CreateModelResponse"
+    "fixture/CreateModelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateModel)
+
+responseCreateProject :: CreateProjectResponse -> TestTree
+responseCreateProject =
+  res
+    "CreateProjectResponse"
+    "fixture/CreateProjectResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy CreateProject)
+
+responseDeleteDataset :: DeleteDatasetResponse -> TestTree
+responseDeleteDataset =
+  res
+    "DeleteDatasetResponse"
+    "fixture/DeleteDatasetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteDataset)
+
+responseDeleteModel :: DeleteModelResponse -> TestTree
+responseDeleteModel =
+  res
+    "DeleteModelResponse"
+    "fixture/DeleteModelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteModel)
+
+responseDeleteProject :: DeleteProjectResponse -> TestTree
+responseDeleteProject =
+  res
+    "DeleteProjectResponse"
+    "fixture/DeleteProjectResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DeleteProject)
+
+responseDescribeDataset :: DescribeDatasetResponse -> TestTree
+responseDescribeDataset =
+  res
+    "DescribeDatasetResponse"
+    "fixture/DescribeDatasetResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeDataset)
+
+responseDescribeModel :: DescribeModelResponse -> TestTree
+responseDescribeModel =
+  res
+    "DescribeModelResponse"
+    "fixture/DescribeModelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeModel)
+
+responseDescribeModelPackagingJob :: DescribeModelPackagingJobResponse -> TestTree
+responseDescribeModelPackagingJob =
+  res
+    "DescribeModelPackagingJobResponse"
+    "fixture/DescribeModelPackagingJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeModelPackagingJob)
+
+responseDescribeProject :: DescribeProjectResponse -> TestTree
+responseDescribeProject =
+  res
+    "DescribeProjectResponse"
+    "fixture/DescribeProjectResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DescribeProject)
+
+responseDetectAnomalies :: DetectAnomaliesResponse -> TestTree
+responseDetectAnomalies =
+  res
+    "DetectAnomaliesResponse"
+    "fixture/DetectAnomaliesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy DetectAnomalies)
+
+responseListDatasetEntries :: ListDatasetEntriesResponse -> TestTree
+responseListDatasetEntries =
+  res
+    "ListDatasetEntriesResponse"
+    "fixture/ListDatasetEntriesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListDatasetEntries)
+
+responseListModelPackagingJobs :: ListModelPackagingJobsResponse -> TestTree
+responseListModelPackagingJobs =
+  res
+    "ListModelPackagingJobsResponse"
+    "fixture/ListModelPackagingJobsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListModelPackagingJobs)
+
+responseListModels :: ListModelsResponse -> TestTree
+responseListModels =
+  res
+    "ListModelsResponse"
+    "fixture/ListModelsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListModels)
+
+responseListProjects :: ListProjectsResponse -> TestTree
+responseListProjects =
+  res
+    "ListProjectsResponse"
+    "fixture/ListProjectsResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListProjects)
+
+responseListTagsForResource :: ListTagsForResourceResponse -> TestTree
+responseListTagsForResource =
+  res
+    "ListTagsForResourceResponse"
+    "fixture/ListTagsForResourceResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy ListTagsForResource)
+
+responseStartModel :: StartModelResponse -> TestTree
+responseStartModel =
+  res
+    "StartModelResponse"
+    "fixture/StartModelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartModel)
+
+responseStartModelPackagingJob :: StartModelPackagingJobResponse -> TestTree
+responseStartModelPackagingJob =
+  res
+    "StartModelPackagingJobResponse"
+    "fixture/StartModelPackagingJobResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StartModelPackagingJob)
+
+responseStopModel :: StopModelResponse -> TestTree
+responseStopModel =
+  res
+    "StopModelResponse"
+    "fixture/StopModelResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy StopModel)
+
+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)
+
+responseUpdateDatasetEntries :: UpdateDatasetEntriesResponse -> TestTree
+responseUpdateDatasetEntries =
+  res
+    "UpdateDatasetEntriesResponse"
+    "fixture/UpdateDatasetEntriesResponse.proto"
+    defaultService
+    (Proxy.Proxy :: Proxy.Proxy UpdateDatasetEntries)
diff --git a/test/Test/Amazonka/LookoutVision.hs b/test/Test/Amazonka/LookoutVision.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/LookoutVision.hs
@@ -0,0 +1,20 @@
+-- |
+-- Module      : Test.Amazonka.LookoutVision
+-- 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.LookoutVision
+  ( tests,
+    fixtures,
+  )
+where
+
+import Test.Tasty (TestTree)
+
+tests :: [TestTree]
+tests = []
+
+fixtures :: [TestTree]
+fixtures = []
diff --git a/test/Test/Amazonka/LookoutVision/Internal.hs b/test/Test/Amazonka/LookoutVision/Internal.hs
new file mode 100644
--- /dev/null
+++ b/test/Test/Amazonka/LookoutVision/Internal.hs
@@ -0,0 +1,8 @@
+-- |
+-- Module      : Test.Amazonka.LookoutVision.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.LookoutVision.Internal where
