From 205ca91c959c99f38cc1e2eb11c0b401dd4819e2 Mon Sep 17 00:00:00 2001 From: danil Date: Tue, 8 Apr 2025 18:20:39 -0700 Subject: [PATCH 1/6] init commit for nova reel video generation app example --- .../README.md | 109 ++++++++++++++++++ .../images/structure.png | Bin 0 -> 76396 bytes .../pom.xml | 37 ++++++ .../novareel/GenerateVideoResponse.java | 33 ++++++ .../com/example/novareel/NovaReelDemo.java | 18 +++ .../novareel/VideoGenerationService.java | 102 ++++++++++++++++ .../novareel/VideoGeneratorController.java | 28 +++++ .../src/main/resources/application.yaml | 4 + 8 files changed, 331 insertions(+) create mode 100644 javav2/usecases/video_generation_bedrock_nova_reel/README.md create mode 100644 javav2/usecases/video_generation_bedrock_nova_reel/images/structure.png create mode 100644 javav2/usecases/video_generation_bedrock_nova_reel/pom.xml create mode 100644 javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/GenerateVideoResponse.java create mode 100644 javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/NovaReelDemo.java create mode 100644 javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGenerationService.java create mode 100644 javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGeneratorController.java create mode 100644 javav2/usecases/video_generation_bedrock_nova_reel/src/main/resources/application.yaml diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/README.md b/javav2/usecases/video_generation_bedrock_nova_reel/README.md new file mode 100644 index 00000000000..400c1b7bcc9 --- /dev/null +++ b/javav2/usecases/video_generation_bedrock_nova_reel/README.md @@ -0,0 +1,109 @@ +# NovaReel Video Generation Service + +This is a Spring Boot application that provides a REST API to generate videos from text prompts using Amazon Bedrock and the Nova-Reel model. + +## Overview + +The application enables asynchronous video generation using AWS Bedrock's `amazon.nova-reel-v1:0` model and stores the generated videos in an S3 bucket. + +It consists of: +- A REST controller for handling API requests +- A service class to interact with Amazon Bedrock +- A response model for encapsulating result data + +## Project Structure +![](images/structure.png) +- **NovaReelDemo.java** Main class to bootstrap the Spring Boot app +- **GenerateVideoResponse.java** Response DTO with fields: executionArn, s3Bucket, status +- **VideoGenerationService.java** Service for interacting with Amazon Bedrock +- **VideoGeneratorController.java** REST controller exposing /video endpoints + +## Functionality + +### 1. Generate Video +**Endpoint:** POST /video/generate +**Query Param:** prompt (string) +**Description:** +- Takes a text prompt +- Sends an async request to `amazon.nova-reel-v1:0` using Bedrock +- The generated video will be stored in the specified S3 bucket in 3-5 mins +- Returns the executionArn + +### 2. Check Status +**Endpoint:** POST /video/check +**Query Param:** invocationArn (string) +**Description:** +- Checks the generation status of a video using invocationArn +- Returns the current status + +## Configuration + +### Prerequisites + +- AWS account with access to Amazon Bedrock +- AWS credentials configured via named profile (e.g. `~/.aws/credentials`) +- A valid S3 bucket for output (currently hardcoded) + +### Modify S3 Bucket + +In `VideoGenerationService.java`, update the following line: +`String s3Bucket = "s3://add_your_bucket_here";` +Replace with your own S3 bucket URI where videos should be saved. + +### AWS Credentials + +By default, credentials are loaded from a named profile using: +`ProfileCredentialsProvider.create()` +Make sure you have the profile set in your `~/.aws/config` or override it as needed. + +### IAM Permissions +Because Amazon Bedrock writes a file to an Amazon S3 bucket on your behalf, the AWS role that you use needs permissions configured to allow the appropriate Amazon Bedrock and Amazon S3 actions +The minimum action permissions required to execute this application are: + +``` +bedrock:InvokeModel +s3:PutObject +bedrock:GetAsyncInvoke +bedrock:ListAsyncInvokes +``` + + +## How to Run + +1. Clone the repo +2. Update the S3 bucket in `VideoGenerationService.java` +3. Set up AWS credentials +4. Build and run the Spring Boot application: + `./mvnw spring-boot:run` +5. Use an API client (e.g. Postman or curl) to interact with the endpoints + +## Example Requests + +### Generate Video +``` +curl -X POST "http://localhost:8080/video/generate?prompt=A cat surfing on a pizza in space" +``` + +### Check Status +``` +curl -X POST "http://localhost:8080/video/check?invocationArn=" +``` + +## Dependencies + +- Spring Boot Web +- AWS SDK v2 (Bedrock Runtime) +- Jackson / JSON +- Maven or Gradle for build + + +## Future Improvements + +- Make S3 bucket configurable via `application.yml` +- Add status polling endpoint that waits until generation is complete +- Integrate with frontend or S3 browser to retrieve the generated video + +## Additional Materials + +- [Amazon Bedrock Overview](https://aws.amazon.com/bedrock/) +- [Amazon Nova Reel - AWS AI Service Cards](https://docs.aws.amazon.com/ai/responsible-ai/nova-reel/overview.html) diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/images/structure.png b/javav2/usecases/video_generation_bedrock_nova_reel/images/structure.png new file mode 100644 index 0000000000000000000000000000000000000000..fa40a370bda1282ec10a231649b46581fa977c0d GIT binary patch literal 76396 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

