diff --git a/.release-please-manifest.json b/.release-please-manifest.json
index 65f558e..656a2ef 100644
--- a/.release-please-manifest.json
+++ b/.release-please-manifest.json
@@ -1,3 +1,3 @@
{
- ".": "2.0.0"
+ ".": "2.1.0"
}
\ No newline at end of file
diff --git a/.stats.yml b/.stats.yml
index 96e30e1..265ca1f 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 43
-openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/imagekit-inc%2Fimagekit-c7ad6f552b38f2145781847f8b390fa1ec43068d64e45a33012a97a9299edc10.yml
-openapi_spec_hash: 50f281e91210ad5018ac7e4eee216f56
-config_hash: 74a8263b80c732a2b016177e7d56bb9c
+configured_endpoints: 48
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/imagekit-inc%2Fimagekit-c028a7584d3508f268ce5c5b824b50af88eaa140620dd03a1b35f409f510603c.yml
+openapi_spec_hash: f9b780b2398a87678a13355e48cd515f
+config_hash: aeb6eb949d73382270bbd8bbf2e4cf2a
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 488241b..5d1b11c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,48 @@
# Changelog
+## 2.1.0 (2026-01-16)
+
+Full Changelog: [v2.0.0...v2.1.0](https://github.com/imagekit-developer/imagekit-go/compare/v2.0.0...v2.1.0)
+
+### Features
+
+* **api:** add GetImageAttributesOptions and ResponsiveImageAttributes schemas; update resource references in main.yaml; remove dummy endpoint ([41072da](https://github.com/imagekit-developer/imagekit-go/commit/41072da63cd2ba891a911d932af3bc8b70c90588))
+* **api:** Add saved extensions API and enhance transformation options ([1f7e772](https://github.com/imagekit-developer/imagekit-go/commit/1f7e7723cb74828044a489d0b2de58b195b05183))
+* **api:** fix go sdk breaking changes ([6cbddff](https://github.com/imagekit-developer/imagekit-go/commit/6cbddffab95c89b964fc29ce119ceb70d7ebded5))
+* **encoder:** support bracket encoding form-data object members ([cb3e557](https://github.com/imagekit-developer/imagekit-go/commit/cb3e5572b00fe978ee93d595cc4d8775edccbc89))
+* **tests:** add transformations for radius, color replace, and distort; enhance overlay tests with layer modes ([382b9ed](https://github.com/imagekit-developer/imagekit-go/commit/382b9ed5e05f5fb1810481c0fd5a2299bbf5cfde))
+
+
+### Bug Fixes
+
+* add ai-tasks property to response schemas with enum values ([0551693](https://github.com/imagekit-developer/imagekit-go/commit/0551693b9a7eeb35984c198046e80a6a9debdbf8))
+* **client:** correctly specify Accept header with */* instead of empty ([21a30a4](https://github.com/imagekit-developer/imagekit-go/commit/21a30a4d60b4b2da84d2314ddf6bcf76759da64d))
+* **client:** invalid URL ([aea74b3](https://github.com/imagekit-developer/imagekit-go/commit/aea74b387869ce1fa566bf7a1fda3b2432eff9a9))
+* **client:** properly marshal embedded structs ([e55e614](https://github.com/imagekit-developer/imagekit-go/commit/e55e614fab629dfab68d7249e53ef602dd1a36b3))
+* **docs:** update go get command to include version path in README.md ([d7d4c82](https://github.com/imagekit-developer/imagekit-go/commit/d7d4c829ebccafd1242d79a03651f1189c9f24d0))
+* **mcp:** correct code tool API endpoint ([b32395e](https://github.com/imagekit-developer/imagekit-go/commit/b32395e36a3fdd2f8e37313a303a68135f13400f))
+* rename param to avoid collision ([5067fd4](https://github.com/imagekit-developer/imagekit-go/commit/5067fd4adfe3a7108f3799f270c4211ade385882))
+* skip usage tests that don't work with Prism ([429ad75](https://github.com/imagekit-developer/imagekit-go/commit/429ad75eb8c267b44a9c8e4f2c542344189563e3))
+
+
+### Chores
+
+* add float64 to valid types for RegisterFieldValidator ([2dc3cae](https://github.com/imagekit-developer/imagekit-go/commit/2dc3cae63386dc6b8c7743af3fdb0a9c4ed93ef5))
+* bump gjson version ([87ad44d](https://github.com/imagekit-developer/imagekit-go/commit/87ad44d7016dcb641158e26cc4f0d08e89770dc5))
+* elide duplicate aliases ([2f9eee1](https://github.com/imagekit-developer/imagekit-go/commit/2f9eee11c82bd0b6641dec1f0c20042863ad169f))
+* **internal:** codegen related update ([23edba8](https://github.com/imagekit-developer/imagekit-go/commit/23edba82802b3bc322649f9693ff71134db70b5c))
+* **internal:** codegen related update ([2fdd961](https://github.com/imagekit-developer/imagekit-go/commit/2fdd961c6a458140239af2e88cf1b1ecf7dc27f2))
+* **internal:** codegen related update ([8877b4f](https://github.com/imagekit-developer/imagekit-go/commit/8877b4fbdce39a56785613a1172dda44399c6fe7))
+* **internal:** codegen related update ([d83769d](https://github.com/imagekit-developer/imagekit-go/commit/d83769df0486737f479694acc9421415fb11c523))
+* **internal:** codegen related update ([63165ac](https://github.com/imagekit-developer/imagekit-go/commit/63165ac51ec10df842ed8f9496c82294b4f9e61e))
+* **internal:** grammar fix (it's -> its) ([e35e192](https://github.com/imagekit-developer/imagekit-go/commit/e35e1922f7ad2541ed116db557bcedd8c9c088de))
+* remove MCP Server section from README.md ([58749a4](https://github.com/imagekit-developer/imagekit-go/commit/58749a446146fc365b10ced5db1556eb5dbd1de3))
+
+
+### Documentation
+
+* prominently feature MCP server setup in root SDK readmes ([e2a2d90](https://github.com/imagekit-developer/imagekit-go/commit/e2a2d9047c24a8fd32471aaf96315cad0bd9f935))
+
## 2.0.0 (2025-10-05)
Full Changelog: [v0.0.1...v2.0.0](https://github.com/imagekit-developer/imagekit-go/compare/v0.0.1...v2.0.0)
diff --git a/LICENSE b/LICENSE
index e7a4d16..2027861 100644
--- a/LICENSE
+++ b/LICENSE
@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
- Copyright 2025 Image Kit
+ Copyright 2026 Image Kit
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
diff --git a/README.md b/README.md
index 58286aa..9e5488d 100644
--- a/README.md
+++ b/README.md
@@ -59,7 +59,7 @@ Or to pin the version:
```sh
-go get -u 'github.com/imagekit-developer/imagekit-go@v2.0.0'
+go get -u 'github.com/imagekit-developer/imagekit-go/v2@v2.1.0'
```
@@ -167,7 +167,7 @@ custom := param.Override[imagekit.FooParams](12)
### Request unions
-Unions are represented as a struct with fields prefixed by "Of" for each of it's variants,
+Unions are represented as a struct with fields prefixed by "Of" for each of its variants,
only one field can be non-zero. The non-zero field will be serialized.
Sub-properties of the union can be accessed via methods on the union struct.
diff --git a/accountorigin.go b/accountorigin.go
index 79a8d4a..52888b2 100644
--- a/accountorigin.go
+++ b/accountorigin.go
@@ -74,7 +74,7 @@ func (r *AccountOriginService) List(ctx context.Context, opts ...option.RequestO
// any URL‑endpoints, the API will return an error.
func (r *AccountOriginService) Delete(ctx context.Context, id string, opts ...option.RequestOption) (err error) {
opts = slices.Concat(r.Options, opts)
- opts = append([]option.RequestOption{option.WithHeader("Accept", "")}, opts...)
+ opts = append([]option.RequestOption{option.WithHeader("Accept", "*/*")}, opts...)
if id == "" {
err = errors.New("missing required id parameter")
return
diff --git a/accounturlendpoint.go b/accounturlendpoint.go
index 7991a84..dbd0224 100644
--- a/accounturlendpoint.go
+++ b/accounturlendpoint.go
@@ -75,7 +75,7 @@ func (r *AccountURLEndpointService) List(ctx context.Context, opts ...option.Req
// URL‑endpoint created by ImageKit during account creation.
func (r *AccountURLEndpointService) Delete(ctx context.Context, id string, opts ...option.RequestOption) (err error) {
opts = slices.Concat(r.Options, opts)
- opts = append([]option.RequestOption{option.WithHeader("Accept", "")}, opts...)
+ opts = append([]option.RequestOption{option.WithHeader("Accept", "*/*")}, opts...)
if id == "" {
err = errors.New("missing required id parameter")
return
diff --git a/aliases.go b/aliases.go
index be8fe53..a960812 100644
--- a/aliases.go
+++ b/aliases.go
@@ -19,6 +19,234 @@ type Error = apierror.Error
// This is an alias to an internal type.
type BaseOverlayParam = shared.BaseOverlayParam
+// Controls how the layer blends with the base image or underlying content. Maps to
+// `lm` in the URL. By default, layers completely cover the base image beneath
+// them. Layer modes change this behavior:
+//
+// - `multiply`: Multiplies the pixel values of the layer with the base image. The
+// result is always darker than the original images. This is ideal for applying
+// shadows or color tints.
+// - `displace`: Uses the layer as a displacement map to distort pixels in the base
+// image. The red channel controls horizontal displacement, and the green channel
+// controls vertical displacement. Requires `x` or `y` parameter to control
+// displacement magnitude.
+// - `cutout`: Acts as an inverse mask where opaque areas of the layer turn the
+// base image transparent, while transparent areas leave the base image
+// unchanged. This mode functions like a hole-punch, effectively cutting the
+// shape of the layer out of the underlying image.
+// - `cutter`: Acts as a shape mask where only the parts of the base image that
+// fall inside the opaque area of the layer are preserved. This mode functions
+// like a cookie-cutter, trimming the base image to match the specific dimensions
+// and shape of the layer. See
+// [Layer modes](https://imagekit.io/docs/add-overlays-on-images#layer-modes).
+//
+// This is an alias to an internal type.
+type BaseOverlayLayerMode = shared.BaseOverlayLayerMode
+
+// Equals "multiply"
+const BaseOverlayLayerModeMultiply = shared.BaseOverlayLayerModeMultiply
+
+// Equals "cutter"
+const BaseOverlayLayerModeCutter = shared.BaseOverlayLayerModeCutter
+
+// Equals "cutout"
+const BaseOverlayLayerModeCutout = shared.BaseOverlayLayerModeCutout
+
+// Equals "displace"
+const BaseOverlayLayerModeDisplace = shared.BaseOverlayLayerModeDisplace
+
+// Configuration object for an extension (base extensions only, not saved extension
+// references).
+//
+// This is an alias to an internal type.
+type ExtensionConfigUnion = shared.ExtensionConfigUnion
+
+// This is an alias to an internal type.
+type ExtensionConfigRemoveBg = shared.ExtensionConfigRemoveBg
+
+// This is an alias to an internal type.
+type ExtensionConfigRemoveBgOptions = shared.ExtensionConfigRemoveBgOptions
+
+// This is an alias to an internal type.
+type ExtensionConfigAutoTagging = shared.ExtensionConfigAutoTagging
+
+// This is an alias to an internal type.
+type ExtensionConfigAIAutoDescription = shared.ExtensionConfigAIAutoDescription
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasks = shared.ExtensionConfigAITasks
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskUnion = shared.ExtensionConfigAITasksTaskUnion
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskSelectTags = shared.ExtensionConfigAITasksTaskSelectTags
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskSelectMetadata = shared.ExtensionConfigAITasksTaskSelectMetadata
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion = shared.ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNo = shared.ExtensionConfigAITasksTaskYesNo
+
+// Actions to execute if the AI answers no.
+//
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnNo = shared.ExtensionConfigAITasksTaskYesNoOnNo
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnNoSetMetadata = shared.ExtensionConfigAITasksTaskYesNoOnNoSetMetadata
+
+// Value to set for the custom metadata field. The value type should match the
+// custom metadata field type.
+//
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion = shared.ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion = shared.ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadata = shared.ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadata
+
+// Actions to execute if the AI cannot determine the answer.
+//
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnUnknown = shared.ExtensionConfigAITasksTaskYesNoOnUnknown
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadata = shared.ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadata
+
+// Value to set for the custom metadata field. The value type should match the
+// custom metadata field type.
+//
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion = shared.ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion = shared.ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadata = shared.ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadata
+
+// Actions to execute if the AI answers yes.
+//
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnYes = shared.ExtensionConfigAITasksTaskYesNoOnYes
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnYesSetMetadata = shared.ExtensionConfigAITasksTaskYesNoOnYesSetMetadata
+
+// Value to set for the custom metadata field. The value type should match the
+// custom metadata field type.
+//
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion = shared.ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion = shared.ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadata = shared.ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadata
+
+// Configuration object for an extension (base extensions only, not saved extension
+// references).
+//
+// This is an alias to an internal type.
+type ExtensionConfigUnionParam = shared.ExtensionConfigUnionParam
+
+// This is an alias to an internal type.
+type ExtensionConfigRemoveBgParam = shared.ExtensionConfigRemoveBgParam
+
+// This is an alias to an internal type.
+type ExtensionConfigRemoveBgOptionsParam = shared.ExtensionConfigRemoveBgOptionsParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAutoTaggingParam = shared.ExtensionConfigAutoTaggingParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAIAutoDescriptionParam = shared.ExtensionConfigAIAutoDescriptionParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksParam = shared.ExtensionConfigAITasksParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskUnionParam = shared.ExtensionConfigAITasksTaskUnionParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskSelectTagsParam = shared.ExtensionConfigAITasksTaskSelectTagsParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskSelectMetadataParam = shared.ExtensionConfigAITasksTaskSelectMetadataParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam = shared.ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoParam = shared.ExtensionConfigAITasksTaskYesNoParam
+
+// Actions to execute if the AI answers no.
+//
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnNoParam = shared.ExtensionConfigAITasksTaskYesNoOnNoParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam = shared.ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam
+
+// Value to set for the custom metadata field. The value type should match the
+// custom metadata field type.
+//
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam = shared.ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam = shared.ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam = shared.ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam
+
+// Actions to execute if the AI cannot determine the answer.
+//
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnUnknownParam = shared.ExtensionConfigAITasksTaskYesNoOnUnknownParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam = shared.ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam
+
+// Value to set for the custom metadata field. The value type should match the
+// custom metadata field type.
+//
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam = shared.ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam = shared.ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam = shared.ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam
+
+// Actions to execute if the AI answers yes.
+//
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnYesParam = shared.ExtensionConfigAITasksTaskYesNoOnYesParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam = shared.ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam
+
+// Value to set for the custom metadata field. The value type should match the
+// custom metadata field type.
+//
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam = shared.ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam = shared.ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam
+
+// This is an alias to an internal type.
+type ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam = shared.ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam
+
// Array of extensions to be applied to the asset. Each extension can be configured
// with specific parameters based on the extension type.
//
@@ -40,6 +268,94 @@ type ExtensionAutoTaggingParam = shared.ExtensionAutoTaggingParam
// This is an alias to an internal type.
type ExtensionAIAutoDescriptionParam = shared.ExtensionAIAutoDescriptionParam
+// This is an alias to an internal type.
+type ExtensionAITasksParam = shared.ExtensionAITasksParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskUnionParam = shared.ExtensionAITasksTaskUnionParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskSelectTagsParam = shared.ExtensionAITasksTaskSelectTagsParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskSelectMetadataParam = shared.ExtensionAITasksTaskSelectMetadataParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskSelectMetadataVocabularyUnionParam = shared.ExtensionAITasksTaskSelectMetadataVocabularyUnionParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoParam = shared.ExtensionAITasksTaskYesNoParam
+
+// Actions to execute if the AI answers no.
+//
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnNoParam = shared.ExtensionAITasksTaskYesNoOnNoParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnNoSetMetadataParam = shared.ExtensionAITasksTaskYesNoOnNoSetMetadataParam
+
+// Value to set for the custom metadata field. The value type should match the
+// custom metadata field type.
+//
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam = shared.ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam = shared.ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam = shared.ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam
+
+// Actions to execute if the AI cannot determine the answer.
+//
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnUnknownParam = shared.ExtensionAITasksTaskYesNoOnUnknownParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam = shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam
+
+// Value to set for the custom metadata field. The value type should match the
+// custom metadata field type.
+//
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam = shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam = shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam = shared.ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam
+
+// Actions to execute if the AI answers yes.
+//
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnYesParam = shared.ExtensionAITasksTaskYesNoOnYesParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnYesSetMetadataParam = shared.ExtensionAITasksTaskYesNoOnYesSetMetadataParam
+
+// Value to set for the custom metadata field. The value type should match the
+// custom metadata field type.
+//
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam = shared.ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam = shared.ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam
+
+// This is an alias to an internal type.
+type ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam = shared.ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam
+
+// This is an alias to an internal type.
+type ExtensionSavedExtensionParam = shared.ExtensionSavedExtensionParam
+
+// Options for generating responsive image attributes including `src`, `srcSet`,
+// and `sizes` for HTML `
` elements. This schema extends `SrcOptions` to add
+// support for responsive image generation with breakpoints.
+//
+// This is an alias to an internal type.
+type GetImageAttributesOptionsParam = shared.GetImageAttributesOptionsParam
+
// This is an alias to an internal type.
type ImageOverlayParam = shared.ImageOverlayParam
@@ -133,6 +449,22 @@ type OverlayTimingEndUnionParam = shared.OverlayTimingEndUnionParam
// This is an alias to an internal type.
type OverlayTimingStartUnionParam = shared.OverlayTimingStartUnionParam
+// Resulting set of attributes suitable for an HTML `
` element. Useful for
+// enabling responsive image loading with `srcSet` and `sizes`.
+//
+// This is an alias to an internal type.
+type ResponsiveImageAttributesParam = shared.ResponsiveImageAttributesParam
+
+// Saved extension object containing extension configuration.
+//
+// This is an alias to an internal type.
+type SavedExtension = shared.SavedExtension
+
+// Saved extension object containing extension configuration.
+//
+// This is an alias to an internal type.
+type SavedExtensionParam = shared.SavedExtensionParam
+
// This is an alias to an internal type.
type SolidColorOverlayParam = shared.SolidColorOverlayParam
@@ -157,9 +489,14 @@ type SolidColorOverlayTransformationGradientBoolean = shared.SolidColorOverlayTr
// This is an alias to an internal type.
type SolidColorOverlayTransformationHeightUnionParam = shared.SolidColorOverlayTransformationHeightUnionParam
-// Specifies the corner radius of the solid color overlay. Set to `max` for
-// circular or oval shape. See
-// [radius](https://imagekit.io/docs/effects-and-enhancements#radius---r).
+// Specifies the corner radius of the solid color overlay.
+//
+// - Single value (positive integer): Applied to all corners (e.g., `20`).
+// - `max`: Creates a circular or oval shape.
+// - Per-corner array: Provide four underscore-separated values representing
+// top-left, top-right, bottom-right, and bottom-left corners respectively (e.g.,
+// `10_20_30_40`). See
+// [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r).
//
// This is an alias to an internal type.
type SolidColorOverlayTransformationRadiusUnionParam = shared.SolidColorOverlayTransformationRadiusUnionParam
@@ -237,7 +574,9 @@ type TextOverlayParam = shared.TextOverlayParam
// This is an alias to an internal type.
type TextOverlayTransformationParam = shared.TextOverlayTransformationParam
-// Flip the text overlay horizontally, vertically, or both.
+// Flip/mirror the text horizontally, vertically, or in both directions. Acceptable
+// values: `h` (horizontal), `v` (vertical), `h_v` (horizontal and vertical), or
+// `v_h`.
//
// This is an alias to an internal type.
type TextOverlayTransformationFlip = shared.TextOverlayTransformationFlip
@@ -275,10 +614,9 @@ const TextOverlayTransformationInnerAlignmentRight = shared.TextOverlayTransform
// Equals "center"
const TextOverlayTransformationInnerAlignmentCenter = shared.TextOverlayTransformationInnerAlignmentCenter
-// Specifies the line height of the text overlay. Accepts integer values
-// representing line height in points. It can also accept
-// [arithmetic expressions](https://imagekit.io/docs/arithmetic-expressions-in-transformations)
-// such as `bw_mul_0.2`, or `bh_div_20`.
+// Specifies the line height for multi-line text overlays. It will come into effect
+// only if the text wraps over multiple lines. Accepts either an integer value or
+// an arithmetic expression.
//
// This is an alias to an internal type.
type TextOverlayTransformationLineHeightUnionParam = shared.TextOverlayTransformationLineHeightUnionParam
@@ -290,8 +628,14 @@ type TextOverlayTransformationLineHeightUnionParam = shared.TextOverlayTransform
// This is an alias to an internal type.
type TextOverlayTransformationPaddingUnionParam = shared.TextOverlayTransformationPaddingUnionParam
-// Specifies the corner radius of the text overlay. Set to `max` to achieve a
-// circular or oval shape.
+// Specifies the corner radius:
+//
+// - Single value (positive integer): Applied to all corners (e.g., `20`).
+// - `max`: Creates a circular or oval shape.
+// - Per-corner array: Provide four underscore-separated values representing
+// top-left, top-right, bottom-right, and bottom-left corners respectively (e.g.,
+// `10_20_30_40`). See
+// [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r).
//
// This is an alias to an internal type.
type TextOverlayTransformationRadiusUnionParam = shared.TextOverlayTransformationRadiusUnionParam
@@ -499,9 +843,14 @@ type TransformationHeightUnionParam = shared.TransformationHeightUnionParam
// This is an alias to an internal type.
type TransformationPageUnionParam = shared.TransformationPageUnionParam
-// Specifies the corner radius for rounded corners (e.g., 20) or `max` for circular
-// or oval shape. See
-// [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r).
+// Specifies the corner radius for rounded corners.
+//
+// - Single value (positive integer): Applied to all corners (e.g., `20`).
+// - `max`: Creates a circular or oval shape.
+// - Per-corner array: Provide four underscore-separated values representing
+// top-left, top-right, bottom-right, and bottom-left corners respectively (e.g.,
+// `10_20_30_40`). See
+// [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r).
//
// This is an alias to an internal type.
type TransformationRadiusUnionParam = shared.TransformationRadiusUnionParam
diff --git a/api.md b/api.md
index d1fe4eb..9291394 100644
--- a/api.md
+++ b/api.md
@@ -1,11 +1,15 @@
# Shared Params Types
- shared.BaseOverlayParam
+- shared.ExtensionConfigUnionParam
- shared.ExtensionsParam
+- shared.GetImageAttributesOptionsParam
- shared.ImageOverlayParam
- shared.OverlayUnionParam
- shared.OverlayPositionParam
- shared.OverlayTimingParam
+- shared.ResponsiveImageAttributesParam
+- shared.SavedExtensionParam
- shared.SolidColorOverlayParam
- shared.SolidColorOverlayTransformationParam
- shared.SrcOptionsParam
@@ -18,6 +22,12 @@
- shared.TransformationPosition
- shared.VideoOverlayParam
+# Shared Response Types
+
+- shared.ExtensionConfigUnion
+- shared.SavedExtension
+
+
# CustomMetadataFields
Response Types:
@@ -93,7 +103,17 @@ Methods:
Methods:
- client.Files.Metadata.Get(ctx context.Context, fileID string) (imagekit.Metadata, error)
-- client.Files.Metadata.GetFromURL(ctx context.Context, query imagekit.FileMetadataGetFromURLParams) (imagekit.Metadata, error)
+- client.Files.Metadata.GetFromURL(ctx context.Context, query imagekit.FileMetadataGetFromURLParams) (imagekit.Metadata, error)
+
+# SavedExtensions
+
+Methods:
+
+- client.SavedExtensions.New(ctx context.Context, body imagekit.SavedExtensionNewParams) (shared.SavedExtension, error)
+- client.SavedExtensions.Update(ctx context.Context, id string, body imagekit.SavedExtensionUpdateParams) (shared.SavedExtension, error)
+- client.SavedExtensions.List(ctx context.Context) ([]shared.SavedExtension, error)
+- client.SavedExtensions.Delete(ctx context.Context, id string) error
+- client.SavedExtensions.Get(ctx context.Context, id string) (shared.SavedExtension, error)
# Assets
diff --git a/betav2file.go b/betav2file.go
index c5e327a..5417572 100644
--- a/betav2file.go
+++ b/betav2file.go
@@ -238,6 +238,8 @@ type BetaV2FileUploadResponseExtensionStatus struct {
// Any of "success", "pending", "failed".
AIAutoDescription string `json:"ai-auto-description"`
// Any of "success", "pending", "failed".
+ AITasks string `json:"ai-tasks"`
+ // Any of "success", "pending", "failed".
AwsAutoTagging string `json:"aws-auto-tagging"`
// Any of "success", "pending", "failed".
GoogleAutoTagging string `json:"google-auto-tagging"`
@@ -246,6 +248,7 @@ type BetaV2FileUploadResponseExtensionStatus struct {
// JSON contains metadata for fields, check presence with [respjson.Field.Valid].
JSON struct {
AIAutoDescription respjson.Field
+ AITasks respjson.Field
AwsAutoTagging respjson.Field
GoogleAutoTagging respjson.Field
RemoveBg respjson.Field
diff --git a/betav2file_test.go b/betav2file_test.go
index 3303619..c918e12 100644
--- a/betav2file_test.go
+++ b/betav2file_test.go
@@ -58,6 +58,64 @@ func TestBetaV2FileUploadWithOptionalParams(t *testing.T) {
},
}, shared.ExtensionUnionParam{
OfAIAutoDescription: &shared.ExtensionAIAutoDescriptionParam{},
+ }, shared.ExtensionUnionParam{
+ OfAITasks: &shared.ExtensionAITasksParam{
+ Tasks: []shared.ExtensionAITasksTaskUnionParam{{
+ OfSelectTags: &shared.ExtensionAITasksTaskSelectTagsParam{
+ Instruction: "What types of clothing items are visible in this image?",
+ Vocabulary: []string{"shirt", "tshirt", "dress", "trousers", "jacket"},
+ MaxSelections: imagekit.Int(1),
+ MinSelections: imagekit.Int(0),
+ },
+ }, {
+ OfYesNo: &shared.ExtensionAITasksTaskYesNoParam{
+ Instruction: "Is this a luxury or high-end fashion item?",
+ OnNo: shared.ExtensionAITasksTaskYesNoOnNoParam{
+ AddTags: []string{"luxury", "premium"},
+ RemoveTags: []string{"budget", "affordable"},
+ SetMetadata: []shared.ExtensionAITasksTaskYesNoOnNoSetMetadataParam{{
+ Field: "price_range",
+ Value: shared.ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam{
+ OfString: imagekit.String("premium"),
+ },
+ }},
+ UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam{{
+ Field: "price_range",
+ }},
+ },
+ OnUnknown: shared.ExtensionAITasksTaskYesNoOnUnknownParam{
+ AddTags: []string{"luxury", "premium"},
+ RemoveTags: []string{"budget", "affordable"},
+ SetMetadata: []shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam{{
+ Field: "price_range",
+ Value: shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam{
+ OfString: imagekit.String("premium"),
+ },
+ }},
+ UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam{{
+ Field: "price_range",
+ }},
+ },
+ OnYes: shared.ExtensionAITasksTaskYesNoOnYesParam{
+ AddTags: []string{"luxury", "premium"},
+ RemoveTags: []string{"budget", "affordable"},
+ SetMetadata: []shared.ExtensionAITasksTaskYesNoOnYesSetMetadataParam{{
+ Field: "price_range",
+ Value: shared.ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam{
+ OfString: imagekit.String("premium"),
+ },
+ }},
+ UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam{{
+ Field: "price_range",
+ }},
+ },
+ },
+ }},
+ },
+ }, shared.ExtensionUnionParam{
+ OfSavedExtension: &shared.ExtensionSavedExtensionParam{
+ ID: "ext_abc123",
+ },
}},
Folder: imagekit.String("folder"),
IsPrivateFile: imagekit.Bool(true),
diff --git a/client.go b/client.go
index f53998f..9d76257 100644
--- a/client.go
+++ b/client.go
@@ -21,6 +21,7 @@ type Client struct {
Dummy DummyService
CustomMetadataFields CustomMetadataFieldService
Files FileService
+ SavedExtensions SavedExtensionService
Assets AssetService
Cache CacheService
Folders FolderService
@@ -64,6 +65,7 @@ func NewClient(opts ...option.RequestOption) (r Client) {
r.Dummy = NewDummyService(opts...)
r.CustomMetadataFields = NewCustomMetadataFieldService(opts...)
r.Files = NewFileService(opts...)
+ r.SavedExtensions = NewSavedExtensionService(opts...)
r.Assets = NewAssetService(opts...)
r.Cache = NewCacheService(opts...)
r.Folders = NewFolderService(opts...)
diff --git a/dummy.go b/dummy.go
index 9f26efb..5af366d 100644
--- a/dummy.go
+++ b/dummy.go
@@ -38,7 +38,7 @@ func NewDummyService(opts ...option.RequestOption) (r DummyService) {
// and is not intended for public consumption.
func (r *DummyService) New(ctx context.Context, body DummyNewParams, opts ...option.RequestOption) (err error) {
opts = slices.Concat(r.Options, opts)
- opts = append([]option.RequestOption{option.WithHeader("Accept", "")}, opts...)
+ opts = append([]option.RequestOption{option.WithHeader("Accept", "*/*")}, opts...)
path := "v1/dummy/test"
err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, body, nil, opts...)
return
@@ -46,17 +46,29 @@ func (r *DummyService) New(ctx context.Context, body DummyNewParams, opts ...opt
type DummyNewParams struct {
BaseOverlay shared.BaseOverlayParam `json:"baseOverlay,omitzero"`
+ // Configuration object for an extension (base extensions only, not saved extension
+ // references).
+ ExtensionConfig shared.ExtensionConfigUnionParam `json:"extensionConfig,omitzero"`
// Array of extensions to be applied to the asset. Each extension can be configured
// with specific parameters based on the extension type.
- Extensions shared.ExtensionsParam `json:"extensions,omitzero"`
- ImageOverlay shared.ImageOverlayParam `json:"imageOverlay,omitzero"`
+ Extensions shared.ExtensionsParam `json:"extensions,omitzero"`
+ // Options for generating responsive image attributes including `src`, `srcSet`,
+ // and `sizes` for HTML `
` elements. This schema extends `SrcOptions` to add
+ // support for responsive image generation with breakpoints.
+ GetImageAttributesOptions shared.GetImageAttributesOptionsParam `json:"getImageAttributesOptions,omitzero"`
+ ImageOverlay shared.ImageOverlayParam `json:"imageOverlay,omitzero"`
// Specifies an overlay to be applied on the parent image or video. ImageKit
// supports overlays including images, text, videos, subtitles, and solid colors.
// See
// [Overlay using layers](https://imagekit.io/docs/transformations#overlay-using-layers).
- Overlay shared.OverlayUnionParam `json:"overlay,omitzero"`
- OverlayPosition shared.OverlayPositionParam `json:"overlayPosition,omitzero"`
- OverlayTiming shared.OverlayTimingParam `json:"overlayTiming,omitzero"`
+ Overlay shared.OverlayUnionParam `json:"overlay,omitzero"`
+ OverlayPosition shared.OverlayPositionParam `json:"overlayPosition,omitzero"`
+ OverlayTiming shared.OverlayTimingParam `json:"overlayTiming,omitzero"`
+ // Resulting set of attributes suitable for an HTML `
` element. Useful for
+ // enabling responsive image loading with `srcSet` and `sizes`.
+ ResponsiveImageAttributes shared.ResponsiveImageAttributesParam `json:"responsiveImageAttributes,omitzero"`
+ // Saved extension object containing extension configuration.
+ SavedExtensions shared.SavedExtensionParam `json:"savedExtensions,omitzero"`
SolidColorOverlay shared.SolidColorOverlayParam `json:"solidColorOverlay,omitzero"`
SolidColorOverlayTransformation shared.SolidColorOverlayTransformationParam `json:"solidColorOverlayTransformation,omitzero"`
// Options for generating ImageKit URLs with transformations. See the
diff --git a/dummy_test.go b/dummy_test.go
index 0548e6a..1d32061 100644
--- a/dummy_test.go
+++ b/dummy_test.go
@@ -7,6 +7,7 @@ import (
"errors"
"os"
"testing"
+ "time"
"github.com/imagekit-developer/imagekit-go/v2"
"github.com/imagekit-developer/imagekit-go/v2/internal/testutil"
@@ -30,6 +31,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
)
err := client.Dummy.New(context.TODO(), imagekit.DummyNewParams{
BaseOverlay: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeMultiply,
Position: shared.OverlayPositionParam{
Focus: shared.OverlayPositionFocusCenter,
X: shared.OverlayPositionXUnionParam{
@@ -51,6 +53,16 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
},
},
},
+ ExtensionConfig: shared.ExtensionConfigUnionParam{
+ OfRemoveBg: &shared.ExtensionConfigRemoveBgParam{
+ Options: shared.ExtensionConfigRemoveBgOptionsParam{
+ AddShadow: imagekit.Bool(true),
+ BgColor: imagekit.String("bg_color"),
+ BgImageURL: imagekit.String("bg_image_url"),
+ Semitransparency: imagekit.Bool(true),
+ },
+ },
+ },
Extensions: shared.ExtensionsParam{shared.ExtensionUnionParam{
OfRemoveBg: &shared.ExtensionRemoveBgParam{
Options: shared.ExtensionRemoveBgOptionsParam{
@@ -68,9 +80,233 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
},
}, shared.ExtensionUnionParam{
OfAIAutoDescription: &shared.ExtensionAIAutoDescriptionParam{},
+ }, shared.ExtensionUnionParam{
+ OfAITasks: &shared.ExtensionAITasksParam{
+ Tasks: []shared.ExtensionAITasksTaskUnionParam{{
+ OfSelectTags: &shared.ExtensionAITasksTaskSelectTagsParam{
+ Instruction: "What types of clothing items are visible in this image?",
+ Vocabulary: []string{"shirt", "tshirt", "dress", "trousers", "jacket"},
+ MaxSelections: imagekit.Int(1),
+ MinSelections: imagekit.Int(0),
+ },
+ }, {
+ OfYesNo: &shared.ExtensionAITasksTaskYesNoParam{
+ Instruction: "Is this a luxury or high-end fashion item?",
+ OnNo: shared.ExtensionAITasksTaskYesNoOnNoParam{
+ AddTags: []string{"luxury", "premium"},
+ RemoveTags: []string{"budget", "affordable"},
+ SetMetadata: []shared.ExtensionAITasksTaskYesNoOnNoSetMetadataParam{{
+ Field: "price_range",
+ Value: shared.ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam{
+ OfString: imagekit.String("premium"),
+ },
+ }},
+ UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam{{
+ Field: "price_range",
+ }},
+ },
+ OnUnknown: shared.ExtensionAITasksTaskYesNoOnUnknownParam{
+ AddTags: []string{"luxury", "premium"},
+ RemoveTags: []string{"budget", "affordable"},
+ SetMetadata: []shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam{{
+ Field: "price_range",
+ Value: shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam{
+ OfString: imagekit.String("premium"),
+ },
+ }},
+ UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam{{
+ Field: "price_range",
+ }},
+ },
+ OnYes: shared.ExtensionAITasksTaskYesNoOnYesParam{
+ AddTags: []string{"luxury", "premium"},
+ RemoveTags: []string{"budget", "affordable"},
+ SetMetadata: []shared.ExtensionAITasksTaskYesNoOnYesSetMetadataParam{{
+ Field: "price_range",
+ Value: shared.ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam{
+ OfString: imagekit.String("premium"),
+ },
+ }},
+ UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam{{
+ Field: "price_range",
+ }},
+ },
+ },
+ }},
+ },
+ }, shared.ExtensionUnionParam{
+ OfSavedExtension: &shared.ExtensionSavedExtensionParam{
+ ID: "ext_abc123",
+ },
}},
+ GetImageAttributesOptions: shared.GetImageAttributesOptionsParam{
+ SrcOptionsParam: shared.SrcOptionsParam{
+ Src: "/my-image.jpg",
+ URLEndpoint: "https://ik.imagekit.io/demo",
+ ExpiresIn: imagekit.Float(0),
+ QueryParameters: map[string]string{
+ "foo": "string",
+ },
+ Signed: imagekit.Bool(true),
+ Transformation: []shared.TransformationParam{{
+ AIChangeBackground: imagekit.String("aiChangeBackground"),
+ AIDropShadow: shared.TransformationAIDropShadowUnionParam{
+ OfTransformationAIDropShadowBoolean: imagekit.Bool(true),
+ },
+ AIEdit: imagekit.String("aiEdit"),
+ AIRemoveBackground: true,
+ AIRemoveBackgroundExternal: true,
+ AIRetouch: true,
+ AIUpscale: true,
+ AIVariation: true,
+ AspectRatio: shared.TransformationAspectRatioUnionParam{
+ OfString: imagekit.String("4:3"),
+ },
+ AudioCodec: shared.TransformationAudioCodecAac,
+ Background: imagekit.String("red"),
+ Blur: imagekit.Float(10),
+ Border: imagekit.String("5_FF0000"),
+ ColorProfile: imagekit.Bool(true),
+ ColorReplace: imagekit.String("colorReplace"),
+ ContrastStretch: true,
+ Crop: shared.TransformationCropForce,
+ CropMode: shared.TransformationCropModePadResize,
+ DefaultImage: imagekit.String("defaultImage"),
+ Distort: imagekit.String("distort"),
+ Dpr: imagekit.Float(2),
+ Duration: shared.TransformationDurationUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ EndOffset: shared.TransformationEndOffsetUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ Flip: shared.TransformationFlipH,
+ Focus: imagekit.String("center"),
+ Format: shared.TransformationFormatAuto,
+ Gradient: shared.TransformationGradientUnionParam{
+ OfTransformationGradientBoolean: imagekit.Bool(true),
+ },
+ Grayscale: true,
+ Height: shared.TransformationHeightUnionParam{
+ OfFloat: imagekit.Float(200),
+ },
+ Lossless: imagekit.Bool(true),
+ Metadata: imagekit.Bool(true),
+ Named: imagekit.String("named"),
+ Opacity: imagekit.Float(0),
+ Original: imagekit.Bool(true),
+ Overlay: shared.OverlayUnionParam{
+ OfText: &shared.TextOverlayParam{
+ BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeMultiply,
+ Position: shared.OverlayPositionParam{
+ Focus: shared.OverlayPositionFocusCenter,
+ X: shared.OverlayPositionXUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ Y: shared.OverlayPositionYUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ },
+ Timing: shared.OverlayTimingParam{
+ Duration: shared.OverlayTimingDurationUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ End: shared.OverlayTimingEndUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ Start: shared.OverlayTimingStartUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ },
+ },
+ Text: "text",
+ Encoding: "auto",
+ Transformation: []shared.TextOverlayTransformationParam{{
+ Alpha: imagekit.Float(1),
+ Background: imagekit.String("background"),
+ Flip: shared.TextOverlayTransformationFlipH,
+ FontColor: imagekit.String("fontColor"),
+ FontFamily: imagekit.String("fontFamily"),
+ FontSize: shared.TextOverlayTransformationFontSizeUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ InnerAlignment: shared.TextOverlayTransformationInnerAlignmentLeft,
+ LineHeight: shared.TextOverlayTransformationLineHeightUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ Padding: shared.TextOverlayTransformationPaddingUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ Radius: shared.TextOverlayTransformationRadiusUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ Rotation: shared.TextOverlayTransformationRotationUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ Typography: imagekit.String("typography"),
+ Width: shared.TextOverlayTransformationWidthUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ }},
+ },
+ },
+ Page: shared.TransformationPageUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ Progressive: imagekit.Bool(true),
+ Quality: imagekit.Float(80),
+ Radius: shared.TransformationRadiusUnionParam{
+ OfFloat: imagekit.Float(20),
+ },
+ Raw: imagekit.String("raw"),
+ Rotation: shared.TransformationRotationUnionParam{
+ OfFloat: imagekit.Float(90),
+ },
+ Shadow: shared.TransformationShadowUnionParam{
+ OfTransformationShadowBoolean: imagekit.Bool(true),
+ },
+ Sharpen: shared.TransformationSharpenUnionParam{
+ OfTransformationSharpenBoolean: imagekit.Bool(true),
+ },
+ StartOffset: shared.TransformationStartOffsetUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ StreamingResolutions: []shared.StreamingResolution{shared.StreamingResolution240},
+ Trim: shared.TransformationTrimUnionParam{
+ OfTransformationTrimBoolean: imagekit.Bool(true),
+ },
+ UnsharpMask: shared.TransformationUnsharpMaskUnionParam{
+ OfTransformationUnsharpMaskBoolean: imagekit.Bool(true),
+ },
+ VideoCodec: shared.TransformationVideoCodecH264,
+ Width: shared.TransformationWidthUnionParam{
+ OfFloat: imagekit.Float(300),
+ },
+ X: shared.TransformationXUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ XCenter: shared.TransformationXCenterUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ Y: shared.TransformationYUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ YCenter: shared.TransformationYCenterUnionParam{
+ OfFloat: imagekit.Float(0),
+ },
+ Zoom: imagekit.Float(0),
+ }},
+ TransformationPosition: shared.TransformationPositionPath,
+ },
+ DeviceBreakpoints: []float64{640, 750, 828, 1080, 1200, 1920, 2048, 3840},
+ ImageBreakpoints: []float64{16, 32, 48, 64, 96, 128, 256, 384},
+ Sizes: imagekit.String("(min-width: 768px) 50vw, 100vw"),
+ Width: imagekit.Float(400),
+ },
ImageOverlay: shared.ImageOverlayParam{
BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeMultiply,
Position: shared.OverlayPositionParam{
Focus: shared.OverlayPositionFocusCenter,
X: shared.OverlayPositionXUnionParam{
@@ -113,10 +349,12 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
Blur: imagekit.Float(10),
Border: imagekit.String("5_FF0000"),
ColorProfile: imagekit.Bool(true),
+ ColorReplace: imagekit.String("colorReplace"),
ContrastStretch: true,
Crop: shared.TransformationCropForce,
CropMode: shared.TransformationCropModePadResize,
DefaultImage: imagekit.String("defaultImage"),
+ Distort: imagekit.String("distort"),
Dpr: imagekit.Float(2),
Duration: shared.TransformationDurationUnionParam{
OfFloat: imagekit.Float(0),
@@ -142,6 +380,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
Overlay: shared.OverlayUnionParam{
OfText: &shared.TextOverlayParam{
BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeMultiply,
Position: shared.OverlayPositionParam{
Focus: shared.OverlayPositionFocusCenter,
X: shared.OverlayPositionXUnionParam{
@@ -244,6 +483,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
Overlay: shared.OverlayUnionParam{
OfText: &shared.TextOverlayParam{
BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeMultiply,
Position: shared.OverlayPositionParam{
Focus: shared.OverlayPositionFocusCenter,
X: shared.OverlayPositionXUnionParam{
@@ -316,8 +556,32 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
OfFloat: imagekit.Float(0),
},
},
+ ResponsiveImageAttributes: shared.ResponsiveImageAttributesParam{
+ Src: "https://ik.imagekit.io/demo/image.jpg?tr=w-3840",
+ Sizes: imagekit.String("100vw"),
+ SrcSet: imagekit.String("https://ik.imagekit.io/demo/image.jpg?tr=w-640 640w, https://ik.imagekit.io/demo/image.jpg?tr=w-1080 1080w, https://ik.imagekit.io/demo/image.jpg?tr=w-1920 1920w"),
+ Width: imagekit.Float(400),
+ },
+ SavedExtensions: shared.SavedExtensionParam{
+ ID: imagekit.String("ext_abc123"),
+ Config: shared.ExtensionConfigUnionParam{
+ OfRemoveBg: &shared.ExtensionConfigRemoveBgParam{
+ Options: shared.ExtensionConfigRemoveBgOptionsParam{
+ AddShadow: imagekit.Bool(true),
+ BgColor: imagekit.String("bg_color"),
+ BgImageURL: imagekit.String("bg_image_url"),
+ Semitransparency: imagekit.Bool(true),
+ },
+ },
+ },
+ CreatedAt: imagekit.Time(time.Now()),
+ Description: imagekit.String("Analyzes vehicle images for type, condition, and quality assessment"),
+ Name: imagekit.String("Car Quality Analysis"),
+ UpdatedAt: imagekit.Time(time.Now()),
+ },
SolidColorOverlay: shared.SolidColorOverlayParam{
BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeMultiply,
Position: shared.OverlayPositionParam{
Focus: shared.OverlayPositionFocusCenter,
X: shared.OverlayPositionXUnionParam{
@@ -400,10 +664,12 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
Blur: imagekit.Float(10),
Border: imagekit.String("5_FF0000"),
ColorProfile: imagekit.Bool(true),
+ ColorReplace: imagekit.String("colorReplace"),
ContrastStretch: true,
Crop: shared.TransformationCropForce,
CropMode: shared.TransformationCropModePadResize,
DefaultImage: imagekit.String("defaultImage"),
+ Distort: imagekit.String("distort"),
Dpr: imagekit.Float(2),
Duration: shared.TransformationDurationUnionParam{
OfFloat: imagekit.Float(0),
@@ -429,6 +695,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
Overlay: shared.OverlayUnionParam{
OfText: &shared.TextOverlayParam{
BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeMultiply,
Position: shared.OverlayPositionParam{
Focus: shared.OverlayPositionFocusCenter,
X: shared.OverlayPositionXUnionParam{
@@ -532,6 +799,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
StreamingResolution: shared.StreamingResolution240,
SubtitleOverlay: shared.SubtitleOverlayParam{
BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeMultiply,
Position: shared.OverlayPositionParam{
Focus: shared.OverlayPositionFocusCenter,
X: shared.OverlayPositionXUnionParam{
@@ -576,6 +844,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
},
TextOverlay: shared.TextOverlayParam{
BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeMultiply,
Position: shared.OverlayPositionParam{
Focus: shared.OverlayPositionFocusCenter,
X: shared.OverlayPositionXUnionParam{
@@ -673,10 +942,12 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
Blur: imagekit.Float(10),
Border: imagekit.String("5_FF0000"),
ColorProfile: imagekit.Bool(true),
+ ColorReplace: imagekit.String("colorReplace"),
ContrastStretch: true,
Crop: shared.TransformationCropForce,
CropMode: shared.TransformationCropModePadResize,
DefaultImage: imagekit.String("defaultImage"),
+ Distort: imagekit.String("distort"),
Dpr: imagekit.Float(2),
Duration: shared.TransformationDurationUnionParam{
OfFloat: imagekit.Float(0),
@@ -702,6 +973,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
Overlay: shared.OverlayUnionParam{
OfText: &shared.TextOverlayParam{
BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeMultiply,
Position: shared.OverlayPositionParam{
Focus: shared.OverlayPositionFocusCenter,
X: shared.OverlayPositionXUnionParam{
@@ -803,6 +1075,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
TransformationPosition: shared.TransformationPositionPath,
VideoOverlay: shared.VideoOverlayParam{
BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeMultiply,
Position: shared.OverlayPositionParam{
Focus: shared.OverlayPositionFocusCenter,
X: shared.OverlayPositionXUnionParam{
@@ -845,10 +1118,12 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
Blur: imagekit.Float(10),
Border: imagekit.String("5_FF0000"),
ColorProfile: imagekit.Bool(true),
+ ColorReplace: imagekit.String("colorReplace"),
ContrastStretch: true,
Crop: shared.TransformationCropForce,
CropMode: shared.TransformationCropModePadResize,
DefaultImage: imagekit.String("defaultImage"),
+ Distort: imagekit.String("distort"),
Dpr: imagekit.Float(2),
Duration: shared.TransformationDurationUnionParam{
OfFloat: imagekit.Float(0),
@@ -874,6 +1149,7 @@ func TestDummyNewWithOptionalParams(t *testing.T) {
Overlay: shared.OverlayUnionParam{
OfText: &shared.TextOverlayParam{
BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeMultiply,
Position: shared.OverlayPositionParam{
Focus: shared.OverlayPositionFocusCenter,
X: shared.OverlayPositionXUnionParam{
diff --git a/file.go b/file.go
index 95a44c3..afa48a9 100644
--- a/file.go
+++ b/file.go
@@ -72,7 +72,7 @@ func (r *FileService) Update(ctx context.Context, fileID string, body FileUpdate
// the cache using purge cache API.
func (r *FileService) Delete(ctx context.Context, fileID string, opts ...option.RequestOption) (err error) {
opts = slices.Concat(r.Options, opts)
- opts = append([]option.RequestOption{option.WithHeader("Accept", "")}, opts...)
+ opts = append([]option.RequestOption{option.WithHeader("Accept", "*/*")}, opts...)
if fileID == "" {
err = errors.New("missing required fileId parameter")
return
@@ -1035,6 +1035,8 @@ type FileUpdateResponseExtensionStatus struct {
// Any of "success", "pending", "failed".
AIAutoDescription string `json:"ai-auto-description"`
// Any of "success", "pending", "failed".
+ AITasks string `json:"ai-tasks"`
+ // Any of "success", "pending", "failed".
AwsAutoTagging string `json:"aws-auto-tagging"`
// Any of "success", "pending", "failed".
GoogleAutoTagging string `json:"google-auto-tagging"`
@@ -1043,6 +1045,7 @@ type FileUpdateResponseExtensionStatus struct {
// JSON contains metadata for fields, check presence with [respjson.Field.Valid].
JSON struct {
AIAutoDescription respjson.Field
+ AITasks respjson.Field
AwsAutoTagging respjson.Field
GoogleAutoTagging respjson.Field
RemoveBg respjson.Field
@@ -1264,6 +1267,8 @@ type FileUploadResponseExtensionStatus struct {
// Any of "success", "pending", "failed".
AIAutoDescription string `json:"ai-auto-description"`
// Any of "success", "pending", "failed".
+ AITasks string `json:"ai-tasks"`
+ // Any of "success", "pending", "failed".
AwsAutoTagging string `json:"aws-auto-tagging"`
// Any of "success", "pending", "failed".
GoogleAutoTagging string `json:"google-auto-tagging"`
@@ -1272,6 +1277,7 @@ type FileUploadResponseExtensionStatus struct {
// JSON contains metadata for fields, check presence with [respjson.Field.Valid].
JSON struct {
AIAutoDescription respjson.Field
+ AITasks respjson.Field
AwsAutoTagging respjson.Field
GoogleAutoTagging respjson.Field
RemoveBg respjson.Field
diff --git a/file_test.go b/file_test.go
index 9a8f3a3..d0dacc4 100644
--- a/file_test.go
+++ b/file_test.go
@@ -65,6 +65,21 @@ func TestFileUpdateWithOptionalParams(t *testing.T) {
},
}, shared.ExtensionUnionParam{
OfAIAutoDescription: &shared.ExtensionAIAutoDescriptionParam{},
+ }, shared.ExtensionUnionParam{
+ OfAITasks: &shared.ExtensionAITasksParam{
+ Tasks: []shared.ExtensionAITasksTaskUnionParam{{
+ OfSelectTags: &shared.ExtensionAITasksTaskSelectTagsParam{
+ Instruction: "What types of clothing items are visible?",
+ Vocabulary: []string{"shirt", "dress", "jacket"},
+ MaxSelections: imagekit.Int(1),
+ MinSelections: imagekit.Int(0),
+ },
+ }},
+ },
+ }, shared.ExtensionUnionParam{
+ OfSavedExtension: &shared.ExtensionSavedExtensionParam{
+ ID: "ext_abc123",
+ },
}},
RemoveAITags: imagekit.UpdateFileRequestUpdateFileDetailsRemoveAITagsUnionParam{
OfStringArray: []string{"car", "vehicle", "motorsports"},
@@ -258,6 +273,64 @@ func TestFileUploadWithOptionalParams(t *testing.T) {
},
}, shared.ExtensionUnionParam{
OfAIAutoDescription: &shared.ExtensionAIAutoDescriptionParam{},
+ }, shared.ExtensionUnionParam{
+ OfAITasks: &shared.ExtensionAITasksParam{
+ Tasks: []shared.ExtensionAITasksTaskUnionParam{{
+ OfSelectTags: &shared.ExtensionAITasksTaskSelectTagsParam{
+ Instruction: "What types of clothing items are visible in this image?",
+ Vocabulary: []string{"shirt", "tshirt", "dress", "trousers", "jacket"},
+ MaxSelections: imagekit.Int(1),
+ MinSelections: imagekit.Int(0),
+ },
+ }, {
+ OfYesNo: &shared.ExtensionAITasksTaskYesNoParam{
+ Instruction: "Is this a luxury or high-end fashion item?",
+ OnNo: shared.ExtensionAITasksTaskYesNoOnNoParam{
+ AddTags: []string{"luxury", "premium"},
+ RemoveTags: []string{"budget", "affordable"},
+ SetMetadata: []shared.ExtensionAITasksTaskYesNoOnNoSetMetadataParam{{
+ Field: "price_range",
+ Value: shared.ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam{
+ OfString: imagekit.String("premium"),
+ },
+ }},
+ UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam{{
+ Field: "price_range",
+ }},
+ },
+ OnUnknown: shared.ExtensionAITasksTaskYesNoOnUnknownParam{
+ AddTags: []string{"luxury", "premium"},
+ RemoveTags: []string{"budget", "affordable"},
+ SetMetadata: []shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam{{
+ Field: "price_range",
+ Value: shared.ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam{
+ OfString: imagekit.String("premium"),
+ },
+ }},
+ UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam{{
+ Field: "price_range",
+ }},
+ },
+ OnYes: shared.ExtensionAITasksTaskYesNoOnYesParam{
+ AddTags: []string{"luxury", "premium"},
+ RemoveTags: []string{"budget", "affordable"},
+ SetMetadata: []shared.ExtensionAITasksTaskYesNoOnYesSetMetadataParam{{
+ Field: "price_range",
+ Value: shared.ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam{
+ OfString: imagekit.String("premium"),
+ },
+ }},
+ UnsetMetadata: []shared.ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam{{
+ Field: "price_range",
+ }},
+ },
+ },
+ }},
+ },
+ }, shared.ExtensionUnionParam{
+ OfSavedExtension: &shared.ExtensionSavedExtensionParam{
+ ID: "ext_abc123",
+ },
}},
Folder: imagekit.String("folder"),
IsPrivateFile: imagekit.Bool(true),
diff --git a/filemetadata.go b/filemetadata.go
index d2136d7..07f7b05 100644
--- a/filemetadata.go
+++ b/filemetadata.go
@@ -54,7 +54,7 @@ func (r *FileMetadataService) Get(ctx context.Context, fileID string, opts ...op
// using this API.
func (r *FileMetadataService) GetFromURL(ctx context.Context, query FileMetadataGetFromURLParams, opts ...option.RequestOption) (res *Metadata, err error) {
opts = slices.Concat(r.Options, opts)
- path := "v1/files/metadata"
+ path := "v1/metadata"
err = requestconfig.ExecuteNewRequest(ctx, http.MethodGet, path, query, &res, opts...)
return
}
diff --git a/go.mod b/go.mod
index 11f9670..f306eb5 100644
--- a/go.mod
+++ b/go.mod
@@ -3,8 +3,8 @@ module github.com/imagekit-developer/imagekit-go/v2
go 1.22
require (
- github.com/standard-webhooks/standard-webhooks/libraries v0.0.0-20250711233419-a173a6c0125c
- github.com/tidwall/gjson v1.14.4
+ github.com/standard-webhooks/standard-webhooks/libraries v0.0.0-20260114220421-3f69fd681bb0
+ github.com/tidwall/gjson v1.18.0
github.com/tidwall/sjson v1.2.5
)
diff --git a/go.sum b/go.sum
index 318dc77..b09e3fe 100644
--- a/go.sum
+++ b/go.sum
@@ -1,8 +1,8 @@
-github.com/standard-webhooks/standard-webhooks/libraries v0.0.0-20250711233419-a173a6c0125c h1:Mm99t6GdFMtZOwyyvu3q8gXeZX0sqnjvimTC9QCJwQc=
-github.com/standard-webhooks/standard-webhooks/libraries v0.0.0-20250711233419-a173a6c0125c/go.mod h1:L1MQhA6x4dn9r007T033lsaZMv9EmBAdXyU/+EF40fo=
+github.com/standard-webhooks/standard-webhooks/libraries v0.0.0-20260114220421-3f69fd681bb0 h1:EZXYkItlI9VXF+3x/VFkP8JKa6ibJVZAMjHGfdjzHC8=
+github.com/standard-webhooks/standard-webhooks/libraries v0.0.0-20260114220421-3f69fd681bb0/go.mod h1:L1MQhA6x4dn9r007T033lsaZMv9EmBAdXyU/+EF40fo=
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
-github.com/tidwall/gjson v1.14.4 h1:uo0p8EbA09J7RQaflQ1aBRffTR7xedD2bcIVSYxLnkM=
-github.com/tidwall/gjson v1.14.4/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
+github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY=
+github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
diff --git a/internal/apiform/encoder.go b/internal/apiform/encoder.go
index 1d6afb2..58f5621 100644
--- a/internal/apiform/encoder.go
+++ b/internal/apiform/encoder.go
@@ -60,6 +60,7 @@ type encoderField struct {
type encoderEntry struct {
reflect.Type
dateFormat string
+ arrayFmt string
root bool
}
@@ -77,6 +78,7 @@ func (e *encoder) typeEncoder(t reflect.Type) encoderFunc {
entry := encoderEntry{
Type: t,
dateFormat: e.dateFormat,
+ arrayFmt: e.arrayFmt,
root: e.root,
}
@@ -178,34 +180,9 @@ func (e *encoder) newPrimitiveTypeEncoder(t reflect.Type) encoderFunc {
}
}
-func arrayKeyEncoder(arrayFmt string) func(string, int) string {
- var keyFn func(string, int) string
- switch arrayFmt {
- case "comma", "repeat":
- keyFn = func(k string, _ int) string { return k }
- case "brackets":
- keyFn = func(key string, _ int) string { return key + "[]" }
- case "indices:dots":
- keyFn = func(k string, i int) string {
- if k == "" {
- return strconv.Itoa(i)
- }
- return k + "." + strconv.Itoa(i)
- }
- case "indices:brackets":
- keyFn = func(k string, i int) string {
- if k == "" {
- return strconv.Itoa(i)
- }
- return k + "[" + strconv.Itoa(i) + "]"
- }
- }
- return keyFn
-}
-
func (e *encoder) newArrayTypeEncoder(t reflect.Type) encoderFunc {
itemEncoder := e.typeEncoder(t.Elem())
- keyFn := arrayKeyEncoder(e.arrayFmt)
+ keyFn := e.arrayKeyEncoder()
return func(key string, v reflect.Value, writer *multipart.Writer) error {
if keyFn == nil {
return fmt.Errorf("apiform: unsupported array format")
@@ -303,13 +280,10 @@ func (e *encoder) newStructTypeEncoder(t reflect.Type) encoderFunc {
})
return func(key string, value reflect.Value, writer *multipart.Writer) error {
- if key != "" {
- key = key + "."
- }
-
+ keyFn := e.objKeyEncoder(key)
for _, ef := range encoderFields {
field := value.FieldByIndex(ef.idx)
- err := ef.fn(key+ef.tag.name, field, writer)
+ err := ef.fn(keyFn(ef.tag.name), field, writer)
if err != nil {
return err
}
@@ -405,6 +379,43 @@ func (e *encoder) newReaderTypeEncoder() encoderFunc {
}
}
+func (e encoder) arrayKeyEncoder() func(string, int) string {
+ var keyFn func(string, int) string
+ switch e.arrayFmt {
+ case "comma", "repeat":
+ keyFn = func(k string, _ int) string { return k }
+ case "brackets":
+ keyFn = func(key string, _ int) string { return key + "[]" }
+ case "indices:dots":
+ keyFn = func(k string, i int) string {
+ if k == "" {
+ return strconv.Itoa(i)
+ }
+ return k + "." + strconv.Itoa(i)
+ }
+ case "indices:brackets":
+ keyFn = func(k string, i int) string {
+ if k == "" {
+ return strconv.Itoa(i)
+ }
+ return k + "[" + strconv.Itoa(i) + "]"
+ }
+ }
+ return keyFn
+}
+
+func (e encoder) objKeyEncoder(parent string) func(string) string {
+ if parent == "" {
+ return func(child string) string { return child }
+ }
+ switch e.arrayFmt {
+ case "brackets":
+ return func(child string) string { return parent + "[" + child + "]" }
+ default:
+ return func(child string) string { return parent + "." + child }
+ }
+}
+
// Given a []byte of json (may either be an empty object or an object that already contains entries)
// encode all of the entries in the map to the json byte array.
func (e *encoder) encodeMapEntries(key string, v reflect.Value, writer *multipart.Writer) error {
@@ -413,10 +424,6 @@ func (e *encoder) encodeMapEntries(key string, v reflect.Value, writer *multipar
value reflect.Value
}
- if key != "" {
- key = key + "."
- }
-
pairs := []mapPair{}
iter := v.MapRange()
@@ -434,8 +441,9 @@ func (e *encoder) encodeMapEntries(key string, v reflect.Value, writer *multipar
})
elementEncoder := e.typeEncoder(v.Type().Elem())
+ keyFn := e.objKeyEncoder(key)
for _, p := range pairs {
- err := elementEncoder(key+string(p.key), p.value, writer)
+ err := elementEncoder(keyFn(p.key), p.value, writer)
if err != nil {
return err
}
diff --git a/internal/apiform/form_test.go b/internal/apiform/form_test.go
index 3b95794..86cb43d 100644
--- a/internal/apiform/form_test.go
+++ b/internal/apiform/form_test.go
@@ -123,6 +123,18 @@ type StructUnion struct {
param.APIUnion
}
+type MultipartMarshalerParent struct {
+ Middle MultipartMarshalerMiddleNext `form:"middle"`
+}
+
+type MultipartMarshalerMiddleNext struct {
+ MiddleNext MultipartMarshalerMiddle `form:"middleNext"`
+}
+
+type MultipartMarshalerMiddle struct {
+ Child int `form:"child"`
+}
+
var tests = map[string]struct {
buf string
val any
@@ -366,6 +378,19 @@ true
},
},
},
+ "recursive_struct,brackets": {
+ `--xxx
+Content-Disposition: form-data; name="child[name]"
+
+Alex
+--xxx
+Content-Disposition: form-data; name="name"
+
+Robert
+--xxx--
+`,
+ Recursive{Name: "Robert", Child: &Recursive{Name: "Alex"}},
+ },
"recursive_struct": {
`--xxx
@@ -529,6 +554,30 @@ Content-Disposition: form-data; name="union"
Union: UnionTime(time.Date(2010, 05, 23, 0, 0, 0, 0, time.UTC)),
},
},
+ "deeply-nested-struct,brackets": {
+ `--xxx
+Content-Disposition: form-data; name="middle[middleNext][child]"
+
+10
+--xxx--
+`,
+ MultipartMarshalerParent{
+ Middle: MultipartMarshalerMiddleNext{
+ MiddleNext: MultipartMarshalerMiddle{
+ Child: 10,
+ },
+ },
+ },
+ },
+ "deeply-nested-map,brackets": {
+ `--xxx
+Content-Disposition: form-data; name="middle[middleNext][child]"
+
+10
+--xxx--
+`,
+ map[string]any{"middle": map[string]any{"middleNext": map[string]any{"child": 10}}},
+ },
}
func TestEncode(t *testing.T) {
@@ -553,7 +602,7 @@ func TestEncode(t *testing.T) {
}
raw := buf.Bytes()
if string(raw) != strings.ReplaceAll(test.buf, "\n", "\r\n") {
- t.Errorf("expected %+#v to serialize to '%s' but got '%s'", test.val, test.buf, string(raw))
+ t.Errorf("expected %+#v to serialize to '%s' but got '%s' (with format %s)", test.val, test.buf, string(raw), arrayFmt)
}
})
}
diff --git a/internal/apijson/enum.go b/internal/apijson/enum.go
index 18b218a..5bef11c 100644
--- a/internal/apijson/enum.go
+++ b/internal/apijson/enum.go
@@ -29,7 +29,7 @@ type validatorFunc func(reflect.Value) exactness
var validators sync.Map
var validationRegistry = map[reflect.Type][]validationEntry{}
-func RegisterFieldValidator[T any, V string | bool | int](fieldName string, values ...V) {
+func RegisterFieldValidator[T any, V string | bool | int | float64](fieldName string, values ...V) {
var t T
parentType := reflect.TypeOf(t)
diff --git a/internal/version.go b/internal/version.go
index fef6622..436f832 100644
--- a/internal/version.go
+++ b/internal/version.go
@@ -2,4 +2,4 @@
package internal
-const PackageVersion = "2.0.0" // x-release-please-version
+const PackageVersion = "2.1.0" // x-release-please-version
diff --git a/lib/helper.go b/lib/helper.go
index 925e1ee..d8e4bf8 100644
--- a/lib/helper.go
+++ b/lib/helper.go
@@ -254,10 +254,14 @@ func (r *HelperService) buildTransformationStringInternal(transformation []share
if !param.IsOmitted(currentTransform.Radius.OfMax) {
return "max"
}
+ if value := r.getOptParamValue(currentTransform.Radius.OfString); value != "" {
+ return value
+ }
return r.getOptParamValue(currentTransform.Radius.OfFloat)
}},
{"bg", func() string { return r.getOptParamValue(currentTransform.Background) }},
{"b", func() string { return r.getOptParamValue(currentTransform.Border) }},
+ {"cr", func() string { return r.getOptParamValue(currentTransform.ColorReplace) }},
{"di", func() string {
if !param.IsOmitted(currentTransform.DefaultImage) && currentTransform.DefaultImage.Value != "" {
value := currentTransform.DefaultImage.Value
@@ -399,6 +403,12 @@ func (r *HelperService) buildTransformationStringInternal(transformation []share
}
return "", false
}},
+ {"e-distort", func() (string, bool) {
+ if value := r.getOptParamValue(currentTransform.Distort); value != "" {
+ return value, false
+ }
+ return "", false
+ }},
}
for _, effect := range effectMappings {
@@ -589,6 +599,11 @@ func (r *HelperService) processOverlay(overlay shared.OverlayUnionParam) string
// Process position and timing if baseOverlay is set
if baseOverlay != nil {
+ // LayerMode
+ if baseOverlay.LayerMode != "" {
+ entries = append(entries, fmt.Sprintf("lm-%s", baseOverlay.LayerMode))
+ }
+
// Position
position := baseOverlay.Position
if !param.IsOmitted(position.X.OfFloat) {
diff --git a/packages/respjson/respjson.go b/packages/respjson/respjson.go
index cc0088c..9e61c5c 100644
--- a/packages/respjson/respjson.go
+++ b/packages/respjson/respjson.go
@@ -5,7 +5,7 @@ package respjson
// Use [Field.Valid] to check if an optional value was null or omitted.
//
// A Field will always occur in the following structure, where it
-// mirrors the original field in it's parent struct:
+// mirrors the original field in its parent struct:
//
// type ExampleObject struct {
// Foo bool `json:"foo"`
diff --git a/savedextension.go b/savedextension.go
new file mode 100644
index 0000000..1999c24
--- /dev/null
+++ b/savedextension.go
@@ -0,0 +1,135 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+package imagekit
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "net/http"
+ "slices"
+
+ "github.com/imagekit-developer/imagekit-go/v2/internal/apijson"
+ "github.com/imagekit-developer/imagekit-go/v2/internal/requestconfig"
+ "github.com/imagekit-developer/imagekit-go/v2/option"
+ "github.com/imagekit-developer/imagekit-go/v2/packages/param"
+ "github.com/imagekit-developer/imagekit-go/v2/shared"
+)
+
+// SavedExtensionService contains methods and other services that help with
+// interacting with the ImageKit API.
+//
+// Note, unlike clients, this service does not read variables from the environment
+// automatically. You should not instantiate this service directly, and instead use
+// the [NewSavedExtensionService] method instead.
+type SavedExtensionService struct {
+ Options []option.RequestOption
+}
+
+// NewSavedExtensionService generates a new service that applies the given options
+// to each request. These options are applied after the parent client's options (if
+// there is one), and before any request-specific options.
+func NewSavedExtensionService(opts ...option.RequestOption) (r SavedExtensionService) {
+ r = SavedExtensionService{}
+ r.Options = opts
+ return
+}
+
+// This API creates a new saved extension. Saved extensions allow you to save
+// complex extension configurations (like AI tasks) and reuse them by referencing
+// the ID in upload or update file APIs.
+//
+// **Saved extension limit** \
+// You can create a maximum of 100 saved extensions per account.
+func (r *SavedExtensionService) New(ctx context.Context, body SavedExtensionNewParams, opts ...option.RequestOption) (res *shared.SavedExtension, err error) {
+ opts = slices.Concat(r.Options, opts)
+ path := "v1/saved-extensions"
+ err = requestconfig.ExecuteNewRequest(ctx, http.MethodPost, path, body, &res, opts...)
+ return
+}
+
+// This API updates an existing saved extension. You can update the name,
+// description, or config.
+func (r *SavedExtensionService) Update(ctx context.Context, id string, body SavedExtensionUpdateParams, opts ...option.RequestOption) (res *shared.SavedExtension, err error) {
+ opts = slices.Concat(r.Options, opts)
+ if id == "" {
+ err = errors.New("missing required id parameter")
+ return
+ }
+ path := fmt.Sprintf("v1/saved-extensions/%s", id)
+ err = requestconfig.ExecuteNewRequest(ctx, http.MethodPatch, path, body, &res, opts...)
+ return
+}
+
+// This API returns an array of all saved extensions for your account. Saved
+// extensions allow you to save complex extension configurations and reuse them by
+// referencing them by ID in upload or update file APIs.
+func (r *SavedExtensionService) List(ctx context.Context, opts ...option.RequestOption) (res *[]shared.SavedExtension, err error) {
+ opts = slices.Concat(r.Options, opts)
+ path := "v1/saved-extensions"
+ err = requestconfig.ExecuteNewRequest(ctx, http.MethodGet, path, nil, &res, opts...)
+ return
+}
+
+// This API deletes a saved extension permanently.
+func (r *SavedExtensionService) Delete(ctx context.Context, id string, opts ...option.RequestOption) (err error) {
+ opts = slices.Concat(r.Options, opts)
+ opts = append([]option.RequestOption{option.WithHeader("Accept", "*/*")}, opts...)
+ if id == "" {
+ err = errors.New("missing required id parameter")
+ return
+ }
+ path := fmt.Sprintf("v1/saved-extensions/%s", id)
+ err = requestconfig.ExecuteNewRequest(ctx, http.MethodDelete, path, nil, nil, opts...)
+ return
+}
+
+// This API returns details of a specific saved extension by ID.
+func (r *SavedExtensionService) Get(ctx context.Context, id string, opts ...option.RequestOption) (res *shared.SavedExtension, err error) {
+ opts = slices.Concat(r.Options, opts)
+ if id == "" {
+ err = errors.New("missing required id parameter")
+ return
+ }
+ path := fmt.Sprintf("v1/saved-extensions/%s", id)
+ err = requestconfig.ExecuteNewRequest(ctx, http.MethodGet, path, nil, &res, opts...)
+ return
+}
+
+type SavedExtensionNewParams struct {
+ // Configuration object for an extension (base extensions only, not saved extension
+ // references).
+ Config shared.ExtensionConfigUnionParam `json:"config,omitzero,required"`
+ // Description of what the saved extension does.
+ Description string `json:"description,required"`
+ // Name of the saved extension.
+ Name string `json:"name,required"`
+ paramObj
+}
+
+func (r SavedExtensionNewParams) MarshalJSON() (data []byte, err error) {
+ type shadow SavedExtensionNewParams
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *SavedExtensionNewParams) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type SavedExtensionUpdateParams struct {
+ // Updated description of the saved extension.
+ Description param.Opt[string] `json:"description,omitzero"`
+ // Updated name of the saved extension.
+ Name param.Opt[string] `json:"name,omitzero"`
+ // Configuration object for an extension (base extensions only, not saved extension
+ // references).
+ Config shared.ExtensionConfigUnionParam `json:"config,omitzero"`
+ paramObj
+}
+
+func (r SavedExtensionUpdateParams) MarshalJSON() (data []byte, err error) {
+ type shadow SavedExtensionUpdateParams
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *SavedExtensionUpdateParams) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
diff --git a/savedextension_test.go b/savedextension_test.go
new file mode 100644
index 0000000..effbeaf
--- /dev/null
+++ b/savedextension_test.go
@@ -0,0 +1,165 @@
+// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
+
+package imagekit_test
+
+import (
+ "context"
+ "errors"
+ "os"
+ "testing"
+
+ "github.com/imagekit-developer/imagekit-go/v2"
+ "github.com/imagekit-developer/imagekit-go/v2/internal/testutil"
+ "github.com/imagekit-developer/imagekit-go/v2/option"
+ "github.com/imagekit-developer/imagekit-go/v2/shared"
+)
+
+func TestSavedExtensionNewWithOptionalParams(t *testing.T) {
+ t.Skip("Prism tests are disabled")
+ baseURL := "http://localhost:4010"
+ if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+ baseURL = envURL
+ }
+ if !testutil.CheckTestServer(t, baseURL) {
+ return
+ }
+ client := imagekit.NewClient(
+ option.WithBaseURL(baseURL),
+ option.WithPrivateKey("My Private Key"),
+ option.WithPassword("My Password"),
+ )
+ _, err := client.SavedExtensions.New(context.TODO(), imagekit.SavedExtensionNewParams{
+ Config: shared.ExtensionConfigUnionParam{
+ OfRemoveBg: &shared.ExtensionConfigRemoveBgParam{
+ Options: shared.ExtensionConfigRemoveBgOptionsParam{
+ AddShadow: imagekit.Bool(true),
+ BgColor: imagekit.String("bg_color"),
+ BgImageURL: imagekit.String("bg_image_url"),
+ Semitransparency: imagekit.Bool(true),
+ },
+ },
+ },
+ Description: "Analyzes vehicle images for type, condition, and quality assessment",
+ Name: "Car Quality Analysis",
+ })
+ if err != nil {
+ var apierr *imagekit.Error
+ if errors.As(err, &apierr) {
+ t.Log(string(apierr.DumpRequest(true)))
+ }
+ t.Fatalf("err should be nil: %s", err.Error())
+ }
+}
+
+func TestSavedExtensionUpdateWithOptionalParams(t *testing.T) {
+ t.Skip("Prism tests are disabled")
+ baseURL := "http://localhost:4010"
+ if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+ baseURL = envURL
+ }
+ if !testutil.CheckTestServer(t, baseURL) {
+ return
+ }
+ client := imagekit.NewClient(
+ option.WithBaseURL(baseURL),
+ option.WithPrivateKey("My Private Key"),
+ option.WithPassword("My Password"),
+ )
+ _, err := client.SavedExtensions.Update(
+ context.TODO(),
+ "id",
+ imagekit.SavedExtensionUpdateParams{
+ Config: shared.ExtensionConfigUnionParam{
+ OfRemoveBg: &shared.ExtensionConfigRemoveBgParam{
+ Options: shared.ExtensionConfigRemoveBgOptionsParam{
+ AddShadow: imagekit.Bool(true),
+ BgColor: imagekit.String("bg_color"),
+ BgImageURL: imagekit.String("bg_image_url"),
+ Semitransparency: imagekit.Bool(true),
+ },
+ },
+ },
+ Description: imagekit.String("x"),
+ Name: imagekit.String("x"),
+ },
+ )
+ if err != nil {
+ var apierr *imagekit.Error
+ if errors.As(err, &apierr) {
+ t.Log(string(apierr.DumpRequest(true)))
+ }
+ t.Fatalf("err should be nil: %s", err.Error())
+ }
+}
+
+func TestSavedExtensionList(t *testing.T) {
+ t.Skip("Prism tests are disabled")
+ baseURL := "http://localhost:4010"
+ if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+ baseURL = envURL
+ }
+ if !testutil.CheckTestServer(t, baseURL) {
+ return
+ }
+ client := imagekit.NewClient(
+ option.WithBaseURL(baseURL),
+ option.WithPrivateKey("My Private Key"),
+ option.WithPassword("My Password"),
+ )
+ _, err := client.SavedExtensions.List(context.TODO())
+ if err != nil {
+ var apierr *imagekit.Error
+ if errors.As(err, &apierr) {
+ t.Log(string(apierr.DumpRequest(true)))
+ }
+ t.Fatalf("err should be nil: %s", err.Error())
+ }
+}
+
+func TestSavedExtensionDelete(t *testing.T) {
+ t.Skip("Prism tests are disabled")
+ baseURL := "http://localhost:4010"
+ if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+ baseURL = envURL
+ }
+ if !testutil.CheckTestServer(t, baseURL) {
+ return
+ }
+ client := imagekit.NewClient(
+ option.WithBaseURL(baseURL),
+ option.WithPrivateKey("My Private Key"),
+ option.WithPassword("My Password"),
+ )
+ err := client.SavedExtensions.Delete(context.TODO(), "id")
+ if err != nil {
+ var apierr *imagekit.Error
+ if errors.As(err, &apierr) {
+ t.Log(string(apierr.DumpRequest(true)))
+ }
+ t.Fatalf("err should be nil: %s", err.Error())
+ }
+}
+
+func TestSavedExtensionGet(t *testing.T) {
+ t.Skip("Prism tests are disabled")
+ baseURL := "http://localhost:4010"
+ if envURL, ok := os.LookupEnv("TEST_API_BASE_URL"); ok {
+ baseURL = envURL
+ }
+ if !testutil.CheckTestServer(t, baseURL) {
+ return
+ }
+ client := imagekit.NewClient(
+ option.WithBaseURL(baseURL),
+ option.WithPrivateKey("My Private Key"),
+ option.WithPassword("My Password"),
+ )
+ _, err := client.SavedExtensions.Get(context.TODO(), "id")
+ if err != nil {
+ var apierr *imagekit.Error
+ if errors.As(err, &apierr) {
+ t.Log(string(apierr.DumpRequest(true)))
+ }
+ t.Fatalf("err should be nil: %s", err.Error())
+ }
+}
diff --git a/shared/constant/constants.go b/shared/constant/constants.go
index 2496e90..bc4ea8e 100644
--- a/shared/constant/constants.go
+++ b/shared/constant/constants.go
@@ -20,6 +20,7 @@ func ValueOf[T Constant[T]]() T {
type Abs string // Always "abs"
type AIAutoDescription string // Always "ai-auto-description"
+type AITasks string // Always "ai-tasks"
type Akamai string // Always "AKAMAI"
type AkeneoPim string // Always "AKENEO_PIM"
type All string // Always "all"
@@ -34,6 +35,9 @@ type Max string // Always "max"
type RemoveBg string // Always "remove-bg"
type S3 string // Always "S3"
type S3Compatible string // Always "S3_COMPATIBLE"
+type SavedExtension string // Always "saved-extension"
+type SelectMetadata string // Always "select_metadata"
+type SelectTags string // Always "select_tags"
type SolidColor string // Always "solidColor"
type Subtitle string // Always "subtitle"
type Text string // Always "text"
@@ -49,9 +53,11 @@ type VideoTransformationError string // Always "video.transformation.error"
type VideoTransformationReady string // Always "video.transformation.ready"
type WebFolder string // Always "WEB_FOLDER"
type WebProxy string // Always "WEB_PROXY"
+type YesNo string // Always "yes_no"
func (c Abs) Default() Abs { return "abs" }
func (c AIAutoDescription) Default() AIAutoDescription { return "ai-auto-description" }
+func (c AITasks) Default() AITasks { return "ai-tasks" }
func (c Akamai) Default() Akamai { return "AKAMAI" }
func (c AkeneoPim) Default() AkeneoPim { return "AKENEO_PIM" }
func (c All) Default() All { return "all" }
@@ -66,6 +72,9 @@ func (c Max) Default() Max { return "max" }
func (c RemoveBg) Default() RemoveBg { return "remove-bg" }
func (c S3) Default() S3 { return "S3" }
func (c S3Compatible) Default() S3Compatible { return "S3_COMPATIBLE" }
+func (c SavedExtension) Default() SavedExtension { return "saved-extension" }
+func (c SelectMetadata) Default() SelectMetadata { return "select_metadata" }
+func (c SelectTags) Default() SelectTags { return "select_tags" }
func (c SolidColor) Default() SolidColor { return "solidColor" }
func (c Subtitle) Default() Subtitle { return "subtitle" }
func (c Text) Default() Text { return "text" }
@@ -95,9 +104,11 @@ func (c VideoTransformationReady) Default() VideoTransformationReady {
}
func (c WebFolder) Default() WebFolder { return "WEB_FOLDER" }
func (c WebProxy) Default() WebProxy { return "WEB_PROXY" }
+func (c YesNo) Default() YesNo { return "yes_no" }
func (c Abs) MarshalJSON() ([]byte, error) { return marshalString(c) }
func (c AIAutoDescription) MarshalJSON() ([]byte, error) { return marshalString(c) }
+func (c AITasks) MarshalJSON() ([]byte, error) { return marshalString(c) }
func (c Akamai) MarshalJSON() ([]byte, error) { return marshalString(c) }
func (c AkeneoPim) MarshalJSON() ([]byte, error) { return marshalString(c) }
func (c All) MarshalJSON() ([]byte, error) { return marshalString(c) }
@@ -112,6 +123,9 @@ func (c Max) MarshalJSON() ([]byte, error) { return mars
func (c RemoveBg) MarshalJSON() ([]byte, error) { return marshalString(c) }
func (c S3) MarshalJSON() ([]byte, error) { return marshalString(c) }
func (c S3Compatible) MarshalJSON() ([]byte, error) { return marshalString(c) }
+func (c SavedExtension) MarshalJSON() ([]byte, error) { return marshalString(c) }
+func (c SelectMetadata) MarshalJSON() ([]byte, error) { return marshalString(c) }
+func (c SelectTags) MarshalJSON() ([]byte, error) { return marshalString(c) }
func (c SolidColor) MarshalJSON() ([]byte, error) { return marshalString(c) }
func (c Subtitle) MarshalJSON() ([]byte, error) { return marshalString(c) }
func (c Text) MarshalJSON() ([]byte, error) { return marshalString(c) }
@@ -127,6 +141,7 @@ func (c VideoTransformationError) MarshalJSON() ([]byte, error) { return mars
func (c VideoTransformationReady) MarshalJSON() ([]byte, error) { return marshalString(c) }
func (c WebFolder) MarshalJSON() ([]byte, error) { return marshalString(c) }
func (c WebProxy) MarshalJSON() ([]byte, error) { return marshalString(c) }
+func (c YesNo) MarshalJSON() ([]byte, error) { return marshalString(c) }
type constant[T any] interface {
Constant[T]
diff --git a/shared/shared.go b/shared/shared.go
index 831548c..3cf5b4c 100644
--- a/shared/shared.go
+++ b/shared/shared.go
@@ -3,199 +3,2693 @@
package shared
import (
+ "encoding/json"
+ "time"
+
"github.com/imagekit-developer/imagekit-go/v2/internal/apijson"
"github.com/imagekit-developer/imagekit-go/v2/packages/param"
+ "github.com/imagekit-developer/imagekit-go/v2/packages/respjson"
"github.com/imagekit-developer/imagekit-go/v2/shared/constant"
)
-// aliased to make [param.APIUnion] private when embedding
-type paramUnion = param.APIUnion
+// aliased to make [param.APIUnion] private when embedding
+type paramUnion = param.APIUnion
+
+// aliased to make [param.APIObject] private when embedding
+type paramObj = param.APIObject
+
+type BaseOverlayParam struct {
+ // Controls how the layer blends with the base image or underlying content. Maps to
+ // `lm` in the URL. By default, layers completely cover the base image beneath
+ // them. Layer modes change this behavior:
+ //
+ // - `multiply`: Multiplies the pixel values of the layer with the base image. The
+ // result is always darker than the original images. This is ideal for applying
+ // shadows or color tints.
+ // - `displace`: Uses the layer as a displacement map to distort pixels in the base
+ // image. The red channel controls horizontal displacement, and the green channel
+ // controls vertical displacement. Requires `x` or `y` parameter to control
+ // displacement magnitude.
+ // - `cutout`: Acts as an inverse mask where opaque areas of the layer turn the
+ // base image transparent, while transparent areas leave the base image
+ // unchanged. This mode functions like a hole-punch, effectively cutting the
+ // shape of the layer out of the underlying image.
+ // - `cutter`: Acts as a shape mask where only the parts of the base image that
+ // fall inside the opaque area of the layer are preserved. This mode functions
+ // like a cookie-cutter, trimming the base image to match the specific dimensions
+ // and shape of the layer. See
+ // [Layer modes](https://imagekit.io/docs/add-overlays-on-images#layer-modes).
+ //
+ // Any of "multiply", "cutter", "cutout", "displace".
+ LayerMode BaseOverlayLayerMode `json:"layerMode,omitzero"`
+ // Specifies the overlay's position relative to the parent asset. See
+ // [Position of Layer](https://imagekit.io/docs/transformations#position-of-layer).
+ Position OverlayPositionParam `json:"position,omitzero"`
+ // Specifies timing information for the overlay (only applicable if the base asset
+ // is a video). See
+ // [Position of Layer](https://imagekit.io/docs/transformations#position-of-layer).
+ Timing OverlayTimingParam `json:"timing,omitzero"`
+ paramObj
+}
+
+func (r BaseOverlayParam) MarshalJSON() (data []byte, err error) {
+ type shadow BaseOverlayParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *BaseOverlayParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Controls how the layer blends with the base image or underlying content. Maps to
+// `lm` in the URL. By default, layers completely cover the base image beneath
+// them. Layer modes change this behavior:
+//
+// - `multiply`: Multiplies the pixel values of the layer with the base image. The
+// result is always darker than the original images. This is ideal for applying
+// shadows or color tints.
+// - `displace`: Uses the layer as a displacement map to distort pixels in the base
+// image. The red channel controls horizontal displacement, and the green channel
+// controls vertical displacement. Requires `x` or `y` parameter to control
+// displacement magnitude.
+// - `cutout`: Acts as an inverse mask where opaque areas of the layer turn the
+// base image transparent, while transparent areas leave the base image
+// unchanged. This mode functions like a hole-punch, effectively cutting the
+// shape of the layer out of the underlying image.
+// - `cutter`: Acts as a shape mask where only the parts of the base image that
+// fall inside the opaque area of the layer are preserved. This mode functions
+// like a cookie-cutter, trimming the base image to match the specific dimensions
+// and shape of the layer. See
+// [Layer modes](https://imagekit.io/docs/add-overlays-on-images#layer-modes).
+type BaseOverlayLayerMode string
+
+const (
+ BaseOverlayLayerModeMultiply BaseOverlayLayerMode = "multiply"
+ BaseOverlayLayerModeCutter BaseOverlayLayerMode = "cutter"
+ BaseOverlayLayerModeCutout BaseOverlayLayerMode = "cutout"
+ BaseOverlayLayerModeDisplace BaseOverlayLayerMode = "displace"
+)
+
+// ExtensionConfigUnion contains all possible properties and values from
+// [ExtensionConfigRemoveBg], [ExtensionConfigAutoTagging],
+// [ExtensionConfigAIAutoDescription], [ExtensionConfigAITasks].
+//
+// Use the [ExtensionConfigUnion.AsAny] method to switch on the variant.
+//
+// Use the methods beginning with 'As' to cast the union to one of its variants.
+type ExtensionConfigUnion struct {
+ // Any of "remove-bg", nil, "ai-auto-description", "ai-tasks".
+ Name string `json:"name"`
+ // This field is from variant [ExtensionConfigRemoveBg].
+ Options ExtensionConfigRemoveBgOptions `json:"options"`
+ // This field is from variant [ExtensionConfigAutoTagging].
+ MaxTags int64 `json:"maxTags"`
+ // This field is from variant [ExtensionConfigAutoTagging].
+ MinConfidence int64 `json:"minConfidence"`
+ // This field is from variant [ExtensionConfigAITasks].
+ Tasks []ExtensionConfigAITasksTaskUnion `json:"tasks"`
+ JSON struct {
+ Name respjson.Field
+ Options respjson.Field
+ MaxTags respjson.Field
+ MinConfidence respjson.Field
+ Tasks respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+func (u ExtensionConfigUnion) AsRemoveBg() (v ExtensionConfigRemoveBg) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigUnion) AsAutoTagging() (v ExtensionConfigAutoTagging) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigUnion) AsAIAutoDescription() (v ExtensionConfigAIAutoDescription) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigUnion) AsAITasks() (v ExtensionConfigAITasks) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+// Returns the unmodified JSON received from the API
+func (u ExtensionConfigUnion) RawJSON() string { return u.JSON.raw }
+
+func (r *ExtensionConfigUnion) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// ToParam converts this ExtensionConfigUnion to a ExtensionConfigUnionParam.
+//
+// Warning: the fields of the param type will not be present. ToParam should only
+// be used at the last possible moment before sending a request. Test for this with
+// ExtensionConfigUnionParam.Overrides()
+func (r ExtensionConfigUnion) ToParam() ExtensionConfigUnionParam {
+ return param.Override[ExtensionConfigUnionParam](json.RawMessage(r.RawJSON()))
+}
+
+type ExtensionConfigRemoveBg struct {
+ // Specifies the background removal extension.
+ Name constant.RemoveBg `json:"name,required"`
+ Options ExtensionConfigRemoveBgOptions `json:"options"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ Name respjson.Field
+ Options respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigRemoveBg) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigRemoveBg) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionConfigRemoveBgOptions struct {
+ // Whether to add an artificial shadow to the result. Default is false. Note:
+ // Adding shadows is currently only supported for car photos.
+ AddShadow bool `json:"add_shadow"`
+ // Specifies a solid color background using hex code (e.g., "81d4fa", "fff") or
+ // color name (e.g., "green"). If this parameter is set, `bg_image_url` must be
+ // empty.
+ BgColor string `json:"bg_color"`
+ // Sets a background image from a URL. If this parameter is set, `bg_color` must be
+ // empty.
+ BgImageURL string `json:"bg_image_url"`
+ // Allows semi-transparent regions in the result. Default is true. Note:
+ // Semitransparency is currently only supported for car windows.
+ Semitransparency bool `json:"semitransparency"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ AddShadow respjson.Field
+ BgColor respjson.Field
+ BgImageURL respjson.Field
+ Semitransparency respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigRemoveBgOptions) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigRemoveBgOptions) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionConfigAutoTagging struct {
+ // Maximum number of tags to attach to the asset.
+ MaxTags int64 `json:"maxTags,required"`
+ // Minimum confidence level for tags to be considered valid.
+ MinConfidence int64 `json:"minConfidence,required"`
+ // Specifies the auto-tagging extension used.
+ //
+ // Any of "google-auto-tagging", "aws-auto-tagging".
+ Name string `json:"name,required"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ MaxTags respjson.Field
+ MinConfidence respjson.Field
+ Name respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAutoTagging) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAutoTagging) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionConfigAIAutoDescription struct {
+ // Specifies the auto description extension.
+ Name constant.AIAutoDescription `json:"name,required"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ Name respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAIAutoDescription) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAIAutoDescription) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionConfigAITasks struct {
+ // Specifies the AI tasks extension for automated image analysis using AI models.
+ Name constant.AITasks `json:"name,required"`
+ // Array of task objects defining AI operations to perform on the asset.
+ Tasks []ExtensionConfigAITasksTaskUnion `json:"tasks,required"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ Name respjson.Field
+ Tasks respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAITasks) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAITasks) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// ExtensionConfigAITasksTaskUnion contains all possible properties and values from
+// [ExtensionConfigAITasksTaskSelectTags],
+// [ExtensionConfigAITasksTaskSelectMetadata], [ExtensionConfigAITasksTaskYesNo].
+//
+// Use the [ExtensionConfigAITasksTaskUnion.AsAny] method to switch on the variant.
+//
+// Use the methods beginning with 'As' to cast the union to one of its variants.
+type ExtensionConfigAITasksTaskUnion struct {
+ Instruction string `json:"instruction"`
+ // Any of "select_tags", "select_metadata", "yes_no".
+ Type string `json:"type"`
+ // This field is a union of [[]string],
+ // [[]ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion]
+ Vocabulary ExtensionConfigAITasksTaskUnionVocabulary `json:"vocabulary"`
+ MaxSelections int64 `json:"max_selections"`
+ MinSelections int64 `json:"min_selections"`
+ // This field is from variant [ExtensionConfigAITasksTaskSelectMetadata].
+ Field string `json:"field"`
+ // This field is from variant [ExtensionConfigAITasksTaskYesNo].
+ OnNo ExtensionConfigAITasksTaskYesNoOnNo `json:"on_no"`
+ // This field is from variant [ExtensionConfigAITasksTaskYesNo].
+ OnUnknown ExtensionConfigAITasksTaskYesNoOnUnknown `json:"on_unknown"`
+ // This field is from variant [ExtensionConfigAITasksTaskYesNo].
+ OnYes ExtensionConfigAITasksTaskYesNoOnYes `json:"on_yes"`
+ JSON struct {
+ Instruction respjson.Field
+ Type respjson.Field
+ Vocabulary respjson.Field
+ MaxSelections respjson.Field
+ MinSelections respjson.Field
+ Field respjson.Field
+ OnNo respjson.Field
+ OnUnknown respjson.Field
+ OnYes respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// anyExtensionConfigAITasksTask is implemented by each variant of
+// [ExtensionConfigAITasksTaskUnion] to add type safety for the return type of
+// [ExtensionConfigAITasksTaskUnion.AsAny]
+type anyExtensionConfigAITasksTask interface {
+ implExtensionConfigAITasksTaskUnion()
+}
+
+// Use the following switch statement to find the correct variant
+//
+// switch variant := ExtensionConfigAITasksTaskUnion.AsAny().(type) {
+// case shared.ExtensionConfigAITasksTaskSelectTags:
+// case shared.ExtensionConfigAITasksTaskSelectMetadata:
+// case shared.ExtensionConfigAITasksTaskYesNo:
+// default:
+// fmt.Errorf("no variant present")
+// }
+func (u ExtensionConfigAITasksTaskUnion) AsAny() anyExtensionConfigAITasksTask {
+ switch u.Type {
+ case "select_tags":
+ return u.AsSelectTags()
+ case "select_metadata":
+ return u.AsSelectMetadata()
+ case "yes_no":
+ return u.AsYesNo()
+ }
+ return nil
+}
+
+func (u ExtensionConfigAITasksTaskUnion) AsSelectTags() (v ExtensionConfigAITasksTaskSelectTags) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskUnion) AsSelectMetadata() (v ExtensionConfigAITasksTaskSelectMetadata) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskUnion) AsYesNo() (v ExtensionConfigAITasksTaskYesNo) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+// Returns the unmodified JSON received from the API
+func (u ExtensionConfigAITasksTaskUnion) RawJSON() string { return u.JSON.raw }
+
+func (r *ExtensionConfigAITasksTaskUnion) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// ExtensionConfigAITasksTaskUnionVocabulary is an implicit subunion of
+// [ExtensionConfigAITasksTaskUnion]. ExtensionConfigAITasksTaskUnionVocabulary
+// provides convenient access to the sub-properties of the union.
+//
+// For type safety it is recommended to directly use a variant of the
+// [ExtensionConfigAITasksTaskUnion].
+//
+// If the underlying value is not a json object, one of the following properties
+// will be valid: OfStringArray
+// OfExtensionConfigAITasksTaskSelectMetadataVocabularyArray]
+type ExtensionConfigAITasksTaskUnionVocabulary struct {
+ // This field will be present if the value is a [[]string] instead of an object.
+ OfStringArray []string `json:",inline"`
+ // This field will be present if the value is a
+ // [[]ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion] instead of an
+ // object.
+ OfExtensionConfigAITasksTaskSelectMetadataVocabularyArray []ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion `json:",inline"`
+ JSON struct {
+ OfStringArray respjson.Field
+ OfExtensionConfigAITasksTaskSelectMetadataVocabularyArray respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+func (r *ExtensionConfigAITasksTaskUnionVocabulary) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionConfigAITasksTaskSelectTags struct {
+ // The question or instruction for the AI to analyze the image.
+ Instruction string `json:"instruction,required"`
+ // Task type that analyzes the image and adds matching tags from a vocabulary.
+ Type constant.SelectTags `json:"type,required"`
+ // Array of possible tag values. Combined length of all strings must not exceed 500
+ // characters. Cannot contain the `%` character.
+ Vocabulary []string `json:"vocabulary,required"`
+ // Maximum number of tags to select from the vocabulary.
+ MaxSelections int64 `json:"max_selections"`
+ // Minimum number of tags to select from the vocabulary.
+ MinSelections int64 `json:"min_selections"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ Instruction respjson.Field
+ Type respjson.Field
+ Vocabulary respjson.Field
+ MaxSelections respjson.Field
+ MinSelections respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAITasksTaskSelectTags) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAITasksTaskSelectTags) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+func (ExtensionConfigAITasksTaskSelectTags) implExtensionConfigAITasksTaskUnion() {}
+
+type ExtensionConfigAITasksTaskSelectMetadata struct {
+ // Name of the custom metadata field to set. The field must exist in your account.
+ Field string `json:"field,required"`
+ // The question or instruction for the AI to analyze the image.
+ Instruction string `json:"instruction,required"`
+ // Task type that analyzes the image and sets a custom metadata field value from a
+ // vocabulary.
+ Type constant.SelectMetadata `json:"type,required"`
+ // Maximum number of values to select from the vocabulary.
+ MaxSelections int64 `json:"max_selections"`
+ // Minimum number of values to select from the vocabulary.
+ MinSelections int64 `json:"min_selections"`
+ // Array of possible values matching the custom metadata field type.
+ Vocabulary []ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion `json:"vocabulary"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ Field respjson.Field
+ Instruction respjson.Field
+ Type respjson.Field
+ MaxSelections respjson.Field
+ MinSelections respjson.Field
+ Vocabulary respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAITasksTaskSelectMetadata) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAITasksTaskSelectMetadata) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+func (ExtensionConfigAITasksTaskSelectMetadata) implExtensionConfigAITasksTaskUnion() {}
+
+// ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion contains all possible
+// properties and values from [string], [float64], [bool].
+//
+// Use the methods beginning with 'As' to cast the union to one of its variants.
+//
+// If the underlying value is not a json object, one of the following properties
+// will be valid: OfString OfFloat OfBool]
+type ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion struct {
+ // This field will be present if the value is a [string] instead of an object.
+ OfString string `json:",inline"`
+ // This field will be present if the value is a [float64] instead of an object.
+ OfFloat float64 `json:",inline"`
+ // This field will be present if the value is a [bool] instead of an object.
+ OfBool bool `json:",inline"`
+ JSON struct {
+ OfString respjson.Field
+ OfFloat respjson.Field
+ OfBool respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+func (u ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion) AsString() (v string) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion) AsFloat() (v float64) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion) AsBool() (v bool) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+// Returns the unmodified JSON received from the API
+func (u ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion) RawJSON() string { return u.JSON.raw }
+
+func (r *ExtensionConfigAITasksTaskSelectMetadataVocabularyUnion) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionConfigAITasksTaskYesNo struct {
+ // The yes/no question for the AI to answer about the image.
+ Instruction string `json:"instruction,required"`
+ // Task type that asks a yes/no question and executes actions based on the answer.
+ Type constant.YesNo `json:"type,required"`
+ // Actions to execute if the AI answers no.
+ OnNo ExtensionConfigAITasksTaskYesNoOnNo `json:"on_no"`
+ // Actions to execute if the AI cannot determine the answer.
+ OnUnknown ExtensionConfigAITasksTaskYesNoOnUnknown `json:"on_unknown"`
+ // Actions to execute if the AI answers yes.
+ OnYes ExtensionConfigAITasksTaskYesNoOnYes `json:"on_yes"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ Instruction respjson.Field
+ Type respjson.Field
+ OnNo respjson.Field
+ OnUnknown respjson.Field
+ OnYes respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAITasksTaskYesNo) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAITasksTaskYesNo) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+func (ExtensionConfigAITasksTaskYesNo) implExtensionConfigAITasksTaskUnion() {}
+
+// Actions to execute if the AI answers no.
+type ExtensionConfigAITasksTaskYesNoOnNo struct {
+ // Array of tag strings to add to the asset.
+ AddTags []string `json:"add_tags"`
+ // Array of tag strings to remove from the asset.
+ RemoveTags []string `json:"remove_tags"`
+ // Array of custom metadata field updates.
+ SetMetadata []ExtensionConfigAITasksTaskYesNoOnNoSetMetadata `json:"set_metadata"`
+ // Array of custom metadata fields to remove.
+ UnsetMetadata []ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadata `json:"unset_metadata"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ AddTags respjson.Field
+ RemoveTags respjson.Field
+ SetMetadata respjson.Field
+ UnsetMetadata respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAITasksTaskYesNoOnNo) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAITasksTaskYesNoOnNo) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionConfigAITasksTaskYesNoOnNoSetMetadata struct {
+ // Name of the custom metadata field to set.
+ Field string `json:"field,required"`
+ // Value to set for the custom metadata field. The value type should match the
+ // custom metadata field type.
+ Value ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion `json:"value,required"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ Field respjson.Field
+ Value respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAITasksTaskYesNoOnNoSetMetadata) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAITasksTaskYesNoOnNoSetMetadata) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion contains all possible
+// properties and values from [string], [float64], [bool],
+// [[]ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion].
+//
+// Use the methods beginning with 'As' to cast the union to one of its variants.
+//
+// If the underlying value is not a json object, one of the following properties
+// will be valid: OfString OfFloat OfBool OfMixed]
+type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion struct {
+ // This field will be present if the value is a [string] instead of an object.
+ OfString string `json:",inline"`
+ // This field will be present if the value is a [float64] instead of an object.
+ OfFloat float64 `json:",inline"`
+ // This field will be present if the value is a [bool] instead of an object.
+ OfBool bool `json:",inline"`
+ // This field will be present if the value is a
+ // [[]ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion] instead of
+ // an object.
+ OfMixed []ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion `json:",inline"`
+ JSON struct {
+ OfString respjson.Field
+ OfFloat respjson.Field
+ OfBool respjson.Field
+ OfMixed respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion) AsString() (v string) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion) AsFloat() (v float64) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion) AsBool() (v bool) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion) AsMixed() (v []ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+// Returns the unmodified JSON received from the API
+func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion) RawJSON() string { return u.JSON.raw }
+
+func (r *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnion) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion contains all
+// possible properties and values from [string], [float64], [bool].
+//
+// Use the methods beginning with 'As' to cast the union to one of its variants.
+//
+// If the underlying value is not a json object, one of the following properties
+// will be valid: OfString OfFloat OfBool]
+type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion struct {
+ // This field will be present if the value is a [string] instead of an object.
+ OfString string `json:",inline"`
+ // This field will be present if the value is a [float64] instead of an object.
+ OfFloat float64 `json:",inline"`
+ // This field will be present if the value is a [bool] instead of an object.
+ OfBool bool `json:",inline"`
+ JSON struct {
+ OfString respjson.Field
+ OfFloat respjson.Field
+ OfBool respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion) AsString() (v string) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion) AsFloat() (v float64) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion) AsBool() (v bool) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+// Returns the unmodified JSON received from the API
+func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion) RawJSON() string {
+ return u.JSON.raw
+}
+
+func (r *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnion) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadata struct {
+ // Name of the custom metadata field to remove.
+ Field string `json:"field,required"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ Field respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadata) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadata) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Actions to execute if the AI cannot determine the answer.
+type ExtensionConfigAITasksTaskYesNoOnUnknown struct {
+ // Array of tag strings to add to the asset.
+ AddTags []string `json:"add_tags"`
+ // Array of tag strings to remove from the asset.
+ RemoveTags []string `json:"remove_tags"`
+ // Array of custom metadata field updates.
+ SetMetadata []ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadata `json:"set_metadata"`
+ // Array of custom metadata fields to remove.
+ UnsetMetadata []ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadata `json:"unset_metadata"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ AddTags respjson.Field
+ RemoveTags respjson.Field
+ SetMetadata respjson.Field
+ UnsetMetadata respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAITasksTaskYesNoOnUnknown) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAITasksTaskYesNoOnUnknown) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadata struct {
+ // Name of the custom metadata field to set.
+ Field string `json:"field,required"`
+ // Value to set for the custom metadata field. The value type should match the
+ // custom metadata field type.
+ Value ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion `json:"value,required"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ Field respjson.Field
+ Value respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadata) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadata) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion contains all
+// possible properties and values from [string], [float64], [bool],
+// [[]ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion].
+//
+// Use the methods beginning with 'As' to cast the union to one of its variants.
+//
+// If the underlying value is not a json object, one of the following properties
+// will be valid: OfString OfFloat OfBool OfMixed]
+type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion struct {
+ // This field will be present if the value is a [string] instead of an object.
+ OfString string `json:",inline"`
+ // This field will be present if the value is a [float64] instead of an object.
+ OfFloat float64 `json:",inline"`
+ // This field will be present if the value is a [bool] instead of an object.
+ OfBool bool `json:",inline"`
+ // This field will be present if the value is a
+ // [[]ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion]
+ // instead of an object.
+ OfMixed []ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion `json:",inline"`
+ JSON struct {
+ OfString respjson.Field
+ OfFloat respjson.Field
+ OfBool respjson.Field
+ OfMixed respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion) AsString() (v string) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion) AsFloat() (v float64) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion) AsBool() (v bool) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion) AsMixed() (v []ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+// Returns the unmodified JSON received from the API
+func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion) RawJSON() string {
+ return u.JSON.raw
+}
+
+func (r *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnion) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion contains
+// all possible properties and values from [string], [float64], [bool].
+//
+// Use the methods beginning with 'As' to cast the union to one of its variants.
+//
+// If the underlying value is not a json object, one of the following properties
+// will be valid: OfString OfFloat OfBool]
+type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion struct {
+ // This field will be present if the value is a [string] instead of an object.
+ OfString string `json:",inline"`
+ // This field will be present if the value is a [float64] instead of an object.
+ OfFloat float64 `json:",inline"`
+ // This field will be present if the value is a [bool] instead of an object.
+ OfBool bool `json:",inline"`
+ JSON struct {
+ OfString respjson.Field
+ OfFloat respjson.Field
+ OfBool respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion) AsString() (v string) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion) AsFloat() (v float64) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion) AsBool() (v bool) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+// Returns the unmodified JSON received from the API
+func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion) RawJSON() string {
+ return u.JSON.raw
+}
+
+func (r *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnion) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadata struct {
+ // Name of the custom metadata field to remove.
+ Field string `json:"field,required"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ Field respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadata) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadata) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Actions to execute if the AI answers yes.
+type ExtensionConfigAITasksTaskYesNoOnYes struct {
+ // Array of tag strings to add to the asset.
+ AddTags []string `json:"add_tags"`
+ // Array of tag strings to remove from the asset.
+ RemoveTags []string `json:"remove_tags"`
+ // Array of custom metadata field updates.
+ SetMetadata []ExtensionConfigAITasksTaskYesNoOnYesSetMetadata `json:"set_metadata"`
+ // Array of custom metadata fields to remove.
+ UnsetMetadata []ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadata `json:"unset_metadata"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ AddTags respjson.Field
+ RemoveTags respjson.Field
+ SetMetadata respjson.Field
+ UnsetMetadata respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAITasksTaskYesNoOnYes) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAITasksTaskYesNoOnYes) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionConfigAITasksTaskYesNoOnYesSetMetadata struct {
+ // Name of the custom metadata field to set.
+ Field string `json:"field,required"`
+ // Value to set for the custom metadata field. The value type should match the
+ // custom metadata field type.
+ Value ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion `json:"value,required"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ Field respjson.Field
+ Value respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAITasksTaskYesNoOnYesSetMetadata) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAITasksTaskYesNoOnYesSetMetadata) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion contains all possible
+// properties and values from [string], [float64], [bool],
+// [[]ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion].
+//
+// Use the methods beginning with 'As' to cast the union to one of its variants.
+//
+// If the underlying value is not a json object, one of the following properties
+// will be valid: OfString OfFloat OfBool OfMixed]
+type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion struct {
+ // This field will be present if the value is a [string] instead of an object.
+ OfString string `json:",inline"`
+ // This field will be present if the value is a [float64] instead of an object.
+ OfFloat float64 `json:",inline"`
+ // This field will be present if the value is a [bool] instead of an object.
+ OfBool bool `json:",inline"`
+ // This field will be present if the value is a
+ // [[]ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion] instead
+ // of an object.
+ OfMixed []ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion `json:",inline"`
+ JSON struct {
+ OfString respjson.Field
+ OfFloat respjson.Field
+ OfBool respjson.Field
+ OfMixed respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion) AsString() (v string) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion) AsFloat() (v float64) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion) AsBool() (v bool) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion) AsMixed() (v []ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+// Returns the unmodified JSON received from the API
+func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion) RawJSON() string {
+ return u.JSON.raw
+}
+
+func (r *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnion) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion contains all
+// possible properties and values from [string], [float64], [bool].
+//
+// Use the methods beginning with 'As' to cast the union to one of its variants.
+//
+// If the underlying value is not a json object, one of the following properties
+// will be valid: OfString OfFloat OfBool]
+type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion struct {
+ // This field will be present if the value is a [string] instead of an object.
+ OfString string `json:",inline"`
+ // This field will be present if the value is a [float64] instead of an object.
+ OfFloat float64 `json:",inline"`
+ // This field will be present if the value is a [bool] instead of an object.
+ OfBool bool `json:",inline"`
+ JSON struct {
+ OfString respjson.Field
+ OfFloat respjson.Field
+ OfBool respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion) AsString() (v string) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion) AsFloat() (v float64) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion) AsBool() (v bool) {
+ apijson.UnmarshalRoot(json.RawMessage(u.JSON.raw), &v)
+ return
+}
+
+// Returns the unmodified JSON received from the API
+func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion) RawJSON() string {
+ return u.JSON.raw
+}
+
+func (r *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnion) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadata struct {
+ // Name of the custom metadata field to remove.
+ Field string `json:"field,required"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ Field respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadata) RawJSON() string { return r.JSON.raw }
+func (r *ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadata) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+func ExtensionConfigParamOfAutoTagging(maxTags int64, minConfidence int64, name string) ExtensionConfigUnionParam {
+ var variant ExtensionConfigAutoTaggingParam
+ variant.MaxTags = maxTags
+ variant.MinConfidence = minConfidence
+ variant.Name = name
+ return ExtensionConfigUnionParam{OfAutoTagging: &variant}
+}
+
+func ExtensionConfigParamOfAITasks(tasks []ExtensionConfigAITasksTaskUnionParam) ExtensionConfigUnionParam {
+ var aiTasks ExtensionConfigAITasksParam
+ aiTasks.Tasks = tasks
+ return ExtensionConfigUnionParam{OfAITasks: &aiTasks}
+}
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionConfigUnionParam struct {
+ OfRemoveBg *ExtensionConfigRemoveBgParam `json:",omitzero,inline"`
+ OfAutoTagging *ExtensionConfigAutoTaggingParam `json:",omitzero,inline"`
+ OfAIAutoDescription *ExtensionConfigAIAutoDescriptionParam `json:",omitzero,inline"`
+ OfAITasks *ExtensionConfigAITasksParam `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionConfigUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfRemoveBg, u.OfAutoTagging, u.OfAIAutoDescription, u.OfAITasks)
+}
+func (u *ExtensionConfigUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionConfigUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfRemoveBg) {
+ return u.OfRemoveBg
+ } else if !param.IsOmitted(u.OfAutoTagging) {
+ return u.OfAutoTagging
+ } else if !param.IsOmitted(u.OfAIAutoDescription) {
+ return u.OfAIAutoDescription
+ } else if !param.IsOmitted(u.OfAITasks) {
+ return u.OfAITasks
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionConfigUnionParam) GetOptions() *ExtensionConfigRemoveBgOptionsParam {
+ if vt := u.OfRemoveBg; vt != nil {
+ return &vt.Options
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionConfigUnionParam) GetMaxTags() *int64 {
+ if vt := u.OfAutoTagging; vt != nil {
+ return &vt.MaxTags
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionConfigUnionParam) GetMinConfidence() *int64 {
+ if vt := u.OfAutoTagging; vt != nil {
+ return &vt.MinConfidence
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionConfigUnionParam) GetTasks() []ExtensionConfigAITasksTaskUnionParam {
+ if vt := u.OfAITasks; vt != nil {
+ return vt.Tasks
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionConfigUnionParam) GetName() *string {
+ if vt := u.OfRemoveBg; vt != nil {
+ return (*string)(&vt.Name)
+ } else if vt := u.OfAutoTagging; vt != nil {
+ return (*string)(&vt.Name)
+ } else if vt := u.OfAIAutoDescription; vt != nil {
+ return (*string)(&vt.Name)
+ } else if vt := u.OfAITasks; vt != nil {
+ return (*string)(&vt.Name)
+ }
+ return nil
+}
+
+func init() {
+ apijson.RegisterUnion[ExtensionConfigUnionParam](
+ "name",
+ apijson.Discriminator[ExtensionConfigRemoveBgParam]("remove-bg"),
+ apijson.Discriminator[ExtensionConfigAutoTaggingParam]("google-auto-tagging"),
+ apijson.Discriminator[ExtensionConfigAutoTaggingParam]("aws-auto-tagging"),
+ apijson.Discriminator[ExtensionConfigAIAutoDescriptionParam]("ai-auto-description"),
+ apijson.Discriminator[ExtensionConfigAITasksParam]("ai-tasks"),
+ )
+}
+
+// The property Name is required.
+type ExtensionConfigRemoveBgParam struct {
+ Options ExtensionConfigRemoveBgOptionsParam `json:"options,omitzero"`
+ // Specifies the background removal extension.
+ //
+ // This field can be elided, and will marshal its zero value as "remove-bg".
+ Name constant.RemoveBg `json:"name,required"`
+ paramObj
+}
+
+func (r ExtensionConfigRemoveBgParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigRemoveBgParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigRemoveBgParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionConfigRemoveBgOptionsParam struct {
+ // Whether to add an artificial shadow to the result. Default is false. Note:
+ // Adding shadows is currently only supported for car photos.
+ AddShadow param.Opt[bool] `json:"add_shadow,omitzero"`
+ // Specifies a solid color background using hex code (e.g., "81d4fa", "fff") or
+ // color name (e.g., "green"). If this parameter is set, `bg_image_url` must be
+ // empty.
+ BgColor param.Opt[string] `json:"bg_color,omitzero"`
+ // Sets a background image from a URL. If this parameter is set, `bg_color` must be
+ // empty.
+ BgImageURL param.Opt[string] `json:"bg_image_url,omitzero"`
+ // Allows semi-transparent regions in the result. Default is true. Note:
+ // Semitransparency is currently only supported for car windows.
+ Semitransparency param.Opt[bool] `json:"semitransparency,omitzero"`
+ paramObj
+}
+
+func (r ExtensionConfigRemoveBgOptionsParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigRemoveBgOptionsParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigRemoveBgOptionsParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// The properties MaxTags, MinConfidence, Name are required.
+type ExtensionConfigAutoTaggingParam struct {
+ // Maximum number of tags to attach to the asset.
+ MaxTags int64 `json:"maxTags,required"`
+ // Minimum confidence level for tags to be considered valid.
+ MinConfidence int64 `json:"minConfidence,required"`
+ // Specifies the auto-tagging extension used.
+ //
+ // Any of "google-auto-tagging", "aws-auto-tagging".
+ Name string `json:"name,omitzero,required"`
+ paramObj
+}
+
+func (r ExtensionConfigAutoTaggingParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAutoTaggingParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAutoTaggingParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+func init() {
+ apijson.RegisterFieldValidator[ExtensionConfigAutoTaggingParam](
+ "name", "google-auto-tagging", "aws-auto-tagging",
+ )
+}
+
+func NewExtensionConfigAIAutoDescriptionParam() ExtensionConfigAIAutoDescriptionParam {
+ return ExtensionConfigAIAutoDescriptionParam{
+ Name: "ai-auto-description",
+ }
+}
+
+// This struct has a constant value, construct it with
+// [NewExtensionConfigAIAutoDescriptionParam].
+type ExtensionConfigAIAutoDescriptionParam struct {
+ // Specifies the auto description extension.
+ Name constant.AIAutoDescription `json:"name,required"`
+ paramObj
+}
+
+func (r ExtensionConfigAIAutoDescriptionParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAIAutoDescriptionParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAIAutoDescriptionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// The properties Name, Tasks are required.
+type ExtensionConfigAITasksParam struct {
+ // Array of task objects defining AI operations to perform on the asset.
+ Tasks []ExtensionConfigAITasksTaskUnionParam `json:"tasks,omitzero,required"`
+ // Specifies the AI tasks extension for automated image analysis using AI models.
+ //
+ // This field can be elided, and will marshal its zero value as "ai-tasks".
+ Name constant.AITasks `json:"name,required"`
+ paramObj
+}
+
+func (r ExtensionConfigAITasksParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAITasksParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAITasksParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionConfigAITasksTaskUnionParam struct {
+ OfSelectTags *ExtensionConfigAITasksTaskSelectTagsParam `json:",omitzero,inline"`
+ OfSelectMetadata *ExtensionConfigAITasksTaskSelectMetadataParam `json:",omitzero,inline"`
+ OfYesNo *ExtensionConfigAITasksTaskYesNoParam `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionConfigAITasksTaskUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfSelectTags, u.OfSelectMetadata, u.OfYesNo)
+}
+func (u *ExtensionConfigAITasksTaskUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionConfigAITasksTaskUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfSelectTags) {
+ return u.OfSelectTags
+ } else if !param.IsOmitted(u.OfSelectMetadata) {
+ return u.OfSelectMetadata
+ } else if !param.IsOmitted(u.OfYesNo) {
+ return u.OfYesNo
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionConfigAITasksTaskUnionParam) GetField() *string {
+ if vt := u.OfSelectMetadata; vt != nil {
+ return &vt.Field
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionConfigAITasksTaskUnionParam) GetOnNo() *ExtensionConfigAITasksTaskYesNoOnNoParam {
+ if vt := u.OfYesNo; vt != nil {
+ return &vt.OnNo
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionConfigAITasksTaskUnionParam) GetOnUnknown() *ExtensionConfigAITasksTaskYesNoOnUnknownParam {
+ if vt := u.OfYesNo; vt != nil {
+ return &vt.OnUnknown
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionConfigAITasksTaskUnionParam) GetOnYes() *ExtensionConfigAITasksTaskYesNoOnYesParam {
+ if vt := u.OfYesNo; vt != nil {
+ return &vt.OnYes
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionConfigAITasksTaskUnionParam) GetInstruction() *string {
+ if vt := u.OfSelectTags; vt != nil {
+ return (*string)(&vt.Instruction)
+ } else if vt := u.OfSelectMetadata; vt != nil {
+ return (*string)(&vt.Instruction)
+ } else if vt := u.OfYesNo; vt != nil {
+ return (*string)(&vt.Instruction)
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionConfigAITasksTaskUnionParam) GetType() *string {
+ if vt := u.OfSelectTags; vt != nil {
+ return (*string)(&vt.Type)
+ } else if vt := u.OfSelectMetadata; vt != nil {
+ return (*string)(&vt.Type)
+ } else if vt := u.OfYesNo; vt != nil {
+ return (*string)(&vt.Type)
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionConfigAITasksTaskUnionParam) GetMaxSelections() *int64 {
+ if vt := u.OfSelectTags; vt != nil && vt.MaxSelections.Valid() {
+ return &vt.MaxSelections.Value
+ } else if vt := u.OfSelectMetadata; vt != nil && vt.MaxSelections.Valid() {
+ return &vt.MaxSelections.Value
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionConfigAITasksTaskUnionParam) GetMinSelections() *int64 {
+ if vt := u.OfSelectTags; vt != nil && vt.MinSelections.Valid() {
+ return &vt.MinSelections.Value
+ } else if vt := u.OfSelectMetadata; vt != nil && vt.MinSelections.Valid() {
+ return &vt.MinSelections.Value
+ }
+ return nil
+}
+
+// Returns a subunion which exports methods to access subproperties
+//
+// Or use AsAny() to get the underlying value
+func (u ExtensionConfigAITasksTaskUnionParam) GetVocabulary() (res extensionConfigAITasksTaskUnionParamVocabulary) {
+ if vt := u.OfSelectTags; vt != nil {
+ res.any = &vt.Vocabulary
+ } else if vt := u.OfSelectMetadata; vt != nil {
+ res.any = &vt.Vocabulary
+ }
+ return
+}
+
+// Can have the runtime types [_[]string],
+// [_[]ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam]
+type extensionConfigAITasksTaskUnionParamVocabulary struct{ any }
+
+// Use the following switch statement to get the type of the union:
+//
+// switch u.AsAny().(type) {
+// case *[]string:
+// case *[]shared.ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam:
+// default:
+// fmt.Errorf("not present")
+// }
+func (u extensionConfigAITasksTaskUnionParamVocabulary) AsAny() any { return u.any }
+
+func init() {
+ apijson.RegisterUnion[ExtensionConfigAITasksTaskUnionParam](
+ "type",
+ apijson.Discriminator[ExtensionConfigAITasksTaskSelectTagsParam]("select_tags"),
+ apijson.Discriminator[ExtensionConfigAITasksTaskSelectMetadataParam]("select_metadata"),
+ apijson.Discriminator[ExtensionConfigAITasksTaskYesNoParam]("yes_no"),
+ )
+}
+
+// The properties Instruction, Type, Vocabulary are required.
+type ExtensionConfigAITasksTaskSelectTagsParam struct {
+ // The question or instruction for the AI to analyze the image.
+ Instruction string `json:"instruction,required"`
+ // Array of possible tag values. Combined length of all strings must not exceed 500
+ // characters. Cannot contain the `%` character.
+ Vocabulary []string `json:"vocabulary,omitzero,required"`
+ // Maximum number of tags to select from the vocabulary.
+ MaxSelections param.Opt[int64] `json:"max_selections,omitzero"`
+ // Minimum number of tags to select from the vocabulary.
+ MinSelections param.Opt[int64] `json:"min_selections,omitzero"`
+ // Task type that analyzes the image and adds matching tags from a vocabulary.
+ //
+ // This field can be elided, and will marshal its zero value as "select_tags".
+ Type constant.SelectTags `json:"type,required"`
+ paramObj
+}
+
+func (r ExtensionConfigAITasksTaskSelectTagsParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAITasksTaskSelectTagsParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAITasksTaskSelectTagsParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// The properties Field, Instruction, Type are required.
+type ExtensionConfigAITasksTaskSelectMetadataParam struct {
+ // Name of the custom metadata field to set. The field must exist in your account.
+ Field string `json:"field,required"`
+ // The question or instruction for the AI to analyze the image.
+ Instruction string `json:"instruction,required"`
+ // Maximum number of values to select from the vocabulary.
+ MaxSelections param.Opt[int64] `json:"max_selections,omitzero"`
+ // Minimum number of values to select from the vocabulary.
+ MinSelections param.Opt[int64] `json:"min_selections,omitzero"`
+ // Array of possible values matching the custom metadata field type.
+ Vocabulary []ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam `json:"vocabulary,omitzero"`
+ // Task type that analyzes the image and sets a custom metadata field value from a
+ // vocabulary.
+ //
+ // This field can be elided, and will marshal its zero value as "select_metadata".
+ Type constant.SelectMetadata `json:"type,required"`
+ paramObj
+}
+
+func (r ExtensionConfigAITasksTaskSelectMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAITasksTaskSelectMetadataParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAITasksTaskSelectMetadataParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool)
+}
+func (u *ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionConfigAITasksTaskSelectMetadataVocabularyUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
+ }
+ return nil
+}
+
+// The properties Instruction, Type are required.
+type ExtensionConfigAITasksTaskYesNoParam struct {
+ // The yes/no question for the AI to answer about the image.
+ Instruction string `json:"instruction,required"`
+ // Actions to execute if the AI answers no.
+ OnNo ExtensionConfigAITasksTaskYesNoOnNoParam `json:"on_no,omitzero"`
+ // Actions to execute if the AI cannot determine the answer.
+ OnUnknown ExtensionConfigAITasksTaskYesNoOnUnknownParam `json:"on_unknown,omitzero"`
+ // Actions to execute if the AI answers yes.
+ OnYes ExtensionConfigAITasksTaskYesNoOnYesParam `json:"on_yes,omitzero"`
+ // Task type that asks a yes/no question and executes actions based on the answer.
+ //
+ // This field can be elided, and will marshal its zero value as "yes_no".
+ Type constant.YesNo `json:"type,required"`
+ paramObj
+}
+
+func (r ExtensionConfigAITasksTaskYesNoParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAITasksTaskYesNoParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAITasksTaskYesNoParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Actions to execute if the AI answers no.
+type ExtensionConfigAITasksTaskYesNoOnNoParam struct {
+ // Array of tag strings to add to the asset.
+ AddTags []string `json:"add_tags,omitzero"`
+ // Array of tag strings to remove from the asset.
+ RemoveTags []string `json:"remove_tags,omitzero"`
+ // Array of custom metadata field updates.
+ SetMetadata []ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam `json:"set_metadata,omitzero"`
+ // Array of custom metadata fields to remove.
+ UnsetMetadata []ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam `json:"unset_metadata,omitzero"`
+ paramObj
+}
+
+func (r ExtensionConfigAITasksTaskYesNoOnNoParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAITasksTaskYesNoOnNoParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAITasksTaskYesNoOnNoParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// The properties Field, Value are required.
+type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam struct {
+ // Name of the custom metadata field to set.
+ Field string `json:"field,required"`
+ // Value to set for the custom metadata field. The value type should match the
+ // custom metadata field type.
+ Value ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam `json:"value,omitzero,required"`
+ paramObj
+}
+
+func (r ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ OfMixed []ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool, u.OfMixed)
+}
+func (u *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
+ } else if !param.IsOmitted(u.OfMixed) {
+ return &u.OfMixed
+ }
+ return nil
+}
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool)
+}
+func (u *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionConfigAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
+ }
+ return nil
+}
+
+// The property Field is required.
+type ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam struct {
+ // Name of the custom metadata field to remove.
+ Field string `json:"field,required"`
+ paramObj
+}
+
+func (r ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAITasksTaskYesNoOnNoUnsetMetadataParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Actions to execute if the AI cannot determine the answer.
+type ExtensionConfigAITasksTaskYesNoOnUnknownParam struct {
+ // Array of tag strings to add to the asset.
+ AddTags []string `json:"add_tags,omitzero"`
+ // Array of tag strings to remove from the asset.
+ RemoveTags []string `json:"remove_tags,omitzero"`
+ // Array of custom metadata field updates.
+ SetMetadata []ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam `json:"set_metadata,omitzero"`
+ // Array of custom metadata fields to remove.
+ UnsetMetadata []ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam `json:"unset_metadata,omitzero"`
+ paramObj
+}
+
+func (r ExtensionConfigAITasksTaskYesNoOnUnknownParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAITasksTaskYesNoOnUnknownParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAITasksTaskYesNoOnUnknownParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// The properties Field, Value are required.
+type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam struct {
+ // Name of the custom metadata field to set.
+ Field string `json:"field,required"`
+ // Value to set for the custom metadata field. The value type should match the
+ // custom metadata field type.
+ Value ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam `json:"value,omitzero,required"`
+ paramObj
+}
+
+func (r ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ OfMixed []ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool, u.OfMixed)
+}
+func (u *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
+ } else if !param.IsOmitted(u.OfMixed) {
+ return &u.OfMixed
+ }
+ return nil
+}
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool)
+}
+func (u *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionConfigAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
+ }
+ return nil
+}
+
+// The property Field is required.
+type ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam struct {
+ // Name of the custom metadata field to remove.
+ Field string `json:"field,required"`
+ paramObj
+}
+
+func (r ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAITasksTaskYesNoOnUnknownUnsetMetadataParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Actions to execute if the AI answers yes.
+type ExtensionConfigAITasksTaskYesNoOnYesParam struct {
+ // Array of tag strings to add to the asset.
+ AddTags []string `json:"add_tags,omitzero"`
+ // Array of tag strings to remove from the asset.
+ RemoveTags []string `json:"remove_tags,omitzero"`
+ // Array of custom metadata field updates.
+ SetMetadata []ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam `json:"set_metadata,omitzero"`
+ // Array of custom metadata fields to remove.
+ UnsetMetadata []ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam `json:"unset_metadata,omitzero"`
+ paramObj
+}
+
+func (r ExtensionConfigAITasksTaskYesNoOnYesParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAITasksTaskYesNoOnYesParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAITasksTaskYesNoOnYesParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// The properties Field, Value are required.
+type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam struct {
+ // Name of the custom metadata field to set.
+ Field string `json:"field,required"`
+ // Value to set for the custom metadata field. The value type should match the
+ // custom metadata field type.
+ Value ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam `json:"value,omitzero,required"`
+ paramObj
+}
+
+func (r ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ OfMixed []ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool, u.OfMixed)
+}
+func (u *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
+ } else if !param.IsOmitted(u.OfMixed) {
+ return &u.OfMixed
+ }
+ return nil
+}
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool)
+}
+func (u *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionConfigAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
+ }
+ return nil
+}
+
+// The property Field is required.
+type ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam struct {
+ // Name of the custom metadata field to remove.
+ Field string `json:"field,required"`
+ paramObj
+}
+
+func (r ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionConfigAITasksTaskYesNoOnYesUnsetMetadataParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionsParam []ExtensionUnionParam
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionUnionParam struct {
+ OfRemoveBg *ExtensionRemoveBgParam `json:",omitzero,inline"`
+ OfAutoTagging *ExtensionAutoTaggingParam `json:",omitzero,inline"`
+ OfAIAutoDescription *ExtensionAIAutoDescriptionParam `json:",omitzero,inline"`
+ OfAITasks *ExtensionAITasksParam `json:",omitzero,inline"`
+ OfSavedExtension *ExtensionSavedExtensionParam `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfRemoveBg,
+ u.OfAutoTagging,
+ u.OfAIAutoDescription,
+ u.OfAITasks,
+ u.OfSavedExtension)
+}
+func (u *ExtensionUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfRemoveBg) {
+ return u.OfRemoveBg
+ } else if !param.IsOmitted(u.OfAutoTagging) {
+ return u.OfAutoTagging
+ } else if !param.IsOmitted(u.OfAIAutoDescription) {
+ return u.OfAIAutoDescription
+ } else if !param.IsOmitted(u.OfAITasks) {
+ return u.OfAITasks
+ } else if !param.IsOmitted(u.OfSavedExtension) {
+ return u.OfSavedExtension
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionUnionParam) GetOptions() *ExtensionRemoveBgOptionsParam {
+ if vt := u.OfRemoveBg; vt != nil {
+ return &vt.Options
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionUnionParam) GetMaxTags() *int64 {
+ if vt := u.OfAutoTagging; vt != nil {
+ return &vt.MaxTags
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionUnionParam) GetMinConfidence() *int64 {
+ if vt := u.OfAutoTagging; vt != nil {
+ return &vt.MinConfidence
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionUnionParam) GetTasks() []ExtensionAITasksTaskUnionParam {
+ if vt := u.OfAITasks; vt != nil {
+ return vt.Tasks
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionUnionParam) GetID() *string {
+ if vt := u.OfSavedExtension; vt != nil {
+ return &vt.ID
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionUnionParam) GetName() *string {
+ if vt := u.OfRemoveBg; vt != nil {
+ return (*string)(&vt.Name)
+ } else if vt := u.OfAutoTagging; vt != nil {
+ return (*string)(&vt.Name)
+ } else if vt := u.OfAIAutoDescription; vt != nil {
+ return (*string)(&vt.Name)
+ } else if vt := u.OfAITasks; vt != nil {
+ return (*string)(&vt.Name)
+ } else if vt := u.OfSavedExtension; vt != nil {
+ return (*string)(&vt.Name)
+ }
+ return nil
+}
+
+func init() {
+ apijson.RegisterUnion[ExtensionUnionParam](
+ "name",
+ apijson.Discriminator[ExtensionRemoveBgParam]("remove-bg"),
+ apijson.Discriminator[ExtensionAutoTaggingParam]("google-auto-tagging"),
+ apijson.Discriminator[ExtensionAutoTaggingParam]("aws-auto-tagging"),
+ apijson.Discriminator[ExtensionAIAutoDescriptionParam]("ai-auto-description"),
+ apijson.Discriminator[ExtensionAITasksParam]("ai-tasks"),
+ apijson.Discriminator[ExtensionSavedExtensionParam]("saved-extension"),
+ )
+}
+
+// The property Name is required.
+type ExtensionRemoveBgParam struct {
+ Options ExtensionRemoveBgOptionsParam `json:"options,omitzero"`
+ // Specifies the background removal extension.
+ //
+ // This field can be elided, and will marshal its zero value as "remove-bg".
+ Name constant.RemoveBg `json:"name,required"`
+ paramObj
+}
+
+func (r ExtensionRemoveBgParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionRemoveBgParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionRemoveBgParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+type ExtensionRemoveBgOptionsParam struct {
+ // Whether to add an artificial shadow to the result. Default is false. Note:
+ // Adding shadows is currently only supported for car photos.
+ AddShadow param.Opt[bool] `json:"add_shadow,omitzero"`
+ // Specifies a solid color background using hex code (e.g., "81d4fa", "fff") or
+ // color name (e.g., "green"). If this parameter is set, `bg_image_url` must be
+ // empty.
+ BgColor param.Opt[string] `json:"bg_color,omitzero"`
+ // Sets a background image from a URL. If this parameter is set, `bg_color` must be
+ // empty.
+ BgImageURL param.Opt[string] `json:"bg_image_url,omitzero"`
+ // Allows semi-transparent regions in the result. Default is true. Note:
+ // Semitransparency is currently only supported for car windows.
+ Semitransparency param.Opt[bool] `json:"semitransparency,omitzero"`
+ paramObj
+}
+
+func (r ExtensionRemoveBgOptionsParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionRemoveBgOptionsParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionRemoveBgOptionsParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// The properties MaxTags, MinConfidence, Name are required.
+type ExtensionAutoTaggingParam struct {
+ // Maximum number of tags to attach to the asset.
+ MaxTags int64 `json:"maxTags,required"`
+ // Minimum confidence level for tags to be considered valid.
+ MinConfidence int64 `json:"minConfidence,required"`
+ // Specifies the auto-tagging extension used.
+ //
+ // Any of "google-auto-tagging", "aws-auto-tagging".
+ Name string `json:"name,omitzero,required"`
+ paramObj
+}
+
+func (r ExtensionAutoTaggingParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAutoTaggingParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionAutoTaggingParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+func init() {
+ apijson.RegisterFieldValidator[ExtensionAutoTaggingParam](
+ "name", "google-auto-tagging", "aws-auto-tagging",
+ )
+}
+
+func NewExtensionAIAutoDescriptionParam() ExtensionAIAutoDescriptionParam {
+ return ExtensionAIAutoDescriptionParam{
+ Name: "ai-auto-description",
+ }
+}
+
+// This struct has a constant value, construct it with
+// [NewExtensionAIAutoDescriptionParam].
+type ExtensionAIAutoDescriptionParam struct {
+ // Specifies the auto description extension.
+ Name constant.AIAutoDescription `json:"name,required"`
+ paramObj
+}
+
+func (r ExtensionAIAutoDescriptionParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAIAutoDescriptionParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionAIAutoDescriptionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// The properties Name, Tasks are required.
+type ExtensionAITasksParam struct {
+ // Array of task objects defining AI operations to perform on the asset.
+ Tasks []ExtensionAITasksTaskUnionParam `json:"tasks,omitzero,required"`
+ // Specifies the AI tasks extension for automated image analysis using AI models.
+ //
+ // This field can be elided, and will marshal its zero value as "ai-tasks".
+ Name constant.AITasks `json:"name,required"`
+ paramObj
+}
+
+func (r ExtensionAITasksParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAITasksParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionAITasksParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionAITasksTaskUnionParam struct {
+ OfSelectTags *ExtensionAITasksTaskSelectTagsParam `json:",omitzero,inline"`
+ OfSelectMetadata *ExtensionAITasksTaskSelectMetadataParam `json:",omitzero,inline"`
+ OfYesNo *ExtensionAITasksTaskYesNoParam `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionAITasksTaskUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfSelectTags, u.OfSelectMetadata, u.OfYesNo)
+}
+func (u *ExtensionAITasksTaskUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionAITasksTaskUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfSelectTags) {
+ return u.OfSelectTags
+ } else if !param.IsOmitted(u.OfSelectMetadata) {
+ return u.OfSelectMetadata
+ } else if !param.IsOmitted(u.OfYesNo) {
+ return u.OfYesNo
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionAITasksTaskUnionParam) GetField() *string {
+ if vt := u.OfSelectMetadata; vt != nil {
+ return &vt.Field
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionAITasksTaskUnionParam) GetOnNo() *ExtensionAITasksTaskYesNoOnNoParam {
+ if vt := u.OfYesNo; vt != nil {
+ return &vt.OnNo
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionAITasksTaskUnionParam) GetOnUnknown() *ExtensionAITasksTaskYesNoOnUnknownParam {
+ if vt := u.OfYesNo; vt != nil {
+ return &vt.OnUnknown
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionAITasksTaskUnionParam) GetOnYes() *ExtensionAITasksTaskYesNoOnYesParam {
+ if vt := u.OfYesNo; vt != nil {
+ return &vt.OnYes
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionAITasksTaskUnionParam) GetInstruction() *string {
+ if vt := u.OfSelectTags; vt != nil {
+ return (*string)(&vt.Instruction)
+ } else if vt := u.OfSelectMetadata; vt != nil {
+ return (*string)(&vt.Instruction)
+ } else if vt := u.OfYesNo; vt != nil {
+ return (*string)(&vt.Instruction)
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionAITasksTaskUnionParam) GetType() *string {
+ if vt := u.OfSelectTags; vt != nil {
+ return (*string)(&vt.Type)
+ } else if vt := u.OfSelectMetadata; vt != nil {
+ return (*string)(&vt.Type)
+ } else if vt := u.OfYesNo; vt != nil {
+ return (*string)(&vt.Type)
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionAITasksTaskUnionParam) GetMaxSelections() *int64 {
+ if vt := u.OfSelectTags; vt != nil && vt.MaxSelections.Valid() {
+ return &vt.MaxSelections.Value
+ } else if vt := u.OfSelectMetadata; vt != nil && vt.MaxSelections.Valid() {
+ return &vt.MaxSelections.Value
+ }
+ return nil
+}
+
+// Returns a pointer to the underlying variant's property, if present.
+func (u ExtensionAITasksTaskUnionParam) GetMinSelections() *int64 {
+ if vt := u.OfSelectTags; vt != nil && vt.MinSelections.Valid() {
+ return &vt.MinSelections.Value
+ } else if vt := u.OfSelectMetadata; vt != nil && vt.MinSelections.Valid() {
+ return &vt.MinSelections.Value
+ }
+ return nil
+}
+
+// Returns a subunion which exports methods to access subproperties
+//
+// Or use AsAny() to get the underlying value
+func (u ExtensionAITasksTaskUnionParam) GetVocabulary() (res extensionAITasksTaskUnionParamVocabulary) {
+ if vt := u.OfSelectTags; vt != nil {
+ res.any = &vt.Vocabulary
+ } else if vt := u.OfSelectMetadata; vt != nil {
+ res.any = &vt.Vocabulary
+ }
+ return
+}
+
+// Can have the runtime types [_[]string],
+// [_[]ExtensionAITasksTaskSelectMetadataVocabularyUnionParam]
+type extensionAITasksTaskUnionParamVocabulary struct{ any }
+
+// Use the following switch statement to get the type of the union:
+//
+// switch u.AsAny().(type) {
+// case *[]string:
+// case *[]shared.ExtensionAITasksTaskSelectMetadataVocabularyUnionParam:
+// default:
+// fmt.Errorf("not present")
+// }
+func (u extensionAITasksTaskUnionParamVocabulary) AsAny() any { return u.any }
+
+func init() {
+ apijson.RegisterUnion[ExtensionAITasksTaskUnionParam](
+ "type",
+ apijson.Discriminator[ExtensionAITasksTaskSelectTagsParam]("select_tags"),
+ apijson.Discriminator[ExtensionAITasksTaskSelectMetadataParam]("select_metadata"),
+ apijson.Discriminator[ExtensionAITasksTaskYesNoParam]("yes_no"),
+ )
+}
+
+// The properties Instruction, Type, Vocabulary are required.
+type ExtensionAITasksTaskSelectTagsParam struct {
+ // The question or instruction for the AI to analyze the image.
+ Instruction string `json:"instruction,required"`
+ // Array of possible tag values. Combined length of all strings must not exceed 500
+ // characters. Cannot contain the `%` character.
+ Vocabulary []string `json:"vocabulary,omitzero,required"`
+ // Maximum number of tags to select from the vocabulary.
+ MaxSelections param.Opt[int64] `json:"max_selections,omitzero"`
+ // Minimum number of tags to select from the vocabulary.
+ MinSelections param.Opt[int64] `json:"min_selections,omitzero"`
+ // Task type that analyzes the image and adds matching tags from a vocabulary.
+ //
+ // This field can be elided, and will marshal its zero value as "select_tags".
+ Type constant.SelectTags `json:"type,required"`
+ paramObj
+}
+
+func (r ExtensionAITasksTaskSelectTagsParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAITasksTaskSelectTagsParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionAITasksTaskSelectTagsParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// The properties Field, Instruction, Type are required.
+type ExtensionAITasksTaskSelectMetadataParam struct {
+ // Name of the custom metadata field to set. The field must exist in your account.
+ Field string `json:"field,required"`
+ // The question or instruction for the AI to analyze the image.
+ Instruction string `json:"instruction,required"`
+ // Maximum number of values to select from the vocabulary.
+ MaxSelections param.Opt[int64] `json:"max_selections,omitzero"`
+ // Minimum number of values to select from the vocabulary.
+ MinSelections param.Opt[int64] `json:"min_selections,omitzero"`
+ // Array of possible values matching the custom metadata field type.
+ Vocabulary []ExtensionAITasksTaskSelectMetadataVocabularyUnionParam `json:"vocabulary,omitzero"`
+ // Task type that analyzes the image and sets a custom metadata field value from a
+ // vocabulary.
+ //
+ // This field can be elided, and will marshal its zero value as "select_metadata".
+ Type constant.SelectMetadata `json:"type,required"`
+ paramObj
+}
+
+func (r ExtensionAITasksTaskSelectMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAITasksTaskSelectMetadataParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionAITasksTaskSelectMetadataParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionAITasksTaskSelectMetadataVocabularyUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionAITasksTaskSelectMetadataVocabularyUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool)
+}
+func (u *ExtensionAITasksTaskSelectMetadataVocabularyUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionAITasksTaskSelectMetadataVocabularyUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
+ }
+ return nil
+}
+
+// The properties Instruction, Type are required.
+type ExtensionAITasksTaskYesNoParam struct {
+ // The yes/no question for the AI to answer about the image.
+ Instruction string `json:"instruction,required"`
+ // Actions to execute if the AI answers no.
+ OnNo ExtensionAITasksTaskYesNoOnNoParam `json:"on_no,omitzero"`
+ // Actions to execute if the AI cannot determine the answer.
+ OnUnknown ExtensionAITasksTaskYesNoOnUnknownParam `json:"on_unknown,omitzero"`
+ // Actions to execute if the AI answers yes.
+ OnYes ExtensionAITasksTaskYesNoOnYesParam `json:"on_yes,omitzero"`
+ // Task type that asks a yes/no question and executes actions based on the answer.
+ //
+ // This field can be elided, and will marshal its zero value as "yes_no".
+ Type constant.YesNo `json:"type,required"`
+ paramObj
+}
+
+func (r ExtensionAITasksTaskYesNoParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAITasksTaskYesNoParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionAITasksTaskYesNoParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Actions to execute if the AI answers no.
+type ExtensionAITasksTaskYesNoOnNoParam struct {
+ // Array of tag strings to add to the asset.
+ AddTags []string `json:"add_tags,omitzero"`
+ // Array of tag strings to remove from the asset.
+ RemoveTags []string `json:"remove_tags,omitzero"`
+ // Array of custom metadata field updates.
+ SetMetadata []ExtensionAITasksTaskYesNoOnNoSetMetadataParam `json:"set_metadata,omitzero"`
+ // Array of custom metadata fields to remove.
+ UnsetMetadata []ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam `json:"unset_metadata,omitzero"`
+ paramObj
+}
+
+func (r ExtensionAITasksTaskYesNoOnNoParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAITasksTaskYesNoOnNoParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionAITasksTaskYesNoOnNoParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// The properties Field, Value are required.
+type ExtensionAITasksTaskYesNoOnNoSetMetadataParam struct {
+ // Name of the custom metadata field to set.
+ Field string `json:"field,required"`
+ // Value to set for the custom metadata field. The value type should match the
+ // custom metadata field type.
+ Value ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam `json:"value,omitzero,required"`
+ paramObj
+}
+
+func (r ExtensionAITasksTaskYesNoOnNoSetMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAITasksTaskYesNoOnNoSetMetadataParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionAITasksTaskYesNoOnNoSetMetadataParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ OfMixed []ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool, u.OfMixed)
+}
+func (u *ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionAITasksTaskYesNoOnNoSetMetadataValueUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
+ } else if !param.IsOmitted(u.OfMixed) {
+ return &u.OfMixed
+ }
+ return nil
+}
+
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool)
+}
+func (u *ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionAITasksTaskYesNoOnNoSetMetadataValueMixedItemUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
+ }
+ return nil
+}
+
+// The property Field is required.
+type ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam struct {
+ // Name of the custom metadata field to remove.
+ Field string `json:"field,required"`
+ paramObj
+}
-// aliased to make [param.APIObject] private when embedding
-type paramObj = param.APIObject
+func (r ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionAITasksTaskYesNoOnNoUnsetMetadataParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
-type BaseOverlayParam struct {
- Position OverlayPositionParam `json:"position,omitzero"`
- Timing OverlayTimingParam `json:"timing,omitzero"`
+// Actions to execute if the AI cannot determine the answer.
+type ExtensionAITasksTaskYesNoOnUnknownParam struct {
+ // Array of tag strings to add to the asset.
+ AddTags []string `json:"add_tags,omitzero"`
+ // Array of tag strings to remove from the asset.
+ RemoveTags []string `json:"remove_tags,omitzero"`
+ // Array of custom metadata field updates.
+ SetMetadata []ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam `json:"set_metadata,omitzero"`
+ // Array of custom metadata fields to remove.
+ UnsetMetadata []ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam `json:"unset_metadata,omitzero"`
paramObj
}
-func (r BaseOverlayParam) MarshalJSON() (data []byte, err error) {
- type shadow BaseOverlayParam
+func (r ExtensionAITasksTaskYesNoOnUnknownParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAITasksTaskYesNoOnUnknownParam
return param.MarshalObject(r, (*shadow)(&r))
}
-func (r *BaseOverlayParam) UnmarshalJSON(data []byte) error {
+func (r *ExtensionAITasksTaskYesNoOnUnknownParam) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, r)
}
-type ExtensionsParam []ExtensionUnionParam
+// The properties Field, Value are required.
+type ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam struct {
+ // Name of the custom metadata field to set.
+ Field string `json:"field,required"`
+ // Value to set for the custom metadata field. The value type should match the
+ // custom metadata field type.
+ Value ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam `json:"value,omitzero,required"`
+ paramObj
+}
+
+func (r ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionAITasksTaskYesNoOnUnknownSetMetadataParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
// Only one field can be non-zero.
//
// Use [param.IsOmitted] to confirm if a field is set.
-type ExtensionUnionParam struct {
- OfRemoveBg *ExtensionRemoveBgParam `json:",omitzero,inline"`
- OfAutoTagging *ExtensionAutoTaggingParam `json:",omitzero,inline"`
- OfAIAutoDescription *ExtensionAIAutoDescriptionParam `json:",omitzero,inline"`
+type ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ OfMixed []ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam `json:",omitzero,inline"`
paramUnion
}
-func (u ExtensionUnionParam) MarshalJSON() ([]byte, error) {
- return param.MarshalUnion(u, u.OfRemoveBg, u.OfAutoTagging, u.OfAIAutoDescription)
+func (u ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool, u.OfMixed)
}
-func (u *ExtensionUnionParam) UnmarshalJSON(data []byte) error {
+func (u *ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, u)
}
-func (u *ExtensionUnionParam) asAny() any {
- if !param.IsOmitted(u.OfRemoveBg) {
- return u.OfRemoveBg
- } else if !param.IsOmitted(u.OfAutoTagging) {
- return u.OfAutoTagging
- } else if !param.IsOmitted(u.OfAIAutoDescription) {
- return u.OfAIAutoDescription
+func (u *ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
+ } else if !param.IsOmitted(u.OfMixed) {
+ return &u.OfMixed
}
return nil
}
-// Returns a pointer to the underlying variant's property, if present.
-func (u ExtensionUnionParam) GetOptions() *ExtensionRemoveBgOptionsParam {
- if vt := u.OfRemoveBg; vt != nil {
- return &vt.Options
- }
- return nil
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ paramUnion
}
-// Returns a pointer to the underlying variant's property, if present.
-func (u ExtensionUnionParam) GetMaxTags() *int64 {
- if vt := u.OfAutoTagging; vt != nil {
- return &vt.MaxTags
- }
- return nil
+func (u ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool)
}
-
-// Returns a pointer to the underlying variant's property, if present.
-func (u ExtensionUnionParam) GetMinConfidence() *int64 {
- if vt := u.OfAutoTagging; vt != nil {
- return &vt.MinConfidence
- }
- return nil
+func (u *ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
}
-// Returns a pointer to the underlying variant's property, if present.
-func (u ExtensionUnionParam) GetName() *string {
- if vt := u.OfRemoveBg; vt != nil {
- return (*string)(&vt.Name)
- } else if vt := u.OfAutoTagging; vt != nil {
- return (*string)(&vt.Name)
- } else if vt := u.OfAIAutoDescription; vt != nil {
- return (*string)(&vt.Name)
+func (u *ExtensionAITasksTaskYesNoOnUnknownSetMetadataValueMixedItemUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
}
return nil
}
-func init() {
- apijson.RegisterUnion[ExtensionUnionParam](
- "name",
- apijson.Discriminator[ExtensionRemoveBgParam]("remove-bg"),
- apijson.Discriminator[ExtensionAutoTaggingParam]("google-auto-tagging"),
- apijson.Discriminator[ExtensionAutoTaggingParam]("aws-auto-tagging"),
- apijson.Discriminator[ExtensionAIAutoDescriptionParam]("ai-auto-description"),
- )
-}
-
-// The property Name is required.
-type ExtensionRemoveBgParam struct {
- Options ExtensionRemoveBgOptionsParam `json:"options,omitzero"`
- // Specifies the background removal extension.
- //
- // This field can be elided, and will marshal its zero value as "remove-bg".
- Name constant.RemoveBg `json:"name,required"`
+// The property Field is required.
+type ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam struct {
+ // Name of the custom metadata field to remove.
+ Field string `json:"field,required"`
paramObj
}
-func (r ExtensionRemoveBgParam) MarshalJSON() (data []byte, err error) {
- type shadow ExtensionRemoveBgParam
+func (r ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam
return param.MarshalObject(r, (*shadow)(&r))
}
-func (r *ExtensionRemoveBgParam) UnmarshalJSON(data []byte) error {
+func (r *ExtensionAITasksTaskYesNoOnUnknownUnsetMetadataParam) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, r)
}
-type ExtensionRemoveBgOptionsParam struct {
- // Whether to add an artificial shadow to the result. Default is false. Note:
- // Adding shadows is currently only supported for car photos.
- AddShadow param.Opt[bool] `json:"add_shadow,omitzero"`
- // Specifies a solid color background using hex code (e.g., "81d4fa", "fff") or
- // color name (e.g., "green"). If this parameter is set, `bg_image_url` must be
- // empty.
- BgColor param.Opt[string] `json:"bg_color,omitzero"`
- // Sets a background image from a URL. If this parameter is set, `bg_color` must be
- // empty.
- BgImageURL param.Opt[string] `json:"bg_image_url,omitzero"`
- // Allows semi-transparent regions in the result. Default is true. Note:
- // Semitransparency is currently only supported for car windows.
- Semitransparency param.Opt[bool] `json:"semitransparency,omitzero"`
+// Actions to execute if the AI answers yes.
+type ExtensionAITasksTaskYesNoOnYesParam struct {
+ // Array of tag strings to add to the asset.
+ AddTags []string `json:"add_tags,omitzero"`
+ // Array of tag strings to remove from the asset.
+ RemoveTags []string `json:"remove_tags,omitzero"`
+ // Array of custom metadata field updates.
+ SetMetadata []ExtensionAITasksTaskYesNoOnYesSetMetadataParam `json:"set_metadata,omitzero"`
+ // Array of custom metadata fields to remove.
+ UnsetMetadata []ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam `json:"unset_metadata,omitzero"`
paramObj
}
-func (r ExtensionRemoveBgOptionsParam) MarshalJSON() (data []byte, err error) {
- type shadow ExtensionRemoveBgOptionsParam
+func (r ExtensionAITasksTaskYesNoOnYesParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAITasksTaskYesNoOnYesParam
return param.MarshalObject(r, (*shadow)(&r))
}
-func (r *ExtensionRemoveBgOptionsParam) UnmarshalJSON(data []byte) error {
+func (r *ExtensionAITasksTaskYesNoOnYesParam) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, r)
}
-// The properties MaxTags, MinConfidence, Name are required.
-type ExtensionAutoTaggingParam struct {
- // Maximum number of tags to attach to the asset.
- MaxTags int64 `json:"maxTags,required"`
- // Minimum confidence level for tags to be considered valid.
- MinConfidence int64 `json:"minConfidence,required"`
- // Specifies the auto-tagging extension used.
- //
- // Any of "google-auto-tagging", "aws-auto-tagging".
- Name string `json:"name,omitzero,required"`
+// The properties Field, Value are required.
+type ExtensionAITasksTaskYesNoOnYesSetMetadataParam struct {
+ // Name of the custom metadata field to set.
+ Field string `json:"field,required"`
+ // Value to set for the custom metadata field. The value type should match the
+ // custom metadata field type.
+ Value ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam `json:"value,omitzero,required"`
paramObj
}
-func (r ExtensionAutoTaggingParam) MarshalJSON() (data []byte, err error) {
- type shadow ExtensionAutoTaggingParam
+func (r ExtensionAITasksTaskYesNoOnYesSetMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAITasksTaskYesNoOnYesSetMetadataParam
return param.MarshalObject(r, (*shadow)(&r))
}
-func (r *ExtensionAutoTaggingParam) UnmarshalJSON(data []byte) error {
+func (r *ExtensionAITasksTaskYesNoOnYesSetMetadataParam) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, r)
}
-func init() {
- apijson.RegisterFieldValidator[ExtensionAutoTaggingParam](
- "name", "google-auto-tagging", "aws-auto-tagging",
- )
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ OfMixed []ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam `json:",omitzero,inline"`
+ paramUnion
}
-func NewExtensionAIAutoDescriptionParam() ExtensionAIAutoDescriptionParam {
- return ExtensionAIAutoDescriptionParam{
- Name: "ai-auto-description",
+func (u ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool, u.OfMixed)
+}
+func (u *ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionAITasksTaskYesNoOnYesSetMetadataValueUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
+ } else if !param.IsOmitted(u.OfMixed) {
+ return &u.OfMixed
}
+ return nil
}
-// This struct has a constant value, construct it with
-// [NewExtensionAIAutoDescriptionParam].
-type ExtensionAIAutoDescriptionParam struct {
- // Specifies the auto description extension.
- Name constant.AIAutoDescription `json:"name,required"`
+// Only one field can be non-zero.
+//
+// Use [param.IsOmitted] to confirm if a field is set.
+type ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam struct {
+ OfString param.Opt[string] `json:",omitzero,inline"`
+ OfFloat param.Opt[float64] `json:",omitzero,inline"`
+ OfBool param.Opt[bool] `json:",omitzero,inline"`
+ paramUnion
+}
+
+func (u ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam) MarshalJSON() ([]byte, error) {
+ return param.MarshalUnion(u, u.OfString, u.OfFloat, u.OfBool)
+}
+func (u *ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, u)
+}
+
+func (u *ExtensionAITasksTaskYesNoOnYesSetMetadataValueMixedItemUnionParam) asAny() any {
+ if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
+ } else if !param.IsOmitted(u.OfFloat) {
+ return &u.OfFloat.Value
+ } else if !param.IsOmitted(u.OfBool) {
+ return &u.OfBool.Value
+ }
+ return nil
+}
+
+// The property Field is required.
+type ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam struct {
+ // Name of the custom metadata field to remove.
+ Field string `json:"field,required"`
paramObj
}
-func (r ExtensionAIAutoDescriptionParam) MarshalJSON() (data []byte, err error) {
- type shadow ExtensionAIAutoDescriptionParam
+func (r ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam
return param.MarshalObject(r, (*shadow)(&r))
}
-func (r *ExtensionAIAutoDescriptionParam) UnmarshalJSON(data []byte) error {
+func (r *ExtensionAITasksTaskYesNoOnYesUnsetMetadataParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// The properties ID, Name are required.
+type ExtensionSavedExtensionParam struct {
+ // The unique ID of the saved extension to apply.
+ ID string `json:"id,required"`
+ // Indicates this is a reference to a saved extension.
+ //
+ // This field can be elided, and will marshal its zero value as "saved-extension".
+ Name constant.SavedExtension `json:"name,required"`
+ paramObj
+}
+
+func (r ExtensionSavedExtensionParam) MarshalJSON() (data []byte, err error) {
+ type shadow ExtensionSavedExtensionParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ExtensionSavedExtensionParam) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, r)
}
+// Options for generating responsive image attributes including `src`, `srcSet`,
+// and `sizes` for HTML `
` elements. This schema extends `SrcOptions` to add
+// support for responsive image generation with breakpoints.
+type GetImageAttributesOptionsParam struct {
+ // Custom list of **device-width breakpoints** in pixels. These define common
+ // screen widths for responsive image generation.
+ //
+ // Defaults to `[640, 750, 828, 1080, 1200, 1920, 2048, 3840]`. Sorted
+ // automatically.
+ DeviceBreakpoints []float64 `json:"deviceBreakpoints,omitzero"`
+ // Custom list of **image-specific breakpoints** in pixels. Useful for generating
+ // small variants (e.g., placeholders or thumbnails).
+ //
+ // Merged with `deviceBreakpoints` before calculating `srcSet`. Defaults to
+ // `[16, 32, 48, 64, 96, 128, 256, 384]`. Sorted automatically.
+ ImageBreakpoints []float64 `json:"imageBreakpoints,omitzero"`
+ // The value for the HTML `sizes` attribute (e.g., `"100vw"` or
+ // `"(min-width:768px) 50vw, 100vw"`).
+ //
+ // - If it includes one or more `vw` units, breakpoints smaller than the
+ // corresponding percentage of the smallest device width are excluded.
+ // - If it contains no `vw` units, the full breakpoint list is used.
+ //
+ // Enables a width-based strategy and generates `w` descriptors in `srcSet`.
+ Sizes param.Opt[string] `json:"sizes,omitzero"`
+ // The intended display width of the image in pixels, used **only when the `sizes`
+ // attribute is not provided**.
+ //
+ // Triggers a DPR-based strategy (1x and 2x variants) and generates `x` descriptors
+ // in `srcSet`.
+ //
+ // Ignored if `sizes` is present.
+ Width param.Opt[float64] `json:"width,omitzero"`
+ SrcOptionsParam
+}
+
+func (r GetImageAttributesOptionsParam) MarshalJSON() (data []byte, err error) {
+ type shadow struct {
+ *GetImageAttributesOptionsParam
+ MarshalJSON bool `json:"-"` // Prevent inheriting [json.Marshaler] from the embedded field
+ }
+ return param.MarshalObject(r, shadow{&r, false})
+}
+
type ImageOverlayParam struct {
// Specifies the relative path to the image used as an overlay.
Input string `json:"input,required"`
@@ -205,6 +2699,12 @@ type ImageOverlayParam struct {
// format automatically. To always use base64 encoding (`ie-{base64}`), set this
// parameter to `base64`. To always use plain text (`i-{input}`), set it to
// `plain`.
+ //
+ // Regardless of the encoding method:
+ //
+ // - Leading and trailing slashes are removed.
+ // - Remaining slashes within the path are replaced with `@@` when using plain
+ // text.
Encoding string `json:"encoding,omitzero"`
// Array of transformations to be applied to the overlay image. Supported
// transformations depends on the base/parent asset. See overlays on
@@ -216,8 +2716,11 @@ type ImageOverlayParam struct {
}
func (r ImageOverlayParam) MarshalJSON() (data []byte, err error) {
- type shadow ImageOverlayParam
- return param.MarshalObject(r, (*shadow)(&r))
+ type shadow struct {
+ *ImageOverlayParam
+ MarshalJSON bool `json:"-"` // Prevent inheriting [json.Marshaler] from the embedded field
+ }
+ return param.MarshalObject(r, shadow{&r, false})
}
func OverlayParamOfText(text string) OverlayUnionParam {
@@ -304,6 +2807,22 @@ func (u OverlayUnionParam) GetColor() *string {
return nil
}
+// Returns a pointer to the underlying variant's property, if present.
+func (u OverlayUnionParam) GetLayerMode() *string {
+ if vt := u.OfText; vt != nil {
+ return (*string)(&vt.LayerMode)
+ } else if vt := u.OfImage; vt != nil {
+ return (*string)(&vt.LayerMode)
+ } else if vt := u.OfVideo; vt != nil {
+ return (*string)(&vt.LayerMode)
+ } else if vt := u.OfSubtitle; vt != nil {
+ return (*string)(&vt.LayerMode)
+ } else if vt := u.OfSolidColor; vt != nil {
+ return (*string)(&vt.LayerMode)
+ }
+ return nil
+}
+
// Returns a pointer to the underlying variant's property, if present.
func (u OverlayUnionParam) GetType() *string {
if vt := u.OfText; vt != nil {
@@ -623,6 +3142,101 @@ func (u *OverlayTimingStartUnionParam) asAny() any {
return nil
}
+// Resulting set of attributes suitable for an HTML `
` element. Useful for
+// enabling responsive image loading with `srcSet` and `sizes`.
+//
+// The property Src is required.
+type ResponsiveImageAttributesParam struct {
+ // URL for the _largest_ candidate (assigned to plain `src`).
+ Src string `json:"src,required" format:"uri"`
+ // `sizes` returned (or synthesised as `100vw`). The value for the HTML `sizes`
+ // attribute.
+ Sizes param.Opt[string] `json:"sizes,omitzero"`
+ // Candidate set with `w` or `x` descriptors. Multiple image URLs separated by
+ // commas, each with a descriptor.
+ SrcSet param.Opt[string] `json:"srcSet,omitzero"`
+ // Width as a number (if `width` was provided in the input options).
+ Width param.Opt[float64] `json:"width,omitzero"`
+ paramObj
+}
+
+func (r ResponsiveImageAttributesParam) MarshalJSON() (data []byte, err error) {
+ type shadow ResponsiveImageAttributesParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *ResponsiveImageAttributesParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// Saved extension object containing extension configuration.
+type SavedExtension struct {
+ // Unique identifier of the saved extension.
+ ID string `json:"id"`
+ // Configuration object for an extension (base extensions only, not saved extension
+ // references).
+ Config ExtensionConfigUnion `json:"config"`
+ // Timestamp when the saved extension was created.
+ CreatedAt time.Time `json:"createdAt" format:"date-time"`
+ // Description of the saved extension.
+ Description string `json:"description"`
+ // Name of the saved extension.
+ Name string `json:"name"`
+ // Timestamp when the saved extension was last updated.
+ UpdatedAt time.Time `json:"updatedAt" format:"date-time"`
+ // JSON contains metadata for fields, check presence with [respjson.Field.Valid].
+ JSON struct {
+ ID respjson.Field
+ Config respjson.Field
+ CreatedAt respjson.Field
+ Description respjson.Field
+ Name respjson.Field
+ UpdatedAt respjson.Field
+ ExtraFields map[string]respjson.Field
+ raw string
+ } `json:"-"`
+}
+
+// Returns the unmodified JSON received from the API
+func (r SavedExtension) RawJSON() string { return r.JSON.raw }
+func (r *SavedExtension) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
+// ToParam converts this SavedExtension to a SavedExtensionParam.
+//
+// Warning: the fields of the param type will not be present. ToParam should only
+// be used at the last possible moment before sending a request. Test for this with
+// SavedExtensionParam.Overrides()
+func (r SavedExtension) ToParam() SavedExtensionParam {
+ return param.Override[SavedExtensionParam](json.RawMessage(r.RawJSON()))
+}
+
+// Saved extension object containing extension configuration.
+type SavedExtensionParam struct {
+ // Unique identifier of the saved extension.
+ ID param.Opt[string] `json:"id,omitzero"`
+ // Timestamp when the saved extension was created.
+ CreatedAt param.Opt[time.Time] `json:"createdAt,omitzero" format:"date-time"`
+ // Description of the saved extension.
+ Description param.Opt[string] `json:"description,omitzero"`
+ // Name of the saved extension.
+ Name param.Opt[string] `json:"name,omitzero"`
+ // Timestamp when the saved extension was last updated.
+ UpdatedAt param.Opt[time.Time] `json:"updatedAt,omitzero" format:"date-time"`
+ // Configuration object for an extension (base extensions only, not saved extension
+ // references).
+ Config ExtensionConfigUnionParam `json:"config,omitzero"`
+ paramObj
+}
+
+func (r SavedExtensionParam) MarshalJSON() (data []byte, err error) {
+ type shadow SavedExtensionParam
+ return param.MarshalObject(r, (*shadow)(&r))
+}
+func (r *SavedExtensionParam) UnmarshalJSON(data []byte) error {
+ return apijson.UnmarshalRoot(data, r)
+}
+
type SolidColorOverlayParam struct {
// Specifies the color of the block using an RGB hex code (e.g., `FF0000`), an RGBA
// code (e.g., `FFAABB50`), or a color name (e.g., `red`). If an 8-character value
@@ -640,13 +3254,16 @@ type SolidColorOverlayParam struct {
}
func (r SolidColorOverlayParam) MarshalJSON() (data []byte, err error) {
- type shadow SolidColorOverlayParam
- return param.MarshalObject(r, (*shadow)(&r))
+ type shadow struct {
+ *SolidColorOverlayParam
+ MarshalJSON bool `json:"-"` // Prevent inheriting [json.Marshaler] from the embedded field
+ }
+ return param.MarshalObject(r, shadow{&r, false})
}
type SolidColorOverlayTransformationParam struct {
- // Specifies the transparency level of the solid color overlay. Accepts integers
- // from `1` to `9`.
+ // Specifies the transparency level of the overlaid solid color layer. Supports
+ // integers from `1` to `9`.
Alpha param.Opt[float64] `json:"alpha,omitzero"`
// Specifies the background color of the solid color overlay. Accepts an RGB hex
// code (e.g., `FF0000`), an RGBA code (e.g., `FFAABB50`), or a color name.
@@ -660,9 +3277,14 @@ type SolidColorOverlayTransformationParam struct {
// arithmetic expression. Learn about
// [arithmetic expressions](https://imagekit.io/docs/arithmetic-expressions-in-transformations).
Height SolidColorOverlayTransformationHeightUnionParam `json:"height,omitzero"`
- // Specifies the corner radius of the solid color overlay. Set to `max` for
- // circular or oval shape. See
- // [radius](https://imagekit.io/docs/effects-and-enhancements#radius---r).
+ // Specifies the corner radius of the solid color overlay.
+ //
+ // - Single value (positive integer): Applied to all corners (e.g., `20`).
+ // - `max`: Creates a circular or oval shape.
+ // - Per-corner array: Provide four underscore-separated values representing
+ // top-left, top-right, bottom-right, and bottom-left corners respectively (e.g.,
+ // `10_20_30_40`). See
+ // [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r).
Radius SolidColorOverlayTransformationRadiusUnionParam `json:"radius,omitzero"`
// Controls the width of the solid color overlay. Accepts a numeric value or an
// arithmetic expression (e.g., `bw_mul_0.2` or `bh_div_2`). Learn about
@@ -742,12 +3364,13 @@ func (u *SolidColorOverlayTransformationHeightUnionParam) asAny() any {
type SolidColorOverlayTransformationRadiusUnionParam struct {
OfFloat param.Opt[float64] `json:",omitzero,inline"`
// Construct this variant with constant.ValueOf[constant.Max]()
- OfMax constant.Max `json:",omitzero,inline"`
+ OfMax constant.Max `json:",omitzero,inline"`
+ OfString param.Opt[string] `json:",omitzero,inline"`
paramUnion
}
func (u SolidColorOverlayTransformationRadiusUnionParam) MarshalJSON() ([]byte, error) {
- return param.MarshalUnion(u, u.OfFloat, u.OfMax)
+ return param.MarshalUnion(u, u.OfFloat, u.OfMax, u.OfString)
}
func (u *SolidColorOverlayTransformationRadiusUnionParam) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, u)
@@ -758,6 +3381,8 @@ func (u *SolidColorOverlayTransformationRadiusUnionParam) asAny() any {
return &u.OfFloat.Value
} else if !param.IsOmitted(u.OfMax) {
return &u.OfMax
+ } else if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
}
return nil
}
@@ -866,6 +3491,12 @@ type SubtitleOverlayParam struct {
// format automatically. To always use base64 encoding (`ie-{base64}`), set this
// parameter to `base64`. To always use plain text (`i-{input}`), set it to
// `plain`.
+ //
+ // Regardless of the encoding method:
+ //
+ // - Leading and trailing slashes are removed.
+ // - Remaining slashes within the path are replaced with `@@` when using plain
+ // text.
Encoding string `json:"encoding,omitzero"`
// Control styling of the subtitle. See
// [Styling subtitles](https://imagekit.io/docs/add-overlays-on-videos#styling-controls-for-subtitles-layer).
@@ -874,8 +3505,11 @@ type SubtitleOverlayParam struct {
}
func (r SubtitleOverlayParam) MarshalJSON() (data []byte, err error) {
- type shadow SubtitleOverlayParam
- return param.MarshalObject(r, (*shadow)(&r))
+ type shadow struct {
+ *SubtitleOverlayParam
+ MarshalJSON bool `json:"-"` // Prevent inheriting [json.Marshaler] from the embedded field
+ }
+ return param.MarshalObject(r, shadow{&r, false})
}
// Subtitle styling options.
@@ -892,8 +3526,9 @@ type SubtitleOverlayTransformationParam struct {
//
// [Subtitle styling options](https://imagekit.io/docs/add-overlays-on-videos#styling-controls-for-subtitles-layer)
Color param.Opt[string] `json:"color,omitzero"`
- // Font family for subtitles. Refer to the
- // [supported fonts](https://imagekit.io/docs/add-overlays-on-images#supported-text-font-list).
+ // Sets the font family of subtitle text. Refer to the
+ // [supported fonts documented](https://imagekit.io/docs/add-overlays-on-images#supported-text-font-list)
+ // in the ImageKit transformations guide.
FontFamily param.Opt[string] `json:"fontFamily,omitzero"`
// Sets the font outline of the subtitle text. Requires the outline width (an
// integer) and the outline color (as an RGB color code, RGBA color code, or
@@ -956,6 +3591,9 @@ type TextOverlayParam struct {
// appropriate format based on the input text. To always use base64
// (`ie-{base64}`), set this parameter to `base64`. To always use plain text
// (`i-{input}`), set it to `plain`.
+ //
+ // Regardless of the encoding method, the input text is always percent-encoded to
+ // ensure it is URL-safe.
Encoding string `json:"encoding,omitzero"`
// Control styling of the text overlay. See
// [Text overlays](https://imagekit.io/docs/add-overlays-on-images#text-overlay).
@@ -964,8 +3602,11 @@ type TextOverlayParam struct {
}
func (r TextOverlayParam) MarshalJSON() (data []byte, err error) {
- type shadow TextOverlayParam
- return param.MarshalObject(r, (*shadow)(&r))
+ type shadow struct {
+ *TextOverlayParam
+ MarshalJSON bool `json:"-"` // Prevent inheriting [json.Marshaler] from the embedded field
+ }
+ return param.MarshalObject(r, shadow{&r, false})
}
type TextOverlayTransformationParam struct {
@@ -990,7 +3631,9 @@ type TextOverlayTransformationParam struct {
// - Combinations: Any combination separated by underscores, e.g., `b_i`,
// `b_i_strikethrough`.
Typography param.Opt[string] `json:"typography,omitzero"`
- // Flip the text overlay horizontally, vertically, or both.
+ // Flip/mirror the text horizontally, vertically, or in both directions. Acceptable
+ // values: `h` (horizontal), `v` (vertical), `h_v` (horizontal and vertical), or
+ // `v_h`.
//
// Any of "h", "v", "h_v", "v_h".
Flip TextOverlayTransformationFlip `json:"flip,omitzero"`
@@ -1002,17 +3645,22 @@ type TextOverlayTransformationParam struct {
//
// Any of "left", "right", "center".
InnerAlignment TextOverlayTransformationInnerAlignment `json:"innerAlignment,omitzero"`
- // Specifies the line height of the text overlay. Accepts integer values
- // representing line height in points. It can also accept
- // [arithmetic expressions](https://imagekit.io/docs/arithmetic-expressions-in-transformations)
- // such as `bw_mul_0.2`, or `bh_div_20`.
+ // Specifies the line height for multi-line text overlays. It will come into effect
+ // only if the text wraps over multiple lines. Accepts either an integer value or
+ // an arithmetic expression.
LineHeight TextOverlayTransformationLineHeightUnionParam `json:"lineHeight,omitzero"`
// Specifies the padding around the overlaid text. Can be provided as a single
// positive integer or multiple values separated by underscores (following CSS
// shorthand order). Arithmetic expressions are also accepted.
Padding TextOverlayTransformationPaddingUnionParam `json:"padding,omitzero"`
- // Specifies the corner radius of the text overlay. Set to `max` to achieve a
- // circular or oval shape.
+ // Specifies the corner radius:
+ //
+ // - Single value (positive integer): Applied to all corners (e.g., `20`).
+ // - `max`: Creates a circular or oval shape.
+ // - Per-corner array: Provide four underscore-separated values representing
+ // top-left, top-right, bottom-right, and bottom-left corners respectively (e.g.,
+ // `10_20_30_40`). See
+ // [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r).
Radius TextOverlayTransformationRadiusUnionParam `json:"radius,omitzero"`
// Specifies the rotation angle of the text overlay. Accepts a numeric value for
// clockwise rotation or a string prefixed with "N" for counter-clockwise rotation.
@@ -1033,7 +3681,9 @@ func (r *TextOverlayTransformationParam) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, r)
}
-// Flip the text overlay horizontally, vertically, or both.
+// Flip/mirror the text horizontally, vertically, or in both directions. Acceptable
+// values: `h` (horizontal), `v` (vertical), `h_v` (horizontal and vertical), or
+// `v_h`.
type TextOverlayTransformationFlip string
const (
@@ -1134,12 +3784,13 @@ func (u *TextOverlayTransformationPaddingUnionParam) asAny() any {
type TextOverlayTransformationRadiusUnionParam struct {
OfFloat param.Opt[float64] `json:",omitzero,inline"`
// Construct this variant with constant.ValueOf[constant.Max]()
- OfMax constant.Max `json:",omitzero,inline"`
+ OfMax constant.Max `json:",omitzero,inline"`
+ OfString param.Opt[string] `json:",omitzero,inline"`
paramUnion
}
func (u TextOverlayTransformationRadiusUnionParam) MarshalJSON() ([]byte, error) {
- return param.MarshalUnion(u, u.OfFloat, u.OfMax)
+ return param.MarshalUnion(u, u.OfFloat, u.OfMax, u.OfString)
}
func (u *TextOverlayTransformationRadiusUnionParam) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, u)
@@ -1150,6 +3801,8 @@ func (u *TextOverlayTransformationRadiusUnionParam) asAny() any {
return &u.OfFloat.Value
} else if !param.IsOmitted(u.OfMax) {
return &u.OfMax
+ } else if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
}
return nil
}
@@ -1226,6 +3879,12 @@ type TransformationParam struct {
//
// - A solid color: e.g., `red`, `F3F3F3`, `AAFF0010`. See
// [Solid color background](https://imagekit.io/docs/effects-and-enhancements#solid-color-background).
+ // - Dominant color: `dominant` extracts the dominant color from the image. See
+ // [Dominant color background](https://imagekit.io/docs/effects-and-enhancements#dominant-color-background).
+ // - Gradient: `gradient_dominant` or `gradient_dominant_2` creates a gradient
+ // using the dominant colors. Optionally specify palette size (2 or 4), e.g.,
+ // `gradient_dominant_4`. See
+ // [Gradient background](https://imagekit.io/docs/effects-and-enhancements#gradient-background).
// - A blurred background: e.g., `blurred`, `blurred_25_N15`, etc. See
// [Blurred background](https://imagekit.io/docs/effects-and-enhancements#blurred-background).
// - Expand the image boundaries using generative fill: `genfill`. Not supported
@@ -1246,13 +3905,33 @@ type TransformationParam struct {
// Indicates whether the output image should retain the original color profile. See
// [Color profile](https://imagekit.io/docs/image-optimization#color-profile---cp).
ColorProfile param.Opt[bool] `json:"colorProfile,omitzero"`
+ // Replaces colors in the image. Supports three formats:
+ //
+ // - `toColor` - Replace dominant color with the specified color.
+ // - `toColor_tolerance` - Replace dominant color with specified tolerance (0-100).
+ // - `toColor_tolerance_fromColor` - Replace a specific color with another within
+ // tolerance range. Colors can be hex codes (e.g., `FF0022`) or names (e.g.,
+ // `red`, `blue`). See
+ // [Color replacement](https://imagekit.io/docs/effects-and-enhancements#color-replace---cr).
+ ColorReplace param.Opt[string] `json:"colorReplace,omitzero"`
// Specifies a fallback image if the resource is not found, e.g., a URL or file
// path. See
// [Default image](https://imagekit.io/docs/image-transformation#default-image---di).
DefaultImage param.Opt[string] `json:"defaultImage,omitzero"`
+ // Distorts the shape of an image. Supports two modes:
+ //
+ // - Perspective distortion: `p-x1_y1_x2_y2_x3_y3_x4_y4` changes the position of
+ // the four corners starting clockwise from top-left.
+ // - Arc distortion: `a-degrees` curves the image upwards (positive values) or
+ // downwards (negative values). See
+ // [Distort effect](https://imagekit.io/docs/effects-and-enhancements#distort---e-distort).
+ Distort param.Opt[string] `json:"distort,omitzero"`
// Accepts values between 0.1 and 5, or `auto` for automatic device pixel ratio
- // (DPR) calculation. See
- // [DPR](https://imagekit.io/docs/image-resize-and-crop#dpr---dpr).
+ // (DPR) calculation. Also accepts arithmetic expressions.
+ //
+ // - Learn about
+ // [Arithmetic expressions](https://imagekit.io/docs/arithmetic-expressions-in-transformations).
+ // - See [DPR](https://imagekit.io/docs/image-resize-and-crop#dpr---dpr).
Dpr param.Opt[float64] `json:"dpr,omitzero"`
// Refines padding and cropping behavior for pad resize, maintain ratio, and
// extract crop modes. Supports manual positions and coordinate-based focus. With
@@ -1415,9 +4094,14 @@ type TransformationParam struct {
// 2nd and 3rd layers), or by name (e.g., `name-layer-4` for a PSD layer). See
// [Thumbnail extraction](https://imagekit.io/docs/vector-and-animated-images#get-thumbnail-from-psd-pdf-ai-eps-and-animated-files).
Page TransformationPageUnionParam `json:"page,omitzero"`
- // Specifies the corner radius for rounded corners (e.g., 20) or `max` for circular
- // or oval shape. See
- // [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r).
+ // Specifies the corner radius for rounded corners.
+ //
+ // - Single value (positive integer): Applied to all corners (e.g., `20`).
+ // - `max`: Creates a circular or oval shape.
+ // - Per-corner array: Provide four underscore-separated values representing
+ // top-left, top-right, bottom-right, and bottom-left corners respectively (e.g.,
+ // `10_20_30_40`). See
+ // [Radius](https://imagekit.io/docs/effects-and-enhancements#radius---r).
Radius TransformationRadiusUnionParam `json:"radius,omitzero"`
// Specifies the rotation angle in degrees. Positive values rotate the image
// clockwise; you can also use, for example, `N40` for counterclockwise rotation or
@@ -1771,12 +4455,13 @@ func (u *TransformationPageUnionParam) asAny() any {
type TransformationRadiusUnionParam struct {
OfFloat param.Opt[float64] `json:",omitzero,inline"`
// Construct this variant with constant.ValueOf[constant.Max]()
- OfMax constant.Max `json:",omitzero,inline"`
+ OfMax constant.Max `json:",omitzero,inline"`
+ OfString param.Opt[string] `json:",omitzero,inline"`
paramUnion
}
func (u TransformationRadiusUnionParam) MarshalJSON() ([]byte, error) {
- return param.MarshalUnion(u, u.OfFloat, u.OfMax)
+ return param.MarshalUnion(u, u.OfFloat, u.OfMax, u.OfString)
}
func (u *TransformationRadiusUnionParam) UnmarshalJSON(data []byte) error {
return apijson.UnmarshalRoot(data, u)
@@ -1787,6 +4472,8 @@ func (u *TransformationRadiusUnionParam) asAny() any {
return &u.OfFloat.Value
} else if !param.IsOmitted(u.OfMax) {
return &u.OfMax
+ } else if !param.IsOmitted(u.OfString) {
+ return &u.OfString.Value
}
return nil
}
@@ -2125,6 +4812,12 @@ type VideoOverlayParam struct {
// format automatically. To always use base64 encoding (`ie-{base64}`), set this
// parameter to `base64`. To always use plain text (`i-{input}`), set it to
// `plain`.
+ //
+ // Regardless of the encoding method:
+ //
+ // - Leading and trailing slashes are removed.
+ // - Remaining slashes within the path are replaced with `@@` when using plain
+ // text.
Encoding string `json:"encoding,omitzero"`
// Array of transformation to be applied to the overlay video. Except
// `streamingResolutions`, all other video transformations are supported. See
@@ -2134,6 +4827,9 @@ type VideoOverlayParam struct {
}
func (r VideoOverlayParam) MarshalJSON() (data []byte, err error) {
- type shadow VideoOverlayParam
- return param.MarshalObject(r, (*shadow)(&r))
+ type shadow struct {
+ *VideoOverlayParam
+ MarshalJSON bool `json:"-"` // Prevent inheriting [json.Marshaler] from the embedded field
+ }
+ return param.MarshalObject(r, shadow{&r, false})
}
diff --git a/tests/helper_advanced_transformations_test.go b/tests/helper_advanced_transformations_test.go
index 2d708a1..06a6cf1 100644
--- a/tests/helper_advanced_transformations_test.go
+++ b/tests/helper_advanced_transformations_test.go
@@ -414,6 +414,28 @@ func TestParameterSpecificTransformations(t *testing.T) {
}
})
+ t.Run("should generate the correct URL for radius transformation with string value for per corner radius", func(t *testing.T) {
+ transformation := []shared.TransformationParam{
+ {
+ Radius: shared.TransformationRadiusUnionParam{
+ OfString: param.Opt[string]{Value: "10_10_max_10"},
+ },
+ },
+ }
+
+ url := client.Helper.BuildURL(shared.SrcOptionsParam{
+ URLEndpoint: "https://ik.imagekit.io/test_url_endpoint",
+ TransformationPosition: shared.TransformationPositionQuery,
+ Src: "/test_path1.jpg",
+ Transformation: transformation,
+ })
+
+ expected := "https://ik.imagekit.io/test_url_endpoint/test_path1.jpg?tr=r-10_10_max_10"
+ if url != expected {
+ t.Errorf("Expected %s, got %s", expected, url)
+ }
+ })
+
t.Run("should generate the correct URL with many transformations, including video and AI transforms", func(t *testing.T) {
transformation := []shared.TransformationParam{
{
@@ -502,7 +524,10 @@ func TestParameterSpecificTransformations(t *testing.T) {
Gradient: shared.TransformationGradientUnionParam{
OfString: param.Opt[string]{Value: "from-red_to-white"},
},
- Original: param.Opt[bool]{Value: true},
+ // New transformations
+ ColorReplace: param.Opt[string]{Value: "FF0000_100_0000FF"},
+ Distort: param.Opt[string]{Value: "a-45"},
+ Original: param.Opt[bool]{Value: true},
Page: shared.TransformationPageUnionParam{
OfString: param.Opt[string]{Value: "2_4"},
},
@@ -517,7 +542,7 @@ func TestParameterSpecificTransformations(t *testing.T) {
Transformation: transformation,
})
- expected := "https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=w-400,h-300,q-40,ar-4-3,c-force,cm-extract,fo-left,f-jpeg,r-50,bg-A94D34,b-5-A94D34,di-folder@@file.jpg,dpr-3,x-10,y-20,xc-30,yc-40,o-0.8,z-2,rt-90,bl-10,n-some_name,pr-true,lo-true,fl-h,t-5,md-true,cp-true,vc-h264,ac-aac,so-5,eo-15,du-10,sr-1440_1080,e-grayscale,e-upscale,e-retouch,e-genvar,e-bgremove,e-contrast,e-dropshadow,e-changebg-prompt-car,e-edit-prompt-make it vintage,e-shadow-bl-15_st-40_x-10_y-N5,e-sharpen-10,e-usm-2-2-0.8-0.024,e-gradient-from-red_to-white,orig-true,pg-2_4,h-200,w-300,l-image,i-logo.png,l-end"
+ expected := "https://ik.imagekit.io/test_url_endpoint/test_path.jpg?tr=w-400,h-300,q-40,ar-4-3,c-force,cm-extract,fo-left,f-jpeg,r-50,bg-A94D34,b-5-A94D34,cr-FF0000_100_0000FF,di-folder@@file.jpg,dpr-3,x-10,y-20,xc-30,yc-40,o-0.8,z-2,rt-90,bl-10,n-some_name,pr-true,lo-true,fl-h,t-5,md-true,cp-true,vc-h264,ac-aac,so-5,eo-15,du-10,sr-1440_1080,e-grayscale,e-upscale,e-retouch,e-genvar,e-bgremove,e-contrast,e-dropshadow,e-changebg-prompt-car,e-edit-prompt-make it vintage,e-shadow-bl-15_st-40_x-10_y-N5,e-sharpen-10,e-usm-2-2-0.8-0.024,e-gradient-from-red_to-white,e-distort-a-45,orig-true,pg-2_4,h-200,w-300,l-image,i-logo.png,l-end"
if url != expected {
t.Errorf("Expected %s, got %s", expected, url)
}
diff --git a/tests/helper_overlay_test.go b/tests/helper_overlay_test.go
index a147709..8205cfa 100644
--- a/tests/helper_overlay_test.go
+++ b/tests/helper_overlay_test.go
@@ -833,4 +833,116 @@ func TestOverlayEncoding(t *testing.T) {
t.Errorf("Expected %s, got %s", expected, url)
}
})
+
+ t.Run("should generate URL with image overlay using layerMode multiply", func(t *testing.T) {
+ transformation := []shared.TransformationParam{
+ {
+ Overlay: shared.OverlayUnionParam{
+ OfImage: &shared.ImageOverlayParam{
+ Input: "logo.png",
+ Type: constant.Image("image"),
+ BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeMultiply,
+ },
+ },
+ },
+ },
+ }
+
+ url := client.Helper.BuildURL(shared.SrcOptionsParam{
+ URLEndpoint: "https://ik.imagekit.io/test_url_endpoint",
+ TransformationPosition: shared.TransformationPositionPath,
+ Src: "/base-image.jpg",
+ Transformation: transformation,
+ })
+
+ expected := "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-logo.png,lm-multiply,l-end/base-image.jpg"
+ if url != expected {
+ t.Errorf("Expected %s, got %s", expected, url)
+ }
+ })
+
+ t.Run("should generate URL with image overlay using layerMode cutter", func(t *testing.T) {
+ transformation := []shared.TransformationParam{
+ {
+ Overlay: shared.OverlayUnionParam{
+ OfImage: &shared.ImageOverlayParam{
+ Input: "mask.png",
+ Type: constant.Image("image"),
+ BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeCutter,
+ },
+ },
+ },
+ },
+ }
+
+ url := client.Helper.BuildURL(shared.SrcOptionsParam{
+ URLEndpoint: "https://ik.imagekit.io/test_url_endpoint",
+ TransformationPosition: shared.TransformationPositionPath,
+ Src: "/base-image.jpg",
+ Transformation: transformation,
+ })
+
+ expected := "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-mask.png,lm-cutter,l-end/base-image.jpg"
+ if url != expected {
+ t.Errorf("Expected %s, got %s", expected, url)
+ }
+ })
+
+ t.Run("should generate URL with image overlay using layerMode cutout", func(t *testing.T) {
+ transformation := []shared.TransformationParam{
+ {
+ Overlay: shared.OverlayUnionParam{
+ OfImage: &shared.ImageOverlayParam{
+ Input: "shape.png",
+ Type: constant.Image("image"),
+ BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeCutout,
+ },
+ },
+ },
+ },
+ }
+
+ url := client.Helper.BuildURL(shared.SrcOptionsParam{
+ URLEndpoint: "https://ik.imagekit.io/test_url_endpoint",
+ TransformationPosition: shared.TransformationPositionPath,
+ Src: "/base-image.jpg",
+ Transformation: transformation,
+ })
+
+ expected := "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-shape.png,lm-cutout,l-end/base-image.jpg"
+ if url != expected {
+ t.Errorf("Expected %s, got %s", expected, url)
+ }
+ })
+
+ t.Run("should generate URL with image overlay using layerMode displace", func(t *testing.T) {
+ transformation := []shared.TransformationParam{
+ {
+ Overlay: shared.OverlayUnionParam{
+ OfImage: &shared.ImageOverlayParam{
+ Input: "displacement.png",
+ Type: constant.Image("image"),
+ BaseOverlayParam: shared.BaseOverlayParam{
+ LayerMode: shared.BaseOverlayLayerModeDisplace,
+ },
+ },
+ },
+ },
+ }
+
+ url := client.Helper.BuildURL(shared.SrcOptionsParam{
+ URLEndpoint: "https://ik.imagekit.io/test_url_endpoint",
+ TransformationPosition: shared.TransformationPositionPath,
+ Src: "/base-image.jpg",
+ Transformation: transformation,
+ })
+
+ expected := "https://ik.imagekit.io/test_url_endpoint/tr:l-image,i-displacement.png,lm-displace,l-end/base-image.jpg"
+ if url != expected {
+ t.Errorf("Expected %s, got %s", expected, url)
+ }
+ })
}
diff --git a/usage_test.go b/usage_test.go
index 9e38cfd..6792db9 100644
--- a/usage_test.go
+++ b/usage_test.go
@@ -27,6 +27,7 @@ func TestUsage(t *testing.T) {
option.WithPrivateKey("My Private Key"),
option.WithPassword("My Password"),
)
+ t.Skip("Prism tests are disabled")
response, err := client.Files.Upload(context.TODO(), imagekit.FileUploadParams{
File: io.Reader(bytes.NewBuffer([]byte("https://www.example.com/public-url.jpg"))),
FileName: "file-name.jpg",
diff --git a/webhook.go b/webhook.go
index 6984cf2..abddde8 100644
--- a/webhook.go
+++ b/webhook.go
@@ -612,6 +612,8 @@ type UploadPreTransformSuccessEventDataExtensionStatus struct {
// Any of "success", "pending", "failed".
AIAutoDescription string `json:"ai-auto-description"`
// Any of "success", "pending", "failed".
+ AITasks string `json:"ai-tasks"`
+ // Any of "success", "pending", "failed".
AwsAutoTagging string `json:"aws-auto-tagging"`
// Any of "success", "pending", "failed".
GoogleAutoTagging string `json:"google-auto-tagging"`
@@ -620,6 +622,7 @@ type UploadPreTransformSuccessEventDataExtensionStatus struct {
// JSON contains metadata for fields, check presence with [respjson.Field.Valid].
JSON struct {
AIAutoDescription respjson.Field
+ AITasks respjson.Field
AwsAutoTagging respjson.Field
GoogleAutoTagging respjson.Field
RemoveBg respjson.Field
@@ -1552,13 +1555,16 @@ func (r *VideoTransformationReadyEventTimings) UnmarshalJSON(data []byte) error
// [UploadPreTransformErrorEvent], [UploadPostTransformSuccessEvent],
// [UploadPostTransformErrorEvent].
//
+// Use the [UnsafeUnwrapWebhookEventUnion.AsAny] method to switch on the variant.
+//
// Use the methods beginning with 'As' to cast the union to one of its variants.
type UnsafeUnwrapWebhookEventUnion struct {
// This field is from variant [VideoTransformationAcceptedEvent],
// [VideoTransformationReadyEvent], [VideoTransformationErrorEvent],
// [UploadPreTransformSuccessEvent], [UploadPreTransformErrorEvent],
// [UploadPostTransformSuccessEvent], [UploadPostTransformErrorEvent].
- ID string `json:"id"`
+ ID string `json:"id"`
+ // Any of nil, nil, nil, nil, nil, nil, nil.
Type string `json:"type"`
CreatedAt time.Time `json:"created_at"`
// This field is a union of [VideoTransformationAcceptedEventData],
@@ -1890,13 +1896,16 @@ func (r *UnsafeUnwrapWebhookEventUnionRequestTransformation) UnmarshalJSON(data
// [UploadPreTransformErrorEvent], [UploadPostTransformSuccessEvent],
// [UploadPostTransformErrorEvent].
//
+// Use the [UnwrapWebhookEventUnion.AsAny] method to switch on the variant.
+//
// Use the methods beginning with 'As' to cast the union to one of its variants.
type UnwrapWebhookEventUnion struct {
// This field is from variant [VideoTransformationAcceptedEvent],
// [VideoTransformationReadyEvent], [VideoTransformationErrorEvent],
// [UploadPreTransformSuccessEvent], [UploadPreTransformErrorEvent],
// [UploadPostTransformSuccessEvent], [UploadPostTransformErrorEvent].
- ID string `json:"id"`
+ ID string `json:"id"`
+ // Any of nil, nil, nil, nil, nil, nil, nil.
Type string `json:"type"`
CreatedAt time.Time `json:"created_at"`
// This field is a union of [VideoTransformationAcceptedEventData],