aeC`pzE~OaajiwqS{geGvaTtf0*PMeK+9?T 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 RHoii@V{7AJU4d}B`G1vhux|hW literal 0 HcmV?d00001 diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/pom.xml b/javav2/usecases/video_generation_bedrock_nova_reel/pom.xml new file mode 100644 index 00000000000..81d92b1ed51 --- /dev/null +++ b/javav2/usecases/video_generation_bedrock_nova_reel/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.4.1 + + + + com.example + nova-reel-test + 1.0-SNAPSHOT + + + 17 + 17 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + software.amazon.awssdk + bedrockruntime + 2.30.35 + + + + \ No newline at end of file diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/GenerateVideoResponse.java b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/GenerateVideoResponse.java new file mode 100644 index 00000000000..377b61e4a0c --- /dev/null +++ b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/GenerateVideoResponse.java @@ -0,0 +1,33 @@ +package com.example.novareel; + +public class GenerateVideoResponse { + + private String executionArn; + private String s3Bucket; + private String status; + + + public String getExecutionArn() { + return executionArn; + } + + public void setExecutionArn(String executionArn) { + this.executionArn = executionArn; + } + + public String getS3Bucket() { + return s3Bucket; + } + + public void setS3Bucket(String s3Bucket) { + this.s3Bucket = s3Bucket; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/NovaReelDemo.java b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/NovaReelDemo.java new file mode 100644 index 00000000000..343af6cd04f --- /dev/null +++ b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/NovaReelDemo.java @@ -0,0 +1,18 @@ +package com.example.novareel; + +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.ConfigurableApplicationContext; + +@SpringBootApplication +public class NovaReelDemo { + + public static void main(String[] args) { + + ConfigurableApplicationContext run = new SpringApplicationBuilder(NovaReelDemo.class) + .web(WebApplicationType.SERVLET) + .run(args); + } + +} diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGenerationService.java b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGenerationService.java new file mode 100644 index 00000000000..662d7cdedaf --- /dev/null +++ b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGenerationService.java @@ -0,0 +1,102 @@ +package com.example.novareel; + +import org.springframework.stereotype.Service; +import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; +import software.amazon.awssdk.core.document.Document; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.bedrockruntime.BedrockRuntimeAsyncClient; +import software.amazon.awssdk.services.bedrockruntime.model.*; + +import java.util.concurrent.CompletableFuture; + +@Service +public class VideoGenerationService { + + public GenerateVideoResponse generateVideo(String prompt) { + + // add S3 bucket you want to store your generated videos + String s3Bucket = "s3://mygeneratedvidoenovatest"; + + + //Create json request as an instance of Document class + Document novaRequest = prepareDocument(prompt); + + // Create request + StartAsyncInvokeRequest request = StartAsyncInvokeRequest.builder() + .modelId("amazon.nova-reel-v1:0") + .modelInput(novaRequest) + .outputDataConfig(AsyncInvokeOutputDataConfig.builder() + .s3OutputDataConfig(AsyncInvokeS3OutputDataConfig.builder().s3Uri(s3Bucket).build()) + .build()) + .build(); + + try (BedrockRuntimeAsyncClient bedrockClient = getBedrockRuntimeAsyncClient()) { + CompletableFuture startAsyncInvokeResponseCompletableFuture = bedrockClient.startAsyncInvoke(request); + + //blocking operation to wait for the AWS API response + StartAsyncInvokeResponse startAsyncInvokeResponse = startAsyncInvokeResponseCompletableFuture.get(); + System.out.println("invocation ARN: " + startAsyncInvokeResponse.invocationArn()); + + GenerateVideoResponse response = new GenerateVideoResponse(); + response.setStatus("inProgress"); + response.setExecutionArn(startAsyncInvokeResponse.invocationArn()); + + return response; + } catch (Exception e) { + System.out.println(e); + throw new RuntimeException(e); + } + + } + + public GenerateVideoResponse checkGenerationStatus(String invocationArn) { + GenerateVideoResponse response = new GenerateVideoResponse(); + + try (BedrockRuntimeAsyncClient bedrockClient = getBedrockRuntimeAsyncClient()) { + //creating async request to fetch status by invocation Arn + GetAsyncInvokeRequest asyncRequest = GetAsyncInvokeRequest.builder().invocationArn(invocationArn).build(); + + CompletableFuture asyncInvoke = bedrockClient.getAsyncInvoke(asyncRequest); + + //blocking operation to wait for the AWS API response + GetAsyncInvokeResponse asyncInvokeResponse = asyncInvoke.get(); + System.out.println("Invocation status =" + asyncInvokeResponse.statusAsString()); + + response.setExecutionArn(invocationArn); + response.setStatus(asyncInvokeResponse.statusAsString()); + return response; + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + + } + + private static BedrockRuntimeAsyncClient getBedrockRuntimeAsyncClient() { + BedrockRuntimeAsyncClient bedrockClient = BedrockRuntimeAsyncClient.builder() + .region(Region.US_EAST_1) + .credentialsProvider(ProfileCredentialsProvider.create()) + .build(); + return bedrockClient; + } + + private static Document prepareDocument(String prompt) { + Document textToVideoParams = Document.mapBuilder() + .putString("text", prompt) + .build(); + + Document videoGenerationConfig = Document.mapBuilder() + .putNumber("durationSeconds", 6) + .putNumber("fps", 24) + .putString("dimension", "1280x720") + .build(); + + Document novaRequest = Document.mapBuilder() + .putString("taskType", "TEXT_VIDEO") + .putDocument("textToVideoParams", textToVideoParams) + .putDocument("videoGenerationConfig", videoGenerationConfig) + .build(); + return novaRequest; + } + +} diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGeneratorController.java b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGeneratorController.java new file mode 100644 index 00000000000..8dd356752bd --- /dev/null +++ b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGeneratorController.java @@ -0,0 +1,28 @@ +package com.example.novareel; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/video") +public class VideoGeneratorController { + + @Autowired + VideoGenerationService videoGenerationService; + + @PostMapping(value = "/generate", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity generateVideo(@RequestParam String prompt) { + return ResponseEntity.ok(videoGenerationService.generateVideo(prompt)); + } + + @PostMapping(value = "/check", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity checkStatus(@RequestParam String invocationArn) { + return ResponseEntity.ok(videoGenerationService.checkGenerationStatus(invocationArn)); + } + +} diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/resources/application.yaml b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/resources/application.yaml new file mode 100644 index 00000000000..16af88fa144 --- /dev/null +++ b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/resources/application.yaml @@ -0,0 +1,4 @@ +spring: + application: + name: nova-reel-demo + From 7ef815f8b131e92823e84dc00ae6732ad317eae1 Mon Sep 17 00:00:00 2001 From: danil Date: Tue, 8 Apr 2025 18:29:17 -0700 Subject: [PATCH 2/6] init commit for nova reel video generation app example --- javav2/usecases/video_generation_bedrock_nova_reel/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/README.md b/javav2/usecases/video_generation_bedrock_nova_reel/README.md index 400c1b7bcc9..c7ddda9383d 100644 --- a/javav2/usecases/video_generation_bedrock_nova_reel/README.md +++ b/javav2/usecases/video_generation_bedrock_nova_reel/README.md @@ -88,6 +88,7 @@ curl -X POST "http://localhost:8080/video/generate?prompt=A cat surfing on a piz ``` curl -X POST "http://localhost:8080/video/check?invocationArn=" ``` +when status is Completed - video generated and stored in S3 bucket ## Dependencies From fa7ce1a4f3371b1c13ebf691141d4796181379b5 Mon Sep 17 00:00:00 2001 From: danil Date: Mon, 28 Apr 2025 14:34:22 -0700 Subject: [PATCH 3/6] fixing Missing SPDX check --- .../main/java/com/example/novareel/GenerateVideoResponse.java | 3 +++ .../src/main/java/com/example/novareel/NovaReelDemo.java | 3 +++ .../main/java/com/example/novareel/VideoGenerationService.java | 3 +++ .../java/com/example/novareel/VideoGeneratorController.java | 3 +++ 4 files changed, 12 insertions(+) diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/GenerateVideoResponse.java b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/GenerateVideoResponse.java index 377b61e4a0c..587436d54ef 100644 --- a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/GenerateVideoResponse.java +++ b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/GenerateVideoResponse.java @@ -1,3 +1,6 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + package com.example.novareel; public class GenerateVideoResponse { diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/NovaReelDemo.java b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/NovaReelDemo.java index 343af6cd04f..3d1165551f9 100644 --- a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/NovaReelDemo.java +++ b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/NovaReelDemo.java @@ -1,3 +1,6 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + package com.example.novareel; import org.springframework.boot.WebApplicationType; diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGenerationService.java b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGenerationService.java index 662d7cdedaf..19fe8c790ec 100644 --- a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGenerationService.java +++ b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGenerationService.java @@ -1,3 +1,6 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + package com.example.novareel; import org.springframework.stereotype.Service; diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGeneratorController.java b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGeneratorController.java index 8dd356752bd..17f15a46bbb 100644 --- a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGeneratorController.java +++ b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGeneratorController.java @@ -1,3 +1,6 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + package com.example.novareel; import org.springframework.beans.factory.annotation.Autowired; From 12b7c551df190952317af84bdbe59962e840bab6 Mon Sep 17 00:00:00 2001 From: danil Date: Tue, 29 Apr 2025 15:15:32 -0700 Subject: [PATCH 4/6] adding snippet tags to add the example to the the AWS Code Libary (and the Bedrock Runtime Service Guide) --- .doc_gen/metadata/bedrock-runtime_metadata.yaml | 17 +++++++++++++++++ .../novareel/VideoGenerationService.java | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.doc_gen/metadata/bedrock-runtime_metadata.yaml b/.doc_gen/metadata/bedrock-runtime_metadata.yaml index 90df1b274af..9371bb70e1e 100644 --- a/.doc_gen/metadata/bedrock-runtime_metadata.yaml +++ b/.doc_gen/metadata/bedrock-runtime_metadata.yaml @@ -1648,3 +1648,20 @@ bedrock-runtime_Scenario_InvokeModels: - php.example_code.bedrock-runtime.basics.scenario services: bedrock-runtime: {InvokeModel, InvokeModelWithResponseStream} + +bedrock-runtime_Scenario_GenerateVideos_NovaReel: + title: Generate videos from text prompts using &BR; and Nova-Reel + title_abbrev: "Generate videos from text prompts using &BR;" + synopsis: a Spring Boot app that generates videos from text prompts using &BR; and the Nova-Reel model + category: Scenarios + languages: + Java: + versions: + - sdk_version: 2 + github: javav2/example_code/bedrock-runtime + excerpts: + - description: Generate videos from text prompts using &BR; and Nova-Reel + snippet_tags: + - bedrock-runtime.java2.NovaReel.VideoGeneration + services: + bedrock-runtime: {StartAsyncInvoke, GetAsyncInvoke} diff --git a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGenerationService.java b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGenerationService.java index 19fe8c790ec..b4e85d9603f 100644 --- a/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGenerationService.java +++ b/javav2/usecases/video_generation_bedrock_nova_reel/src/main/java/com/example/novareel/VideoGenerationService.java @@ -3,6 +3,7 @@ package com.example.novareel; +// snippet-start:[bedrock-runtime.java2.NovaReel.VideoGeneration] import org.springframework.stereotype.Service; import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider; import software.amazon.awssdk.core.document.Document; @@ -101,5 +102,5 @@ private static Document prepareDocument(String prompt) { .build(); return novaRequest; } - } +// snippet-end:[bedrock-runtime.java2.NovaReel.VideoGeneration] From 9b2840a9cfd45c1c1cf71736cef4ba465e29c128 Mon Sep 17 00:00:00 2001 From: Brian Murray <40031786+brmur@users.noreply.github.com> Date: Wed, 30 Apr 2025 13:48:14 +0100 Subject: [PATCH 5/6] add initial files --- .doc_gen/metadata/bedrock-runtime_metadata.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.doc_gen/metadata/bedrock-runtime_metadata.yaml b/.doc_gen/metadata/bedrock-runtime_metadata.yaml index 9371bb70e1e..8d0fac7ff85 100644 --- a/.doc_gen/metadata/bedrock-runtime_metadata.yaml +++ b/.doc_gen/metadata/bedrock-runtime_metadata.yaml @@ -1652,7 +1652,7 @@ bedrock-runtime_Scenario_InvokeModels: bedrock-runtime_Scenario_GenerateVideos_NovaReel: title: Generate videos from text prompts using &BR; and Nova-Reel title_abbrev: "Generate videos from text prompts using &BR;" - synopsis: a Spring Boot app that generates videos from text prompts using &BR; and the Nova-Reel model + synopsis: a Spring Boot app that generates videos from text prompts using &BR; and the Nova-Reel model. category: Scenarios languages: Java: @@ -1660,8 +1660,9 @@ bedrock-runtime_Scenario_GenerateVideos_NovaReel: - sdk_version: 2 github: javav2/example_code/bedrock-runtime excerpts: - - description: Generate videos from text prompts using &BR; and Nova-Reel + - description: Generate videos from text prompts using &BR; and Nova-Reel. snippet_tags: - bedrock-runtime.java2.NovaReel.VideoGeneration services: bedrock-runtime: {StartAsyncInvoke, GetAsyncInvoke} + From a4440fd10d309c862f811e0ac61995fd4d476369 Mon Sep 17 00:00:00 2001 From: Brian Murray <40031786+brmur@users.noreply.github.com> Date: Wed, 30 Apr 2025 13:54:48 +0100 Subject: [PATCH 6/6] update metadata formatting --- .doc_gen/metadata/bedrock-runtime_metadata.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.doc_gen/metadata/bedrock-runtime_metadata.yaml b/.doc_gen/metadata/bedrock-runtime_metadata.yaml index 8d0fac7ff85..6309f654bba 100644 --- a/.doc_gen/metadata/bedrock-runtime_metadata.yaml +++ b/.doc_gen/metadata/bedrock-runtime_metadata.yaml @@ -1665,4 +1665,3 @@ bedrock-runtime_Scenario_GenerateVideos_NovaReel: - bedrock-runtime.java2.NovaReel.VideoGeneration services: bedrock-runtime: {StartAsyncInvoke, GetAsyncInvoke} -