From 0ddfe8afa0e0c24cd912b2044a316a3e7ef7db29 Mon Sep 17 00:00:00 2001 From: YUTONG_ZHAI <32332316+zhaiyutong@users.noreply.github.com> Date: Wed, 29 Nov 2023 17:11:20 +0800 Subject: [PATCH] Add AACS GA JAVA SDK (#37626) * add date * remove empty sections for changelog * CodeGen from PR 26353 in Azure/azure-rest-api-specs Merge 22603c97054b46bc32729e274f459f0e6267824c into 89260be1a92c914b7b48af8e8f75938d5e76851d * update * update * revert * update * update * CodeGen from PR 26353 in Azure/azure-rest-api-specs Merge 570de777401fab039adb0a2a326ba51850028700 into 90a65cb3135d42438a381eb8bb5461a2b99b199f * update * update blobUri * update image * update * update * update * add * add * update * update * update * verify * update * update * add readme for samples * update * update * add more * remove * update names * update samples * update aad * update readme * update url * update product name * update readme * format * add * add * remove * update * update readme * update * update product name * update * update * update commit id * update * update url * update readme --------- Co-authored-by: SDKAuto --- eng/emitter-package.json | 2 +- eng/versioning/version_client.txt | 2 +- .../azure-ai-contentsafety/CHANGELOG.md | 31 +- .../azure-ai-contentsafety/README.md | 179 +- .../azure-ai-contentsafety/assets.json | 2 +- .../azure-ai-contentsafety/pom.xml | 6 +- .../contentsafety/BlocklistAsyncClient.java | 561 +++++ .../ai/contentsafety/BlocklistClient.java | 520 +++++ .../contentsafety/BlocklistClientBuilder.java | 346 +++ .../ContentSafetyAsyncClient.java | 651 +----- .../ai/contentsafety/ContentSafetyClient.java | 578 +---- .../ContentSafetyClientBuilder.java | 159 +- .../ContentSafetyServiceVersion.java | 18 +- .../implementation/BlocklistClientImpl.java | 1362 ++++++++++++ .../ContentSafetyClientImpl.java | 1858 ++--------------- .../implementation/package-info.java | 6 +- .../models/AddBlockItemsOptions.java | 43 - .../models/AddBlockItemsResult.java | 35 - .../AddOrUpdateTextBlocklistItemsOptions.java | 46 + .../AddOrUpdateTextBlocklistItemsResult.java | 46 + .../models/AnalyzeImageOptions.java | 56 +- .../models/AnalyzeImageOutputType.java | 53 + .../models/AnalyzeImageResult.java | 75 +- .../models/AnalyzeTextOptions.java | 77 +- .../models/AnalyzeTextOutputType.java | 59 + .../models/AnalyzeTextResult.java | 88 +- .../models/ContentSafetyImageData.java | 81 + ...sult.java => ImageCategoriesAnalysis.java} | 32 +- .../contentsafety/models/ImageCategory.java | 37 +- .../ai/contentsafety/models/ImageData.java | 80 - .../models/RemoveBlockItemsOptions.java | 43 - .../RemoveTextBlocklistItemsOptions.java | 45 + .../models/TextAnalyzeSeverityResult.java | 63 - .../contentsafety/models/TextBlockItem.java | 76 - .../contentsafety/models/TextBlocklist.java | 23 +- ...ckItemInfo.java => TextBlocklistItem.java} | 43 +- .../models/TextBlocklistMatch.java | 84 + .../models/TextBlocklistMatchResult.java | 123 -- .../models/TextCategoriesAnalysis.java | 65 + .../ai/contentsafety/models/TextCategory.java | 37 +- .../ai/contentsafety/models/package-info.java | 6 +- .../azure/ai/contentsafety/package-info.java | 6 +- .../src/main/java/module-info.java | 4 +- .../src/samples/README.md | 71 + .../azure/ai/contentsafety/AnalyzeImage.java | 19 +- .../azure/ai/contentsafety/AnalyzeText.java | 8 +- .../CreateContentSafetyClient.java | 27 + .../ai/contentsafety/ManageTextBlocklist.java | 73 +- .../src/samples/resources/image.jpg | Bin 25175 -> 0 bytes .../src/samples/resources/image.png | Bin 0 -> 346196 bytes .../contentsafety/AnalyzeImageAsyncTests.java | 112 + .../ai/contentsafety/AnalyzeImageTests.java | 110 +- .../contentsafety/AnalyzeTextAsyncTests.java | 139 ++ .../ai/contentsafety/AnalyzeTextTests.java | 137 +- .../ContentSafetyClientTestBase.java | 68 +- .../ManageTextBlocklistAsyncTests.java | 148 ++ .../ManageTextBlocklistTests.java | 59 +- .../ContentSafetyClientTestBase.java | 64 + .../azure-ai-contentsafety/tsp-location.yaml | 4 +- 59 files changed, 5057 insertions(+), 3689 deletions(-) create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/BlocklistAsyncClient.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/BlocklistClient.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/BlocklistClientBuilder.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/implementation/BlocklistClientImpl.java delete mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddBlockItemsOptions.java delete mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddBlockItemsResult.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddOrUpdateTextBlocklistItemsOptions.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddOrUpdateTextBlocklistItemsResult.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeImageOutputType.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeTextOutputType.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ContentSafetyImageData.java rename sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/{ImageAnalyzeSeverityResult.java => ImageCategoriesAnalysis.java} (51%) delete mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageData.java delete mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/RemoveBlockItemsOptions.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/RemoveTextBlocklistItemsOptions.java delete mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextAnalyzeSeverityResult.java delete mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlockItem.java rename sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/{TextBlockItemInfo.java => TextBlocklistItem.java} (52%) create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklistMatch.java delete mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklistMatchResult.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextCategoriesAnalysis.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/samples/README.md create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/CreateContentSafetyClient.java delete mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/samples/resources/image.jpg create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/samples/resources/image.png create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/AnalyzeImageAsyncTests.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/AnalyzeTextAsyncTests.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/ManageTextBlocklistAsyncTests.java create mode 100644 sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/generated/ContentSafetyClientTestBase.java diff --git a/eng/emitter-package.json b/eng/emitter-package.json index 055c21c0994c1..2af064b3679a0 100644 --- a/eng/emitter-package.json +++ b/eng/emitter-package.json @@ -3,4 +3,4 @@ "dependencies": { "@azure-tools/typespec-java": "0.11.2" } -} \ No newline at end of file +} diff --git a/eng/versioning/version_client.txt b/eng/versioning/version_client.txt index 5b1e73cadf0e8..dbd7c8a77da23 100644 --- a/eng/versioning/version_client.txt +++ b/eng/versioning/version_client.txt @@ -37,7 +37,7 @@ com.azure:azure-sdk-all;1.0.0;1.0.0 com.azure:azure-sdk-parent;1.6.0;1.6.0 com.azure:azure-client-sdk-parent;1.7.0;1.7.0 com.azure:azure-ai-anomalydetector;3.0.0-beta.5;3.0.0-beta.6 -com.azure:azure-ai-contentsafety;1.0.0-beta.1;1.0.0-beta.2 +com.azure:azure-ai-contentsafety;1.0.0-beta.1;1.0.0 com.azure:azure-ai-documentintelligence;1.0.0-beta.1;1.0.0-beta.2 com.azure:azure-ai-documenttranslator;1.0.0-beta.1;1.0.0-beta.2 com.azure:azure-ai-formrecognizer;4.1.3;4.2.0-beta.1 diff --git a/sdk/contentsafety/azure-ai-contentsafety/CHANGELOG.md b/sdk/contentsafety/azure-ai-contentsafety/CHANGELOG.md index d1e592dc74983..c0ba8cd6758a8 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/CHANGELOG.md +++ b/sdk/contentsafety/azure-ai-contentsafety/CHANGELOG.md @@ -1,15 +1,39 @@ # Release History -## 1.0.0-beta.2 (Unreleased) +## 1.0.0 (Unreleased) ### Features Added - +- Support AAD Authentication +- Support 8 severity level for AnalyzeText ### Breaking Changes +Contract change for AnalyzeText, AnalyzeImage, Blocklist management related methods +#### AnalyzeText +- AnalyzeTextOptions + - Renamed breakByBlocklists to haltOnBlocklistHit + - Add AnalyzeTextOutputType +- AnalyzeTextResult + - Renamed blocklistsMatchResults to blocklistsMatch + - Replaced TextAnalyzeSeverityResult by TextCategoriesAnalysis +#### AnalyzeImage +- AnalyzeImageOptions + - Replaced ImageData by ContentSafetyImageData + - Add AnalyzeImageOutputType +- AnalyzeImageResult + - Replaced ImageAnalyzeSeverityResult by ImageCategoriesAnalysis +#### Blocklist management +- Added BlocklistAsyncClient +- Renamed AddBlockItemsOptions to AddOrUpdateTextBlocklistItemsOptions +- Renamed AddBlockItemsResult to AddOrUpdateTextBlocklistItemsResult +- Renamed RemoveBlockItemsOptions to RemoveTextBlocklistItemsOptions +- Renamed TextBlockItemInfo to TextBlocklistItem ### Bugs Fixed ### Other Changes - +#### Dependency Updates +- Upgraded `azure-core` from `1.43.0` to version `1.45.0`. +- Upgraded `azure-core-http-netty` from `1.13.7` to version `1.13.10`. +- Upgraded `azure-identity` from `1.10.1` to version `1.11.0` ## 1.0.0-beta.1 (2023-09-28) - Azure AI ContentSafety client library for Java. This package contains Microsoft Azure ContentSafety client library. @@ -18,4 +42,3 @@ * Text Analysis API: Scans text for sexual content, violence, hate, and self harm with multi-severity levels. * Image Analysis API: Scans images for sexual content, violence, hate, and self harm with multi-severity levels. * Text Blocklist Management APIs: The default AI classifiers are sufficient for most content safety needs; however, you might need to screen for terms that are specific to your use case. You can create blocklists of terms to use with the Text API. - diff --git a/sdk/contentsafety/azure-ai-contentsafety/README.md b/sdk/contentsafety/azure-ai-contentsafety/README.md index d00981aee9460..06a313bcf9489 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/README.md +++ b/sdk/contentsafety/azure-ai-contentsafety/README.md @@ -18,7 +18,7 @@ Various documentation is available to help you get started ### Prerequisites - [Java Development Kit (JDK)][jdk] with version 8 or above -- You need an [Azure subscription][azure_sub] to use this package. +- You need an [Azure subscription][azure_subscription] to use this package. - An existing [Azure AI Content Safety][contentsafety_overview] instance. ### Adding the package to your product @@ -28,7 +28,7 @@ Various documentation is available to help you get started com.azure azure-ai-contentsafety - 1.0.0-beta.1 + 1.0.0 ``` [//]: # ({x-version-update-end}) @@ -50,53 +50,97 @@ The API key can be found in the [Azure Portal][azure_portal] or by running the f ```bash az cognitiveservices account keys list --name "" --resource-group "" ``` + #### Create a ContentSafetyClient with KeyCredential -```java com.azure.ai.contentsafety.createClient +```java com.azure.ai.contentsafety.createcontentsafetyclient String endpoint = Configuration.getGlobalConfiguration().get("CONTENT_SAFETY_ENDPOINT"); String key = Configuration.getGlobalConfiguration().get("CONTENT_SAFETY_KEY"); - ContentSafetyClient contentSafetyClient = new ContentSafetyClientBuilder() .credential(new KeyCredential(key)) .endpoint(endpoint).buildClient(); ``` +#### Create a ContentSafetyClient with Microsoft Entra ID (formerly Azure Active Directory (AAD)) token credential +- Step 1: Enable AAD for your resource + Please refer to this Cognitive Services authentication document [Authenticate with Microsoft Entra ID.][authenticate_with_microsoft_entra_id] for the steps to enable AAD for your resource. + + The main steps are: + - Create resource with a custom subdomain. + - Create Service Principal and assign Cognitive Services User role to it. + +- Step 2: Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: `AZURE_CLIENT_ID`, `AZURE_TENANT_ID`, `AZURE_CLIENT_SECRET`. + +After setup, you can choose which type of [credential](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/identity/azure-identity#examples) to use. +As an example, [DefaultAzureCredential](https://github.com/Azure/azure-sdk-for-java/tree/main/sdk/identity/azure-identity#authenticate-with-defaultazurecredential) +can be used to authenticate the client. + +DefaultAzureCredential will use the values from these environment variables. +```java com.azure.ai.contentsafety.createcontentsafetyclienttoken +ContentSafetyClient contentSafetyClientOauth = new ContentSafetyClientBuilder() + .credential(new DefaultAzureCredentialBuilder().build()) + .endpoint(endpoint).buildClient(); +``` + + +#### Create a BlocklistClient with KeyCredential +```java com.azure.ai.contentsafety.createblocklistclient +String endpoint = Configuration.getGlobalConfiguration().get("CONTENT_SAFETY_ENDPOINT"); +String key = Configuration.getGlobalConfiguration().get("CONTENT_SAFETY_KEY"); + +BlocklistClient blocklistClient = new BlocklistClientBuilder() + .credential(new KeyCredential(key)) + .endpoint(endpoint).buildClient(); +``` + ## Key concepts -### Harm categories +### Available features +There are different types of analysis available from this service. The following table describes the currently available APIs. + +|Feature |Description | +|---------|---------| +|Text Analysis API|Scans text for sexual content, violence, hate, and self harm with multi-severity levels.| +|Image Analysis API|Scans images for sexual content, violence, hate, and self harm with multi-severity levels.| +| Text Blocklist Management APIs|The default AI classifiers are sufficient for most content safety needs. However, you might need to screen for terms that are specific to your use case. You can create blocklists of terms to use with the Text API.| +### Harm categories Content Safety recognizes four distinct categories of objectionable content. -|Category |Description | +|Category|Description| |---------|---------| -|Hate |Hate refers to any content that attacks or uses pejorative or discriminatory language in reference to a person or identity group based on certain differentiating attributes of that group. This includes but is not limited to race, ethnicity, nationality, gender identity and expression, sexual orientation, religion, immigration status, ability status, personal appearance, and body size.| -|Sexual |Sexual describes content related to anatomical organs and genitals, romantic relationships, acts portrayed in erotic or affectionate terms, pregnancy, physical sexual acts—including those acts portrayed as an assault or a forced sexual violent act against one’s will—, prostitution, pornography, and abuse.| -|Violence |Violence describes content related to physical actions intended to hurt, injure, damage, or kill someone or something. It also includes weapons, guns and related entities, such as manufacturers, associations, legislation, and similar.| -|Self-harm |Self-harm describes content related to physical actions intended to purposely hurt, injure, or damage one’s body or kill oneself.| +|Hate |Hate and fairness-related harms refer to any content that attacks or uses pejorative or discriminatory language with reference to a person or identity group based on certain differentiating attributes of these groups including but not limited to race, ethnicity, nationality, gender identity and expression, sexual orientation, religion, immigration status, ability status, personal appearance, and body size.| +|Sexual |Sexual describes language related to anatomical organs and genitals, romantic relationships, acts portrayed in erotic or affectionate terms, pregnancy, physical sexual acts, including those portrayed as an assault or a forced sexual violent act against one's will, prostitution, pornography, and abuse.| +|Violence |Violence describes language related to physical actions intended to hurt, injure, damage, or kill someone or something; describes weapons, guns and related entities, such as manufactures, associations, legislation, and so on.| +|Self-harm |Self-harm describes language related to physical actions intended to purposely hurt, injure, damage one's body or kill oneself.| Classification can be multi-labeled. For example, when a text sample goes through the text moderation model, it could be classified as both Sexual content and Violence. ### Severity levels - Every harm category the service applies also comes with a severity level rating. The severity level is meant to indicate the severity of the consequences of showing the flagged content. -|Severity |Label | -|---------|---------| -|0 |Safe| -|2 |Low| -|4 |Medium| -|6 |High| +**Text**: The current version of the text model supports the full 0-7 severity scale. The classifier detects amongst all severities along this scale. If the user specifies, it can return severities in the trimmed scale of 0, 2, 4, and 6; each two adjacent levels are mapped to a single level. You can refer [text content severity levels definitions][text_severity_levels] for details. -### Text blocklist management +- [0,1] -> 0 +- [2,3] -> 2 +- [4,5] -> 4 +- [6,7] -> 6 -Following operations are supported to manage your text blocklist: +**Image**: The current version of the image model supports the trimmed version of the full 0-7 severity scale. The classifier only returns severities 0, 2, 4, and 6; each two adjacent levels are mapped to a single level. You can refer [image content severity levels definitions][image_severity_levels] for details. -* Create or modify a blocklist -* List all blocklists -* Get a blocklist by blocklistName -* Add blockItems to a blocklist -* Remove blockItems from a blocklist -* List all blockItems in a blocklist by blocklistName -* Get a blockItem in a blocklist by blockItemId and blocklistName -* Delete a blocklist and all of its blockItems +- [0,1] -> 0 +- [2,3] -> 2 +- [4,5] -> 4 +- [6,7] -> 6 + +### Text blocklist management +Following operations are supported to manage your text blocklist: +- Create or modify a blocklist +- List all blocklists +- Get a blocklist by blocklistName +- Add blockItems to a blocklist +- Remove blockItems from a blocklist +- List all blockItems in a blocklist by blocklistName +- Get a blockItem in a blocklist by blockItemId and blocklistName +- Delete a blocklist and all of its blockItems You can set the blocklists you want to use when analyze text, then you can get blocklist match result from returned response. @@ -119,18 +163,20 @@ ContentSafetyClient contentSafetyClient = new ContentSafetyClientBuilder() AnalyzeTextResult response = contentSafetyClient.analyzeText(new AnalyzeTextOptions("This is text example")); -System.out.println("Hate severity: " + response.getHateResult().getSeverity()); -System.out.println("SelfHarm severity: " + response.getSelfHarmResult().getSeverity()); -System.out.println("Sexual severity: " + response.getSexualResult().getSeverity()); -System.out.println("Violence severity: " + response.getViolenceResult().getSeverity()); +for (TextCategoriesAnalysis result : response.getCategoriesAnalysis()) { + System.out.println(result.getCategory() + " severity: " + result.getSeverity()); +} ``` #### Analyze text with blocklists ```java com.azure.ai.contentsafety.analyzetextwithblocklist // After you edit your blocklist, it usually takes effect in 5 minutes, please wait some time before analyzing with blocklist after editing. +ContentSafetyClient contentSafetyClient = new ContentSafetyClientBuilder() + .credential(new KeyCredential(key)) + .endpoint(endpoint).buildClient(); AnalyzeTextOptions request = new AnalyzeTextOptions("I h*te you and I want to k*ll you"); -request.getBlocklistNames().add(blocklistName); -request.setBreakByBlocklists(true); +request.setBlocklistNames(Arrays.asList(blocklistName)); +request.setHaltOnBlocklistHit(true); AnalyzeTextResult analyzeTextResult; try { @@ -140,11 +186,10 @@ try { throw ex; } -if (analyzeTextResult.getBlocklistsMatchResults() != null) { +if (analyzeTextResult.getBlocklistsMatch() != null) { System.out.println("\nBlocklist match result:"); - for (TextBlocklistMatchResult matchResult : analyzeTextResult.getBlocklistsMatchResults()) { - System.out.println("Blockitem was hit in text: Offset: " + matchResult.getOffset() + ", Length: " + matchResult.getLength()); - System.out.println("BlocklistName: " + matchResult.getBlocklistName() + ", BlockItemId: " + matchResult.getBlockItemId() + ", BlockItemText: " + matchResult.getBlockItemText()); + for (TextBlocklistMatch matchResult : analyzeTextResult.getBlocklistsMatch()) { + System.out.println("BlocklistName: " + matchResult.getBlocklistName() + ", BlockItemId: " + matchResult.getBlocklistItemId() + ", BlockItemText: " + matchResult.getBlocklistItemText()); } } ``` @@ -158,18 +203,17 @@ ContentSafetyClient contentSafetyClient = new ContentSafetyClientBuilder() .credential(new KeyCredential(key)) .endpoint(endpoint).buildClient(); -ImageData image = new ImageData(); +ContentSafetyImageData image = new ContentSafetyImageData(); String cwd = System.getProperty("user.dir"); -String source = "/src/samples/resources/image.jpg"; -image.setContent(Files.readAllBytes(Paths.get(cwd, source))); +String source = "/src/samples/resources/image.png"; +image.setContent(BinaryData.fromBytes(Files.readAllBytes(Paths.get(cwd, source)))); AnalyzeImageResult response = - contentSafetyClient.analyzeImage(new AnalyzeImageOptions(image)); + contentSafetyClient.analyzeImage(new AnalyzeImageOptions(image)); -System.out.println("Hate severity: " + response.getHateResult().getSeverity()); -System.out.println("SelfHarm severity: " + response.getSelfHarmResult().getSeverity()); -System.out.println("Sexual severity: " + response.getSexualResult().getSeverity()); -System.out.println("Violence severity: " + response.getViolenceResult().getSeverity()); +for (ImageCategoriesAnalysis result : response.getCategoriesAnalysis()) { + System.out.println(result.getCategory() + " severity: " + result.getSeverity()); +} ``` ### Manage text blocklist @@ -182,7 +226,7 @@ description.put("description", "Test Blocklist"); BinaryData resource = BinaryData.fromObject(description); RequestOptions requestOptions = new RequestOptions(); Response response = - contentSafetyClient.createOrUpdateTextBlocklistWithResponse(blocklistName, resource, requestOptions); + blocklistClient.createOrUpdateTextBlocklistWithResponse(blocklistName, resource, requestOptions); if (response.getStatusCode() == 201) { System.out.println("\nBlocklist " + blocklistName + " created."); } else if (response.getStatusCode() == 200) { @@ -193,57 +237,58 @@ if (response.getStatusCode() == 201) { ```java com.azure.ai.contentsafety.addblockitems String blockItemText1 = "k*ll"; String blockItemText2 = "h*te"; -List blockItems = Arrays.asList(new TextBlockItemInfo(blockItemText1).setDescription("Kill word"), - new TextBlockItemInfo(blockItemText2).setDescription("Hate word")); -AddBlockItemsResult addedBlockItems = contentSafetyClient.addBlockItems(blocklistName, new AddBlockItemsOptions(blockItems)); -if (addedBlockItems != null && addedBlockItems.getValue() != null) { +List blockItems = Arrays.asList(new TextBlocklistItem(blockItemText1).setDescription("Kill word"), + new TextBlocklistItem(blockItemText2).setDescription("Hate word")); +AddOrUpdateTextBlocklistItemsResult addedBlockItems = blocklistClient.addOrUpdateBlocklistItems(blocklistName, + new AddOrUpdateTextBlocklistItemsOptions(blockItems)); +if (addedBlockItems != null && addedBlockItems.getBlocklistItems() != null) { System.out.println("\nBlockItems added:"); - for (TextBlockItem addedBlockItem : addedBlockItems.getValue()) { - System.out.println("BlockItemId: " + addedBlockItem.getBlockItemId() + ", Text: " + addedBlockItem.getText() + ", Description: " + addedBlockItem.getDescription()); + for (TextBlocklistItem addedBlockItem : addedBlockItems.getBlocklistItems()) { + System.out.println("BlockItemId: " + addedBlockItem.getBlocklistItemId() + ", Text: " + addedBlockItem.getText() + ", Description: " + addedBlockItem.getDescription()); } } ``` #### List text blocklists ```java com.azure.ai.contentsafety.listtextblocklists -PagedIterable allTextBlocklists = contentSafetyClient.listTextBlocklists(); +PagedIterable allTextBlocklists = blocklistClient.listTextBlocklists(); System.out.println("\nList Blocklist:"); for (TextBlocklist blocklist : allTextBlocklists) { - System.out.println("Blocklist: " + blocklist.getBlocklistName() + ", Description: " + blocklist.getDescription()); + System.out.println("Blocklist: " + blocklist.getName() + ", Description: " + blocklist.getDescription()); } ``` #### Get text blocklist ```java com.azure.ai.contentsafety.gettextblocklist -TextBlocklist getBlocklist = contentSafetyClient.getTextBlocklist(blocklistName); +TextBlocklist getBlocklist = blocklistClient.getTextBlocklist(blocklistName); if (getBlocklist != null) { System.out.println("\nGet blocklist:"); - System.out.println("BlocklistName: " + getBlocklist.getBlocklistName() + ", Description: " + getBlocklist.getDescription()); + System.out.println("BlocklistName: " + getBlocklist.getName() + ", Description: " + getBlocklist.getDescription()); } ``` #### List blockItems ``` java com.azure.ai.contentsafety.listtextblocklistitems -PagedIterable allBlockitems = contentSafetyClient.listTextBlocklistItems(blocklistName); +PagedIterable allBlockitems = blocklistClient.listTextBlocklistItems(blocklistName); System.out.println("\nList BlockItems:"); -for (TextBlockItem blocklistItem : allBlockitems) { - System.out.println("BlockItemId: " + blocklistItem.getBlockItemId() + ", Text: " + blocklistItem.getText() + ", Description: " + blocklistItem.getDescription()); +for (TextBlocklistItem blocklistItem : allBlockitems) { + System.out.println("BlockItemId: " + blocklistItem.getBlocklistItemId() + ", Text: " + blocklistItem.getText() + ", Description: " + blocklistItem.getDescription()); } ``` #### Get blockItem ```java com.azure.ai.contentsafety.gettextblocklistitem -String getBlockItemId = addedBlockItems.getValue().get(0).getBlockItemId(); -TextBlockItem getBlockItem = contentSafetyClient.getTextBlocklistItem(blocklistName, getBlockItemId); +String getBlockItemId = addedBlockItems.getBlocklistItems().get(0).getBlocklistItemId(); +TextBlocklistItem getBlockItem = blocklistClient.getTextBlocklistItem(blocklistName, getBlockItemId); System.out.println("\nGet BlockItem:"); -System.out.println("BlockItemId: " + getBlockItem.getBlockItemId() + ", Text: " + getBlockItem.getText() + ", Description: " + getBlockItem.getDescription()); +System.out.println("BlockItemId: " + getBlockItem.getBlocklistItemId() + ", Text: " + getBlockItem.getText() + ", Description: " + getBlockItem.getDescription()); ``` #### Remove blockItems ```java com.azure.ai.contentsafety.removeblockitems -String removeBlockItemId = addedBlockItems.getValue().get(0).getBlockItemId(); +String removeBlockItemId = addedBlockItems.getBlocklistItems().get(0).getBlocklistItemId(); List removeBlockItemIds = new ArrayList<>(); removeBlockItemIds.add(removeBlockItemId); -contentSafetyClient.removeBlockItems(blocklistName, new RemoveBlockItemsOptions(removeBlockItemIds)); +blocklistClient.removeBlocklistItems(blocklistName, new RemoveTextBlocklistItemsOptions(removeBlockItemIds)); ``` #### Delete text blocklist ```java com.azure.ai.contentsafety.deletetextblocklist -contentSafetyClient.deleteTextBlocklist(blocklistName); +blocklistClient.deleteTextBlocklist(blocklistName); ``` ## Troubleshooting ### General @@ -284,5 +329,7 @@ For details on contributing to this repository, see the [contributing guide](htt [azure_portal]: https://ms.portal.azure.com/ [azure_cli_endpoint_lookup]: https://docs.microsoft.com/cli/azure/cognitiveservices/account?view=azure-cli-latest#az-cognitiveservices-account-show [azure_cli_key_lookup]: https://docs.microsoft.com/cli/azure/cognitiveservices/account/keys?view=azure-cli-latest#az-cognitiveservices-account-keys-list - +[authenticate_with_microsoft_entra_id]: https://learn.microsoft.com/azure/ai-services/authentication?tabs=powershell#authenticate-with-microsoft-entra-id +[text_severity_levels]: https://learn.microsoft.com/azure/ai-services/content-safety/concepts/harm-categories?tabs=definitions#text-content +[image_severity_levels]: https://learn.microsoft.com/azure/ai-services/content-safety/concepts/harm-categories?tabs=definitions#image-content ![Impressions](https://azure-sdk-impressions.azurewebsites.net/api/impressions/azure-sdk-for-java%2Fsdk%2Fcontentsafety%2Fazure-ai-contentsafety%2FREADME.png) diff --git a/sdk/contentsafety/azure-ai-contentsafety/assets.json b/sdk/contentsafety/azure-ai-contentsafety/assets.json index c0de92f7d8b6d..3a3f1bef639bb 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/assets.json +++ b/sdk/contentsafety/azure-ai-contentsafety/assets.json @@ -2,5 +2,5 @@ "AssetsRepo" : "Azure/azure-sdk-assets", "AssetsRepoPrefixPath" : "java", "TagPrefix" : "java/contentsafety/azure-ai-contentsafety", - "Tag" : "java/contentsafety/azure-ai-contentsafety_10dc4f5dac" + "Tag" : "java/contentsafety/azure-ai-contentsafety_b28078ece6" } diff --git a/sdk/contentsafety/azure-ai-contentsafety/pom.xml b/sdk/contentsafety/azure-ai-contentsafety/pom.xml index 148c92d08c206..1204b46538dca 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/pom.xml +++ b/sdk/contentsafety/azure-ai-contentsafety/pom.xml @@ -14,7 +14,7 @@ com.azure azure-ai-contentsafety - 1.0.0-beta.2 + 1.0.0 jar Microsoft Azure SDK for ContentSafety @@ -43,7 +43,8 @@ UTF-8 - true + 0.4 + 0.3 @@ -93,4 +94,5 @@ test + diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/BlocklistAsyncClient.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/BlocklistAsyncClient.java new file mode 100644 index 0000000000000..9715d66b3aa7c --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/BlocklistAsyncClient.java @@ -0,0 +1,561 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.contentsafety; + +import com.azure.ai.contentsafety.implementation.BlocklistClientImpl; +import com.azure.ai.contentsafety.models.AddOrUpdateTextBlocklistItemsOptions; +import com.azure.ai.contentsafety.models.AddOrUpdateTextBlocklistItemsResult; +import com.azure.ai.contentsafety.models.RemoveTextBlocklistItemsOptions; +import com.azure.ai.contentsafety.models.TextBlocklist; +import com.azure.ai.contentsafety.models.TextBlocklistItem; +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.ReturnType; +import com.azure.core.annotation.ServiceClient; +import com.azure.core.annotation.ServiceMethod; +import com.azure.core.exception.ClientAuthenticationException; +import com.azure.core.exception.HttpResponseException; +import com.azure.core.exception.ResourceModifiedException; +import com.azure.core.exception.ResourceNotFoundException; +import com.azure.core.http.rest.PagedFlux; +import com.azure.core.http.rest.PagedResponse; +import com.azure.core.http.rest.PagedResponseBase; +import com.azure.core.http.rest.RequestOptions; +import com.azure.core.http.rest.Response; +import com.azure.core.util.BinaryData; +import com.azure.core.util.FluxUtil; +import java.util.stream.Collectors; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +/** + * Initializes a new instance of the asynchronous BlocklistClient type. + */ +@ServiceClient(builder = BlocklistClientBuilder.class, isAsync = true) +public final class BlocklistAsyncClient { + + @Generated + private final BlocklistClientImpl serviceClient; + + /** + * Initializes an instance of BlocklistAsyncClient class. + * + * @param serviceClient the service client implementation. + */ + @Generated + BlocklistAsyncClient(BlocklistClientImpl serviceClient) { + this.serviceClient = serviceClient; + } + + /** + * Add or update BlocklistItems To Text Blocklist + * + * Add or update blocklistItems to a text blocklist. You can add or update at most 100 blocklistItems in one + * request. + *

+ * Request Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItems (Required): [
+     *          (Required){
+     *             blocklistItemId: String (Required)
+     *             description: String (Optional)
+     *             text: String (Required)
+     *         }
+     *     ]
+     * }
+     * }
+ *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItems (Required): [
+     *          (Required){
+     *             blocklistItemId: String (Required)
+     *             description: String (Optional)
+     *             text: String (Required)
+     *         }
+     *     ]
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param options Options for adding or updating blocklist items. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the response of adding blocklistItems to the text blocklist along with {@link Response} on successful + * completion of {@link Mono}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> addOrUpdateBlocklistItemsWithResponse(String name, BinaryData options, + RequestOptions requestOptions) { + return this.serviceClient.addOrUpdateBlocklistItemsWithResponseAsync(name, options, requestOptions); + } + + /** + * Create Or Update Text Blocklist + * + * Updates a text blocklist. If the blocklistName does not exist, a new blocklist will be created. + *

+ * Request Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param options The resource instance. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return text Blocklist along with {@link Response} on successful completion of {@link Mono}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> createOrUpdateTextBlocklistWithResponse(String name, BinaryData options, + RequestOptions requestOptions) { + // Convenience API is not generated, as operation 'createOrUpdateTextBlocklist' is + // 'application/merge-patch+json' + return this.serviceClient.createOrUpdateTextBlocklistWithResponseAsync(name, options, requestOptions); + } + + /** + * Delete Text Blocklist By blocklistName + * + * Deletes a text blocklist. + * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the {@link Response} on successful completion of {@link Mono}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> deleteTextBlocklistWithResponse(String name, RequestOptions requestOptions) { + return this.serviceClient.deleteTextBlocklistWithResponseAsync(name, requestOptions); + } + + /** + * Get Text Blocklist By blocklistName + * + * Returns text blocklist details. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return text Blocklist along with {@link Response} on successful completion of {@link Mono}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> getTextBlocklistWithResponse(String name, RequestOptions requestOptions) { + return this.serviceClient.getTextBlocklistWithResponseAsync(name, requestOptions); + } + + /** + * Get BlocklistItem By blocklistName And blocklistItemId + * + * Get blocklistItem by blocklistName and blocklistItemId from a text blocklist. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemId: String (Required)
+     *     description: String (Optional)
+     *     text: String (Required)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param blocklistItemId The service will generate a BlocklistItemId, which will be a UUID. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return blocklistItem by blocklistName and blocklistItemId from a text blocklist along with {@link Response} on + * successful completion of {@link Mono}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> getTextBlocklistItemWithResponse(String name, String blocklistItemId, + RequestOptions requestOptions) { + return this.serviceClient.getTextBlocklistItemWithResponseAsync(name, blocklistItemId, requestOptions); + } + + /** + * Get All BlocklistItems By blocklistName + * + * Get all blocklistItems in a text blocklist. + *

+ * Query Parameters + *

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Query Parameters
NameTypeRequiredDescription
topIntegerNoThe number of result items to return.
skipIntegerNoThe number of result items to skip.
maxpagesizeIntegerNoThe maximum number of result items per page.
+ * You can add these to a request with {@link RequestOptions#addQueryParam} + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemId: String (Required)
+     *     description: String (Optional)
+     *     text: String (Required)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return all blocklistItems in a text blocklist as paginated response with {@link PagedFlux}. + */ + @Generated + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedFlux listTextBlocklistItems(String name, RequestOptions requestOptions) { + return this.serviceClient.listTextBlocklistItemsAsync(name, requestOptions); + } + + /** + * Get All Text Blocklists + * + * Get all text blocklists details. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return all text blocklists details as paginated response with {@link PagedFlux}. + */ + @Generated + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedFlux listTextBlocklists(RequestOptions requestOptions) { + return this.serviceClient.listTextBlocklistsAsync(requestOptions); + } + + /** + * Remove BlocklistItems From Text Blocklist + * + * Remove blocklistItems from a text blocklist. You can remove at most 100 BlocklistItems in one request. + *

+ * Request Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemIds (Required): [
+     *         String (Required)
+     *     ]
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param options Options for removing blocklist items. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the {@link Response} on successful completion of {@link Mono}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> removeBlocklistItemsWithResponse(String name, BinaryData options, + RequestOptions requestOptions) { + return this.serviceClient.removeBlocklistItemsWithResponseAsync(name, options, requestOptions); + } + + /** + * Add or update BlocklistItems To Text Blocklist + * + * Add or update blocklistItems to a text blocklist. You can add or update at most 100 blocklistItems in one + * request. + * + * @param name Text blocklist name. + * @param options Options for adding or updating blocklist items. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return the response of adding blocklistItems to the text blocklist on successful completion of {@link Mono}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono addOrUpdateBlocklistItems(String name, + AddOrUpdateTextBlocklistItemsOptions options) { + // Generated convenience method for addOrUpdateBlocklistItemsWithResponse + RequestOptions requestOptions = new RequestOptions(); + return addOrUpdateBlocklistItemsWithResponse(name, BinaryData.fromObject(options), requestOptions) + .flatMap(FluxUtil::toMono) + .map(protocolMethodData -> protocolMethodData.toObject(AddOrUpdateTextBlocklistItemsResult.class)); + } + + /** + * Delete Text Blocklist By blocklistName + * + * Deletes a text blocklist. + * + * @param name Text blocklist name. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return A {@link Mono} that completes when a successful response is received. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono deleteTextBlocklist(String name) { + // Generated convenience method for deleteTextBlocklistWithResponse + RequestOptions requestOptions = new RequestOptions(); + return deleteTextBlocklistWithResponse(name, requestOptions).flatMap(FluxUtil::toMono); + } + + /** + * Get Text Blocklist By blocklistName + * + * Returns text blocklist details. + * + * @param name Text blocklist name. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return text Blocklist on successful completion of {@link Mono}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono getTextBlocklist(String name) { + // Generated convenience method for getTextBlocklistWithResponse + RequestOptions requestOptions = new RequestOptions(); + return getTextBlocklistWithResponse(name, requestOptions).flatMap(FluxUtil::toMono) + .map(protocolMethodData -> protocolMethodData.toObject(TextBlocklist.class)); + } + + /** + * Get BlocklistItem By blocklistName And blocklistItemId + * + * Get blocklistItem by blocklistName and blocklistItemId from a text blocklist. + * + * @param name Text blocklist name. + * @param blocklistItemId The service will generate a BlocklistItemId, which will be a UUID. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return blocklistItem by blocklistName and blocklistItemId from a text blocklist on successful completion of + * {@link Mono}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono getTextBlocklistItem(String name, String blocklistItemId) { + // Generated convenience method for getTextBlocklistItemWithResponse + RequestOptions requestOptions = new RequestOptions(); + return getTextBlocklistItemWithResponse(name, blocklistItemId, requestOptions).flatMap(FluxUtil::toMono) + .map(protocolMethodData -> protocolMethodData.toObject(TextBlocklistItem.class)); + } + + /** + * Get All BlocklistItems By blocklistName + * + * Get all blocklistItems in a text blocklist. + * + * @param name Text blocklist name. + * @param top The number of result items to return. + * @param skip The number of result items to skip. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return all blocklistItems in a text blocklist as paginated response with {@link PagedFlux}. + */ + @Generated + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedFlux listTextBlocklistItems(String name, Integer top, Integer skip) { + // Generated convenience method for listTextBlocklistItems + RequestOptions requestOptions = new RequestOptions(); + if (top != null) { + requestOptions.addQueryParam("top", String.valueOf(top), false); + } + if (skip != null) { + requestOptions.addQueryParam("skip", String.valueOf(skip), false); + } + PagedFlux pagedFluxResponse = listTextBlocklistItems(name, requestOptions); + return PagedFlux.create(() -> (continuationToken, pageSize) -> { + Flux> flux = (continuationToken == null) ? pagedFluxResponse.byPage().take(1) + : pagedFluxResponse.byPage(continuationToken).take(1); + return flux.map(pagedResponse -> new PagedResponseBase(pagedResponse.getRequest(), + pagedResponse.getStatusCode(), pagedResponse.getHeaders(), + pagedResponse.getValue().stream() + .map(protocolMethodData -> protocolMethodData.toObject(TextBlocklistItem.class)) + .collect(Collectors.toList()), + pagedResponse.getContinuationToken(), null)); + }); + } + + /** + * Get All BlocklistItems By blocklistName + * + * Get all blocklistItems in a text blocklist. + * + * @param name Text blocklist name. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return all blocklistItems in a text blocklist as paginated response with {@link PagedFlux}. + */ + @Generated + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedFlux listTextBlocklistItems(String name) { + // Generated convenience method for listTextBlocklistItems + RequestOptions requestOptions = new RequestOptions(); + PagedFlux pagedFluxResponse = listTextBlocklistItems(name, requestOptions); + return PagedFlux.create(() -> (continuationToken, pageSize) -> { + Flux> flux = (continuationToken == null) ? pagedFluxResponse.byPage().take(1) + : pagedFluxResponse.byPage(continuationToken).take(1); + return flux.map(pagedResponse -> new PagedResponseBase(pagedResponse.getRequest(), + pagedResponse.getStatusCode(), pagedResponse.getHeaders(), + pagedResponse.getValue().stream() + .map(protocolMethodData -> protocolMethodData.toObject(TextBlocklistItem.class)) + .collect(Collectors.toList()), + pagedResponse.getContinuationToken(), null)); + }); + } + + /** + * Get All Text Blocklists + * + * Get all text blocklists details. + * + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return all text blocklists details as paginated response with {@link PagedFlux}. + */ + @Generated + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedFlux listTextBlocklists() { + // Generated convenience method for listTextBlocklists + RequestOptions requestOptions = new RequestOptions(); + PagedFlux pagedFluxResponse = listTextBlocklists(requestOptions); + return PagedFlux.create(() -> (continuationToken, pageSize) -> { + Flux> flux = (continuationToken == null) ? pagedFluxResponse.byPage().take(1) + : pagedFluxResponse.byPage(continuationToken).take(1); + return flux.map(pagedResponse -> new PagedResponseBase(pagedResponse.getRequest(), + pagedResponse.getStatusCode(), pagedResponse.getHeaders(), + pagedResponse.getValue().stream() + .map(protocolMethodData -> protocolMethodData.toObject(TextBlocklist.class)) + .collect(Collectors.toList()), + pagedResponse.getContinuationToken(), null)); + }); + } + + /** + * Remove BlocklistItems From Text Blocklist + * + * Remove blocklistItems from a text blocklist. You can remove at most 100 BlocklistItems in one request. + * + * @param name Text blocklist name. + * @param options Options for removing blocklist items. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return A {@link Mono} that completes when a successful response is received. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono removeBlocklistItems(String name, RemoveTextBlocklistItemsOptions options) { + // Generated convenience method for removeBlocklistItemsWithResponse + RequestOptions requestOptions = new RequestOptions(); + return removeBlocklistItemsWithResponse(name, BinaryData.fromObject(options), requestOptions) + .flatMap(FluxUtil::toMono); + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/BlocklistClient.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/BlocklistClient.java new file mode 100644 index 0000000000000..552d942caafba --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/BlocklistClient.java @@ -0,0 +1,520 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.contentsafety; + +import com.azure.ai.contentsafety.implementation.BlocklistClientImpl; +import com.azure.ai.contentsafety.models.AddOrUpdateTextBlocklistItemsOptions; +import com.azure.ai.contentsafety.models.AddOrUpdateTextBlocklistItemsResult; +import com.azure.ai.contentsafety.models.RemoveTextBlocklistItemsOptions; +import com.azure.ai.contentsafety.models.TextBlocklist; +import com.azure.ai.contentsafety.models.TextBlocklistItem; +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.ReturnType; +import com.azure.core.annotation.ServiceClient; +import com.azure.core.annotation.ServiceMethod; +import com.azure.core.exception.ClientAuthenticationException; +import com.azure.core.exception.HttpResponseException; +import com.azure.core.exception.ResourceModifiedException; +import com.azure.core.exception.ResourceNotFoundException; +import com.azure.core.http.rest.PagedIterable; +import com.azure.core.http.rest.RequestOptions; +import com.azure.core.http.rest.Response; +import com.azure.core.util.BinaryData; + +/** + * Initializes a new instance of the synchronous BlocklistClient type. + */ +@ServiceClient(builder = BlocklistClientBuilder.class) +public final class BlocklistClient { + + @Generated + private final BlocklistClientImpl serviceClient; + + /** + * Initializes an instance of BlocklistClient class. + * + * @param serviceClient the service client implementation. + */ + @Generated + BlocklistClient(BlocklistClientImpl serviceClient) { + this.serviceClient = serviceClient; + } + + /** + * Add or update BlocklistItems To Text Blocklist + * + * Add or update blocklistItems to a text blocklist. You can add or update at most 100 blocklistItems in one + * request. + *

+ * Request Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItems (Required): [
+     *          (Required){
+     *             blocklistItemId: String (Required)
+     *             description: String (Optional)
+     *             text: String (Required)
+     *         }
+     *     ]
+     * }
+     * }
+ *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItems (Required): [
+     *          (Required){
+     *             blocklistItemId: String (Required)
+     *             description: String (Optional)
+     *             text: String (Required)
+     *         }
+     *     ]
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param options Options for adding or updating blocklist items. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the response of adding blocklistItems to the text blocklist along with {@link Response}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Response addOrUpdateBlocklistItemsWithResponse(String name, BinaryData options, + RequestOptions requestOptions) { + return this.serviceClient.addOrUpdateBlocklistItemsWithResponse(name, options, requestOptions); + } + + /** + * Create Or Update Text Blocklist + * + * Updates a text blocklist. If the blocklistName does not exist, a new blocklist will be created. + *

+ * Request Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param options The resource instance. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return text Blocklist along with {@link Response}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Response createOrUpdateTextBlocklistWithResponse(String name, BinaryData options, + RequestOptions requestOptions) { + // Convenience API is not generated, as operation 'createOrUpdateTextBlocklist' is + // 'application/merge-patch+json' + return this.serviceClient.createOrUpdateTextBlocklistWithResponse(name, options, requestOptions); + } + + /** + * Delete Text Blocklist By blocklistName + * + * Deletes a text blocklist. + * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the {@link Response}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Response deleteTextBlocklistWithResponse(String name, RequestOptions requestOptions) { + return this.serviceClient.deleteTextBlocklistWithResponse(name, requestOptions); + } + + /** + * Get Text Blocklist By blocklistName + * + * Returns text blocklist details. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return text Blocklist along with {@link Response}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Response getTextBlocklistWithResponse(String name, RequestOptions requestOptions) { + return this.serviceClient.getTextBlocklistWithResponse(name, requestOptions); + } + + /** + * Get BlocklistItem By blocklistName And blocklistItemId + * + * Get blocklistItem by blocklistName and blocklistItemId from a text blocklist. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemId: String (Required)
+     *     description: String (Optional)
+     *     text: String (Required)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param blocklistItemId The service will generate a BlocklistItemId, which will be a UUID. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return blocklistItem by blocklistName and blocklistItemId from a text blocklist along with {@link Response}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Response getTextBlocklistItemWithResponse(String name, String blocklistItemId, + RequestOptions requestOptions) { + return this.serviceClient.getTextBlocklistItemWithResponse(name, blocklistItemId, requestOptions); + } + + /** + * Get All BlocklistItems By blocklistName + * + * Get all blocklistItems in a text blocklist. + *

+ * Query Parameters + *

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Query Parameters
NameTypeRequiredDescription
topIntegerNoThe number of result items to return.
skipIntegerNoThe number of result items to skip.
maxpagesizeIntegerNoThe maximum number of result items per page.
+ * You can add these to a request with {@link RequestOptions#addQueryParam} + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemId: String (Required)
+     *     description: String (Optional)
+     *     text: String (Required)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return all blocklistItems in a text blocklist as paginated response with {@link PagedIterable}. + */ + @Generated + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedIterable listTextBlocklistItems(String name, RequestOptions requestOptions) { + return this.serviceClient.listTextBlocklistItems(name, requestOptions); + } + + /** + * Get All Text Blocklists + * + * Get all text blocklists details. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return all text blocklists details as paginated response with {@link PagedIterable}. + */ + @Generated + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedIterable listTextBlocklists(RequestOptions requestOptions) { + return this.serviceClient.listTextBlocklists(requestOptions); + } + + /** + * Remove BlocklistItems From Text Blocklist + * + * Remove blocklistItems from a text blocklist. You can remove at most 100 BlocklistItems in one request. + *

+ * Request Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemIds (Required): [
+     *         String (Required)
+     *     ]
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param options Options for removing blocklist items. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the {@link Response}. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public Response removeBlocklistItemsWithResponse(String name, BinaryData options, + RequestOptions requestOptions) { + return this.serviceClient.removeBlocklistItemsWithResponse(name, options, requestOptions); + } + + /** + * Add or update BlocklistItems To Text Blocklist + * + * Add or update blocklistItems to a text blocklist. You can add or update at most 100 blocklistItems in one + * request. + * + * @param name Text blocklist name. + * @param options Options for adding or updating blocklist items. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return the response of adding blocklistItems to the text blocklist. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public AddOrUpdateTextBlocklistItemsResult addOrUpdateBlocklistItems(String name, + AddOrUpdateTextBlocklistItemsOptions options) { + // Generated convenience method for addOrUpdateBlocklistItemsWithResponse + RequestOptions requestOptions = new RequestOptions(); + return addOrUpdateBlocklistItemsWithResponse(name, BinaryData.fromObject(options), requestOptions).getValue() + .toObject(AddOrUpdateTextBlocklistItemsResult.class); + } + + /** + * Delete Text Blocklist By blocklistName + * + * Deletes a text blocklist. + * + * @param name Text blocklist name. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public void deleteTextBlocklist(String name) { + // Generated convenience method for deleteTextBlocklistWithResponse + RequestOptions requestOptions = new RequestOptions(); + deleteTextBlocklistWithResponse(name, requestOptions).getValue(); + } + + /** + * Get Text Blocklist By blocklistName + * + * Returns text blocklist details. + * + * @param name Text blocklist name. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return text Blocklist. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public TextBlocklist getTextBlocklist(String name) { + // Generated convenience method for getTextBlocklistWithResponse + RequestOptions requestOptions = new RequestOptions(); + return getTextBlocklistWithResponse(name, requestOptions).getValue().toObject(TextBlocklist.class); + } + + /** + * Get BlocklistItem By blocklistName And blocklistItemId + * + * Get blocklistItem by blocklistName and blocklistItemId from a text blocklist. + * + * @param name Text blocklist name. + * @param blocklistItemId The service will generate a BlocklistItemId, which will be a UUID. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return blocklistItem by blocklistName and blocklistItemId from a text blocklist. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public TextBlocklistItem getTextBlocklistItem(String name, String blocklistItemId) { + // Generated convenience method for getTextBlocklistItemWithResponse + RequestOptions requestOptions = new RequestOptions(); + return getTextBlocklistItemWithResponse(name, blocklistItemId, requestOptions).getValue() + .toObject(TextBlocklistItem.class); + } + + /** + * Get All BlocklistItems By blocklistName + * + * Get all blocklistItems in a text blocklist. + * + * @param name Text blocklist name. + * @param top The number of result items to return. + * @param skip The number of result items to skip. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return all blocklistItems in a text blocklist as paginated response with {@link PagedIterable}. + */ + @Generated + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedIterable listTextBlocklistItems(String name, Integer top, Integer skip) { + // Generated convenience method for listTextBlocklistItems + RequestOptions requestOptions = new RequestOptions(); + if (top != null) { + requestOptions.addQueryParam("top", String.valueOf(top), false); + } + if (skip != null) { + requestOptions.addQueryParam("skip", String.valueOf(skip), false); + } + return serviceClient.listTextBlocklistItems(name, requestOptions) + .mapPage(bodyItemValue -> bodyItemValue.toObject(TextBlocklistItem.class)); + } + + /** + * Get All BlocklistItems By blocklistName + * + * Get all blocklistItems in a text blocklist. + * + * @param name Text blocklist name. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return all blocklistItems in a text blocklist as paginated response with {@link PagedIterable}. + */ + @Generated + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedIterable listTextBlocklistItems(String name) { + // Generated convenience method for listTextBlocklistItems + RequestOptions requestOptions = new RequestOptions(); + return serviceClient.listTextBlocklistItems(name, requestOptions) + .mapPage(bodyItemValue -> bodyItemValue.toObject(TextBlocklistItem.class)); + } + + /** + * Get All Text Blocklists + * + * Get all text blocklists details. + * + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return all text blocklists details as paginated response with {@link PagedIterable}. + */ + @Generated + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedIterable listTextBlocklists() { + // Generated convenience method for listTextBlocklists + RequestOptions requestOptions = new RequestOptions(); + return serviceClient.listTextBlocklists(requestOptions) + .mapPage(bodyItemValue -> bodyItemValue.toObject(TextBlocklist.class)); + } + + /** + * Remove BlocklistItems From Text Blocklist + * + * Remove blocklistItems from a text blocklist. You can remove at most 100 BlocklistItems in one request. + * + * @param name Text blocklist name. + * @param options Options for removing blocklist items. + * @throws IllegalArgumentException thrown if parameters fail the validation. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + */ + @Generated + @ServiceMethod(returns = ReturnType.SINGLE) + public void removeBlocklistItems(String name, RemoveTextBlocklistItemsOptions options) { + // Generated convenience method for removeBlocklistItemsWithResponse + RequestOptions requestOptions = new RequestOptions(); + removeBlocklistItemsWithResponse(name, BinaryData.fromObject(options), requestOptions).getValue(); + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/BlocklistClientBuilder.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/BlocklistClientBuilder.java new file mode 100644 index 0000000000000..e54e01262bb10 --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/BlocklistClientBuilder.java @@ -0,0 +1,346 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.contentsafety; + +import com.azure.ai.contentsafety.implementation.BlocklistClientImpl; +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.ServiceClientBuilder; +import com.azure.core.client.traits.ConfigurationTrait; +import com.azure.core.client.traits.EndpointTrait; +import com.azure.core.client.traits.HttpTrait; +import com.azure.core.client.traits.KeyCredentialTrait; +import com.azure.core.client.traits.TokenCredentialTrait; +import com.azure.core.credential.KeyCredential; +import com.azure.core.credential.TokenCredential; +import com.azure.core.http.HttpClient; +import com.azure.core.http.HttpHeaderName; +import com.azure.core.http.HttpHeaders; +import com.azure.core.http.HttpPipeline; +import com.azure.core.http.HttpPipelineBuilder; +import com.azure.core.http.HttpPipelinePosition; +import com.azure.core.http.policy.AddDatePolicy; +import com.azure.core.http.policy.AddHeadersFromContextPolicy; +import com.azure.core.http.policy.AddHeadersPolicy; +import com.azure.core.http.policy.BearerTokenAuthenticationPolicy; +import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.http.policy.HttpLoggingPolicy; +import com.azure.core.http.policy.HttpPipelinePolicy; +import com.azure.core.http.policy.HttpPolicyProviders; +import com.azure.core.http.policy.KeyCredentialPolicy; +import com.azure.core.http.policy.RequestIdPolicy; +import com.azure.core.http.policy.RetryOptions; +import com.azure.core.http.policy.RetryPolicy; +import com.azure.core.http.policy.UserAgentPolicy; +import com.azure.core.util.ClientOptions; +import com.azure.core.util.Configuration; +import com.azure.core.util.CoreUtils; +import com.azure.core.util.builder.ClientBuilderUtil; +import com.azure.core.util.logging.ClientLogger; +import com.azure.core.util.serializer.JacksonAdapter; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * A builder for creating a new instance of the BlocklistClient type. + */ +@ServiceClientBuilder(serviceClients = { BlocklistClient.class, BlocklistAsyncClient.class }) +public final class BlocklistClientBuilder implements HttpTrait, + ConfigurationTrait, TokenCredentialTrait, + KeyCredentialTrait, EndpointTrait { + + @Generated + private static final String SDK_NAME = "name"; + + @Generated + private static final String SDK_VERSION = "version"; + + @Generated + private static final String[] DEFAULT_SCOPES = new String[] { "https://cognitiveservices.azure.com/.default" }; + + @Generated + private static final Map PROPERTIES = CoreUtils.getProperties("azure-ai-contentsafety.properties"); + + @Generated + private final List pipelinePolicies; + + /** + * Create an instance of the BlocklistClientBuilder. + */ + @Generated + public BlocklistClientBuilder() { + this.pipelinePolicies = new ArrayList<>(); + } + + /* + * The HTTP pipeline to send requests through. + */ + @Generated + private HttpPipeline pipeline; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public BlocklistClientBuilder pipeline(HttpPipeline pipeline) { + if (this.pipeline != null && pipeline == null) { + LOGGER.info("HttpPipeline is being set to 'null' when it was previously configured."); + } + this.pipeline = pipeline; + return this; + } + + /* + * The HTTP client used to send the request. + */ + @Generated + private HttpClient httpClient; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public BlocklistClientBuilder httpClient(HttpClient httpClient) { + this.httpClient = httpClient; + return this; + } + + /* + * The logging configuration for HTTP requests and responses. + */ + @Generated + private HttpLogOptions httpLogOptions; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public BlocklistClientBuilder httpLogOptions(HttpLogOptions httpLogOptions) { + this.httpLogOptions = httpLogOptions; + return this; + } + + /* + * The client options such as application ID and custom headers to set on a request. + */ + @Generated + private ClientOptions clientOptions; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public BlocklistClientBuilder clientOptions(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + return this; + } + + /* + * The retry options to configure retry policy for failed requests. + */ + @Generated + private RetryOptions retryOptions; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public BlocklistClientBuilder retryOptions(RetryOptions retryOptions) { + this.retryOptions = retryOptions; + return this; + } + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public BlocklistClientBuilder addPolicy(HttpPipelinePolicy customPolicy) { + Objects.requireNonNull(customPolicy, "'customPolicy' cannot be null."); + pipelinePolicies.add(customPolicy); + return this; + } + + /* + * The configuration store that is used during construction of the service client. + */ + @Generated + private Configuration configuration; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public BlocklistClientBuilder configuration(Configuration configuration) { + this.configuration = configuration; + return this; + } + + /* + * The TokenCredential used for authentication. + */ + @Generated + private TokenCredential tokenCredential; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public BlocklistClientBuilder credential(TokenCredential tokenCredential) { + this.tokenCredential = tokenCredential; + return this; + } + + /* + * The KeyCredential used for authentication. + */ + @Generated + private KeyCredential keyCredential; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public BlocklistClientBuilder credential(KeyCredential keyCredential) { + this.keyCredential = keyCredential; + return this; + } + + /* + * The service endpoint + */ + @Generated + private String endpoint; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public BlocklistClientBuilder endpoint(String endpoint) { + this.endpoint = endpoint; + return this; + } + + /* + * Service version + */ + @Generated + private ContentSafetyServiceVersion serviceVersion; + + /** + * Sets Service version. + * + * @param serviceVersion the serviceVersion value. + * @return the BlocklistClientBuilder. + */ + @Generated + public BlocklistClientBuilder serviceVersion(ContentSafetyServiceVersion serviceVersion) { + this.serviceVersion = serviceVersion; + return this; + } + + /* + * The retry policy that will attempt to retry failed requests, if applicable. + */ + @Generated + private RetryPolicy retryPolicy; + + /** + * Sets The retry policy that will attempt to retry failed requests, if applicable. + * + * @param retryPolicy the retryPolicy value. + * @return the BlocklistClientBuilder. + */ + @Generated + public BlocklistClientBuilder retryPolicy(RetryPolicy retryPolicy) { + this.retryPolicy = retryPolicy; + return this; + } + + /** + * Builds an instance of BlocklistClientImpl with the provided parameters. + * + * @return an instance of BlocklistClientImpl. + */ + @Generated + private BlocklistClientImpl buildInnerClient() { + HttpPipeline localPipeline = (pipeline != null) ? pipeline : createHttpPipeline(); + ContentSafetyServiceVersion localServiceVersion + = (serviceVersion != null) ? serviceVersion : ContentSafetyServiceVersion.getLatest(); + BlocklistClientImpl client = new BlocklistClientImpl(localPipeline, + JacksonAdapter.createDefaultSerializerAdapter(), this.endpoint, localServiceVersion); + return client; + } + + @Generated + private HttpPipeline createHttpPipeline() { + Configuration buildConfiguration + = (configuration == null) ? Configuration.getGlobalConfiguration() : configuration; + HttpLogOptions localHttpLogOptions = this.httpLogOptions == null ? new HttpLogOptions() : this.httpLogOptions; + ClientOptions localClientOptions = this.clientOptions == null ? new ClientOptions() : this.clientOptions; + List policies = new ArrayList<>(); + String clientName = PROPERTIES.getOrDefault(SDK_NAME, "UnknownName"); + String clientVersion = PROPERTIES.getOrDefault(SDK_VERSION, "UnknownVersion"); + String applicationId = CoreUtils.getApplicationId(localClientOptions, localHttpLogOptions); + policies.add(new UserAgentPolicy(applicationId, clientName, clientVersion, buildConfiguration)); + policies.add(new RequestIdPolicy()); + policies.add(new AddHeadersFromContextPolicy()); + HttpHeaders headers = new HttpHeaders(); + localClientOptions.getHeaders() + .forEach(header -> headers.set(HttpHeaderName.fromString(header.getName()), header.getValue())); + if (headers.getSize() > 0) { + policies.add(new AddHeadersPolicy(headers)); + } + this.pipelinePolicies.stream().filter(p -> p.getPipelinePosition() == HttpPipelinePosition.PER_CALL) + .forEach(p -> policies.add(p)); + HttpPolicyProviders.addBeforeRetryPolicies(policies); + policies.add(ClientBuilderUtil.validateAndGetRetryPolicy(retryPolicy, retryOptions, new RetryPolicy())); + policies.add(new AddDatePolicy()); + if (keyCredential != null) { + policies.add(new KeyCredentialPolicy("Ocp-Apim-Subscription-Key", keyCredential)); + } + if (tokenCredential != null) { + policies.add(new BearerTokenAuthenticationPolicy(tokenCredential, DEFAULT_SCOPES)); + } + this.pipelinePolicies.stream().filter(p -> p.getPipelinePosition() == HttpPipelinePosition.PER_RETRY) + .forEach(p -> policies.add(p)); + HttpPolicyProviders.addAfterRetryPolicies(policies); + policies.add(new HttpLoggingPolicy(httpLogOptions)); + HttpPipeline httpPipeline = new HttpPipelineBuilder().policies(policies.toArray(new HttpPipelinePolicy[0])) + .httpClient(httpClient).clientOptions(localClientOptions).build(); + return httpPipeline; + } + + /** + * Builds an instance of BlocklistAsyncClient class. + * + * @return an instance of BlocklistAsyncClient. + */ + @Generated + public BlocklistAsyncClient buildAsyncClient() { + return new BlocklistAsyncClient(buildInnerClient()); + } + + /** + * Builds an instance of BlocklistClient class. + * + * @return an instance of BlocklistClient. + */ + @Generated + public BlocklistClient buildClient() { + return new BlocklistClient(buildInnerClient()); + } + + private static final ClientLogger LOGGER = new ClientLogger(BlocklistClientBuilder.class); +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyAsyncClient.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyAsyncClient.java index f8d2ca6abb073..b689c8a0642ee 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyAsyncClient.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyAsyncClient.java @@ -1,19 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.contentsafety; import com.azure.ai.contentsafety.implementation.ContentSafetyClientImpl; -import com.azure.ai.contentsafety.models.AddBlockItemsOptions; -import com.azure.ai.contentsafety.models.AddBlockItemsResult; import com.azure.ai.contentsafety.models.AnalyzeImageOptions; import com.azure.ai.contentsafety.models.AnalyzeImageResult; import com.azure.ai.contentsafety.models.AnalyzeTextOptions; import com.azure.ai.contentsafety.models.AnalyzeTextResult; -import com.azure.ai.contentsafety.models.RemoveBlockItemsOptions; -import com.azure.ai.contentsafety.models.TextBlockItem; -import com.azure.ai.contentsafety.models.TextBlocklist; +import com.azure.ai.contentsafety.models.ContentSafetyImageData; import com.azure.core.annotation.Generated; import com.azure.core.annotation.ReturnType; import com.azure.core.annotation.ServiceClient; @@ -22,21 +17,20 @@ import com.azure.core.exception.HttpResponseException; import com.azure.core.exception.ResourceModifiedException; import com.azure.core.exception.ResourceNotFoundException; -import com.azure.core.http.rest.PagedFlux; -import com.azure.core.http.rest.PagedResponse; -import com.azure.core.http.rest.PagedResponseBase; import com.azure.core.http.rest.RequestOptions; import com.azure.core.http.rest.Response; import com.azure.core.util.BinaryData; import com.azure.core.util.FluxUtil; -import java.util.stream.Collectors; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -/** Initializes a new instance of the asynchronous ContentSafetyClient type. */ +/** + * Initializes a new instance of the asynchronous ContentSafetyClient type. + */ @ServiceClient(builder = ContentSafetyClientBuilder.class, isAsync = true) public final class ContentSafetyAsyncClient { - @Generated private final ContentSafetyClientImpl serviceClient; + + @Generated + private final ContentSafetyClientImpl serviceClient; /** * Initializes an instance of ContentSafetyAsyncClient class. @@ -51,11 +45,11 @@ public final class ContentSafetyAsyncClient { /** * Analyze Text * - *

A sync API for harmful content analysis for text. Currently, we support four categories: Hate, SelfHarm, - * Sexual, Violence. - * - *

Request Body Schema - * + * A synchronous API for the analysis of potentially harmful text content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. + *

+ * Request Body Schema + *

*
{@code
      * {
      *     text: String (Required)
@@ -65,55 +59,53 @@ public final class ContentSafetyAsyncClient {
      *     blocklistNames (Optional): [
      *         String (Optional)
      *     ]
-     *     breakByBlocklists: Boolean (Optional)
+     *     haltOnBlocklistHit: Boolean (Optional)
+     *     outputType: String(FourSeverityLevels/EightSeverityLevels) (Optional)
      * }
      * }
- * - *

Response Body Schema - * + *

+ * Response Body Schema + *

*
{@code
      * {
-     *     blocklistsMatchResults (Optional): [
+     *     blocklistsMatch (Optional): [
      *          (Optional){
      *             blocklistName: String (Required)
-     *             blockItemId: String (Required)
-     *             blockItemText: String (Required)
-     *             offset: int (Required)
-     *             length: int (Required)
+     *             blocklistItemId: String (Required)
+     *             blocklistItemText: String (Required)
+     *         }
+     *     ]
+     *     categoriesAnalysis (Required): [
+     *          (Required){
+     *             category: String(Hate/SelfHarm/Sexual/Violence) (Required)
+     *             severity: Integer (Optional)
      *         }
      *     ]
-     *     hateResult (Optional): {
-     *         category: String(Hate/SelfHarm/Sexual/Violence) (Required)
-     *         severity: int (Required)
-     *     }
-     *     selfHarmResult (Optional): (recursive schema, see selfHarmResult above)
-     *     sexualResult (Optional): (recursive schema, see sexualResult above)
-     *     violenceResult (Optional): (recursive schema, see violenceResult above)
      * }
      * }
* - * @param body The request of text analysis. + * @param options The text analysis request. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the analysis response of the text along with {@link Response} on successful completion of {@link Mono}. + * @return the text analysis response along with {@link Response} on successful completion of {@link Mono}. */ @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> analyzeTextWithResponse(BinaryData body, RequestOptions requestOptions) { - return this.serviceClient.analyzeTextWithResponseAsync(body, requestOptions); + public Mono> analyzeTextWithResponse(BinaryData options, RequestOptions requestOptions) { + return this.serviceClient.analyzeTextWithResponseAsync(options, requestOptions); } /** * Analyze Image * - *

A sync API for harmful content analysis for image. Currently, we support four categories: Hate, SelfHarm, - * Sexual, Violence. - * - *

Request Body Schema - * + * A synchronous API for the analysis of potentially harmful image content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. + *

+ * Request Body Schema + *

*
{@code
      * {
      *     image (Required): {
@@ -123,613 +115,148 @@ public Mono> analyzeTextWithResponse(BinaryData body, Reque
      *     categories (Optional): [
      *         String(Hate/SelfHarm/Sexual/Violence) (Optional)
      *     ]
+     *     outputType: String(FourSeverityLevels) (Optional)
      * }
      * }
- * - *

Response Body Schema - * + *

+ * Response Body Schema + *

*
{@code
      * {
-     *     hateResult (Optional): {
-     *         category: String(Hate/SelfHarm/Sexual/Violence) (Required)
-     *         severity: int (Required)
-     *     }
-     *     selfHarmResult (Optional): (recursive schema, see selfHarmResult above)
-     *     sexualResult (Optional): (recursive schema, see sexualResult above)
-     *     violenceResult (Optional): (recursive schema, see violenceResult above)
-     * }
-     * }
- * - * @param body The analysis request of the image. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the analysis response of the image along with {@link Response} on successful completion of {@link Mono}. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> analyzeImageWithResponse(BinaryData body, RequestOptions requestOptions) { - return this.serviceClient.analyzeImageWithResponseAsync(body, requestOptions); - } - - /** - * Get Text Blocklist By blocklistName - * - *

Returns text blocklist details. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return text Blocklist along with {@link Response} on successful completion of {@link Mono}. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> getTextBlocklistWithResponse( - String blocklistName, RequestOptions requestOptions) { - return this.serviceClient.getTextBlocklistWithResponseAsync(blocklistName, requestOptions); - } - - /** - * Create Or Update Text Blocklist - * - *

Updates a text blocklist, if blocklistName does not exist, create a new blocklist. - * - *

Request Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param resource The resource instance. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return text Blocklist along with {@link Response} on successful completion of {@link Mono}. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> createOrUpdateTextBlocklistWithResponse( - String blocklistName, BinaryData resource, RequestOptions requestOptions) { - // Convenience API is not generated, as operation 'createOrUpdateTextBlocklist' is - // 'application/merge-patch+json' - return this.serviceClient.createOrUpdateTextBlocklistWithResponseAsync(blocklistName, resource, requestOptions); - } - - /** - * Delete Text Blocklist By blocklistName - * - *

Deletes a text blocklist. - * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the {@link Response} on successful completion of {@link Mono}. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> deleteTextBlocklistWithResponse(String blocklistName, RequestOptions requestOptions) { - return this.serviceClient.deleteTextBlocklistWithResponseAsync(blocklistName, requestOptions); - } - - /** - * Get All Text Blocklists - * - *

Get all text blocklists details. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return all text blocklists details as paginated response with {@link PagedFlux}. - */ - @Generated - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedFlux listTextBlocklists(RequestOptions requestOptions) { - return this.serviceClient.listTextBlocklistsAsync(requestOptions); - } - - /** - * Add BlockItems To Text Blocklist - * - *

Add blockItems to a text blocklist. You can add at most 100 BlockItems in one request. - * - *

Request Body Schema - * - *

{@code
-     * {
-     *     blockItems (Required): [
+     *     categoriesAnalysis (Required): [
      *          (Required){
-     *             description: String (Optional)
-     *             text: String (Required)
+     *             category: String(Hate/SelfHarm/Sexual/Violence) (Required)
+     *             severity: Integer (Optional)
      *         }
      *     ]
      * }
      * }
* - *

Response Body Schema - * - *

{@code
-     * {
-     *     value (Optional): [
-     *          (Optional){
-     *             blockItemId: String (Required)
-     *             description: String (Optional)
-     *             text: String (Required)
-     *         }
-     *     ]
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param addBlockItemsOptions The request of adding blockItems to text blocklist. + * @param options The image analysis request. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the response of adding blockItems to text blocklist along with {@link Response} on successful completion - * of {@link Mono}. + * @return the image analysis response along with {@link Response} on successful completion of {@link Mono}. */ @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> addBlockItemsWithResponse( - String blocklistName, BinaryData addBlockItemsOptions, RequestOptions requestOptions) { - return this.serviceClient.addBlockItemsWithResponseAsync(blocklistName, addBlockItemsOptions, requestOptions); + public Mono> analyzeImageWithResponse(BinaryData options, RequestOptions requestOptions) { + return this.serviceClient.analyzeImageWithResponseAsync(options, requestOptions); } /** - * Remove BlockItems From Text Blocklist - * - *

Remove blockItems from a text blocklist. You can remove at most 100 BlockItems in one request. - * - *

Request Body Schema - * - *

{@code
-     * {
-     *     blockItemIds (Required): [
-     *         String (Required)
-     *     ]
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param removeBlockItemsOptions The request of removing blockItems from text blocklist. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the {@link Response} on successful completion of {@link Mono}. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> removeBlockItemsWithResponse( - String blocklistName, BinaryData removeBlockItemsOptions, RequestOptions requestOptions) { - return this.serviceClient.removeBlockItemsWithResponseAsync( - blocklistName, removeBlockItemsOptions, requestOptions); - } - - /** - * Get BlockItem By blocklistName And blockItemId - * - *

Get blockItem By blockItemId from a text blocklist. + * Analyze Text * - *

Response Body Schema + * A synchronous API for the analysis of potentially harmful text content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. * - *

{@code
-     * {
-     *     blockItemId: String (Required)
-     *     description: String (Optional)
-     *     text: String (Required)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param blockItemId Block Item Id. It will be uuid. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @param text The text analysis request. + * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return blockItem By blockItemId from a text blocklist along with {@link Response} on successful completion of - * {@link Mono}. + * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return the text analysis response on successful completion of {@link Mono}. */ - @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> getTextBlocklistItemWithResponse( - String blocklistName, String blockItemId, RequestOptions requestOptions) { - return this.serviceClient.getTextBlocklistItemWithResponseAsync(blocklistName, blockItemId, requestOptions); - } - - /** - * Get All BlockItems By blocklistName - * - *

Get all blockItems in a text blocklist. - * - *

Query Parameters - * - * - * - * - * - * - * - *
Query Parameters
NameTypeRequiredDescription
topIntegerNoThe number of result items to return.
skipIntegerNoThe number of result items to skip.
maxpagesizeIntegerNoThe maximum number of result items per page.
- * - * You can add these to a request with {@link RequestOptions#addQueryParam} - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blockItemId: String (Required)
-     *     description: String (Optional)
-     *     text: String (Required)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return all blockItems in a text blocklist as paginated response with {@link PagedFlux}. - */ - @Generated - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedFlux listTextBlocklistItems(String blocklistName, RequestOptions requestOptions) { - return this.serviceClient.listTextBlocklistItemsAsync(blocklistName, requestOptions); + public Mono analyzeText(String text) { + // Customized convenience method for analyzeText + AnalyzeTextOptions options = new AnalyzeTextOptions(text); + return analyzeText(options); } /** * Analyze Text * - *

A sync API for harmful content analysis for text. Currently, we support four categories: Hate, SelfHarm, - * Sexual, Violence. + * A synchronous API for the analysis of potentially harmful text content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. * - * @param body The request of text analysis. + * @param options The text analysis request. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return the analysis response of the text on successful completion of {@link Mono}. + * @return the text analysis response on successful completion of {@link Mono}. */ @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public Mono analyzeText(AnalyzeTextOptions body) { + public Mono analyzeText(AnalyzeTextOptions options) { // Generated convenience method for analyzeTextWithResponse RequestOptions requestOptions = new RequestOptions(); - return analyzeTextWithResponse(BinaryData.fromObject(body), requestOptions) - .flatMap(FluxUtil::toMono) - .map(protocolMethodData -> protocolMethodData.toObject(AnalyzeTextResult.class)); + return analyzeTextWithResponse(BinaryData.fromObject(options), requestOptions).flatMap(FluxUtil::toMono) + .map(protocolMethodData -> protocolMethodData.toObject(AnalyzeTextResult.class)); } /** * Analyze Image * - *

A sync API for harmful content analysis for image. Currently, we support four categories: Hate, SelfHarm, - * Sexual, Violence. + * A synchronous API for the analysis of potentially harmful image content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. * - * @param body The analysis request of the image. + * @param options The image analysis request. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return the analysis response of the image on successful completion of {@link Mono}. + * @return the image analysis response on successful completion of {@link Mono}. */ @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public Mono analyzeImage(AnalyzeImageOptions body) { + public Mono analyzeImage(AnalyzeImageOptions options) { // Generated convenience method for analyzeImageWithResponse RequestOptions requestOptions = new RequestOptions(); - return analyzeImageWithResponse(BinaryData.fromObject(body), requestOptions) - .flatMap(FluxUtil::toMono) - .map(protocolMethodData -> protocolMethodData.toObject(AnalyzeImageResult.class)); - } - - /** - * Get Text Blocklist By blocklistName - * - *

Returns text blocklist details. - * - * @param blocklistName Text blocklist name. - * @throws IllegalArgumentException thrown if parameters fail the validation. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return text Blocklist on successful completion of {@link Mono}. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono getTextBlocklist(String blocklistName) { - // Generated convenience method for getTextBlocklistWithResponse - RequestOptions requestOptions = new RequestOptions(); - return getTextBlocklistWithResponse(blocklistName, requestOptions) - .flatMap(FluxUtil::toMono) - .map(protocolMethodData -> protocolMethodData.toObject(TextBlocklist.class)); - } - - /** - * Delete Text Blocklist By blocklistName - * - *

Deletes a text blocklist. - * - * @param blocklistName Text blocklist name. - * @throws IllegalArgumentException thrown if parameters fail the validation. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return A {@link Mono} that completes when a successful response is received. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono deleteTextBlocklist(String blocklistName) { - // Generated convenience method for deleteTextBlocklistWithResponse - RequestOptions requestOptions = new RequestOptions(); - return deleteTextBlocklistWithResponse(blocklistName, requestOptions).flatMap(FluxUtil::toMono); - } - - /** - * Get All Text Blocklists - * - *

Get all text blocklists details. - * - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return all text blocklists details as paginated response with {@link PagedFlux}. - */ - @Generated - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedFlux listTextBlocklists() { - // Generated convenience method for listTextBlocklists - RequestOptions requestOptions = new RequestOptions(); - PagedFlux pagedFluxResponse = listTextBlocklists(requestOptions); - return PagedFlux.create( - () -> - (continuationToken, pageSize) -> { - Flux> flux = - (continuationToken == null) - ? pagedFluxResponse.byPage().take(1) - : pagedFluxResponse.byPage(continuationToken).take(1); - return flux.map( - pagedResponse -> - new PagedResponseBase( - pagedResponse.getRequest(), - pagedResponse.getStatusCode(), - pagedResponse.getHeaders(), - pagedResponse.getValue().stream() - .map( - protocolMethodData -> - protocolMethodData.toObject( - TextBlocklist.class)) - .collect(Collectors.toList()), - pagedResponse.getContinuationToken(), - null)); - }); + return analyzeImageWithResponse(BinaryData.fromObject(options), requestOptions).flatMap(FluxUtil::toMono) + .map(protocolMethodData -> protocolMethodData.toObject(AnalyzeImageResult.class)); } /** - * Add BlockItems To Text Blocklist - * - *

Add blockItems to a text blocklist. You can add at most 100 BlockItems in one request. - * - * @param blocklistName Text blocklist name. - * @param addBlockItemsOptions The request of adding blockItems to text blocklist. - * @throws IllegalArgumentException thrown if parameters fail the validation. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return the response of adding blockItems to text blocklist on successful completion of {@link Mono}. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono addBlockItems(String blocklistName, AddBlockItemsOptions addBlockItemsOptions) { - // Generated convenience method for addBlockItemsWithResponse - RequestOptions requestOptions = new RequestOptions(); - return addBlockItemsWithResponse(blocklistName, BinaryData.fromObject(addBlockItemsOptions), requestOptions) - .flatMap(FluxUtil::toMono) - .map(protocolMethodData -> protocolMethodData.toObject(AddBlockItemsResult.class)); - } - - /** - * Remove BlockItems From Text Blocklist + * Analyze Image * - *

Remove blockItems from a text blocklist. You can remove at most 100 BlockItems in one request. + * A synchronous API for the analysis of potentially harmful image content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. * - * @param blocklistName Text blocklist name. - * @param removeBlockItemsOptions The request of removing blockItems from text blocklist. + * @param blobUrl The image analysis request. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return A {@link Mono} that completes when a successful response is received. + * @return the image analysis response on successful completion of {@link Mono}. */ - @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public Mono removeBlockItems(String blocklistName, RemoveBlockItemsOptions removeBlockItemsOptions) { - // Generated convenience method for removeBlockItemsWithResponse - RequestOptions requestOptions = new RequestOptions(); - return removeBlockItemsWithResponse( - blocklistName, BinaryData.fromObject(removeBlockItemsOptions), requestOptions) - .flatMap(FluxUtil::toMono); + public Mono analyzeImage(String blobUrl) { + /// Customized convenience method for analyzeImage + AnalyzeImageOptions options = new AnalyzeImageOptions(new ContentSafetyImageData().setBlobUrl(blobUrl)); + return analyzeImage(options); } /** - * Get BlockItem By blocklistName And blockItemId + * Analyze Image * - *

Get blockItem By blockItemId from a text blocklist. + * A synchronous API for the analysis of potentially harmful image content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. * - * @param blocklistName Text blocklist name. - * @param blockItemId Block Item Id. It will be uuid. + * @param content The image analysis request. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return blockItem By blockItemId from a text blocklist on successful completion of {@link Mono}. + * @return the image analysis response on successful completion of {@link Mono}. */ - @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public Mono getTextBlocklistItem(String blocklistName, String blockItemId) { - // Generated convenience method for getTextBlocklistItemWithResponse - RequestOptions requestOptions = new RequestOptions(); - return getTextBlocklistItemWithResponse(blocklistName, blockItemId, requestOptions) - .flatMap(FluxUtil::toMono) - .map(protocolMethodData -> protocolMethodData.toObject(TextBlockItem.class)); - } - - /** - * Get All BlockItems By blocklistName - * - *

Get all blockItems in a text blocklist. - * - * @param blocklistName Text blocklist name. - * @param top The number of result items to return. - * @param skip The number of result items to skip. - * @throws IllegalArgumentException thrown if parameters fail the validation. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return all blockItems in a text blocklist as paginated response with {@link PagedFlux}. - */ - @Generated - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedFlux listTextBlocklistItems(String blocklistName, Integer top, Integer skip) { - // Generated convenience method for listTextBlocklistItems - RequestOptions requestOptions = new RequestOptions(); - if (top != null) { - requestOptions.addQueryParam("top", String.valueOf(top), false); - } - if (skip != null) { - requestOptions.addQueryParam("skip", String.valueOf(skip), false); - } - PagedFlux pagedFluxResponse = listTextBlocklistItems(blocklistName, requestOptions); - return PagedFlux.create( - () -> - (continuationToken, pageSize) -> { - Flux> flux = - (continuationToken == null) - ? pagedFluxResponse.byPage().take(1) - : pagedFluxResponse.byPage(continuationToken).take(1); - return flux.map( - pagedResponse -> - new PagedResponseBase( - pagedResponse.getRequest(), - pagedResponse.getStatusCode(), - pagedResponse.getHeaders(), - pagedResponse.getValue().stream() - .map( - protocolMethodData -> - protocolMethodData.toObject( - TextBlockItem.class)) - .collect(Collectors.toList()), - pagedResponse.getContinuationToken(), - null)); - }); - } - - /** - * Get All BlockItems By blocklistName - * - *

Get all blockItems in a text blocklist. - * - * @param blocklistName Text blocklist name. - * @throws IllegalArgumentException thrown if parameters fail the validation. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return all blockItems in a text blocklist as paginated response with {@link PagedFlux}. - */ - @Generated - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedFlux listTextBlocklistItems(String blocklistName) { - // Generated convenience method for listTextBlocklistItems - RequestOptions requestOptions = new RequestOptions(); - PagedFlux pagedFluxResponse = listTextBlocklistItems(blocklistName, requestOptions); - return PagedFlux.create( - () -> - (continuationToken, pageSize) -> { - Flux> flux = - (continuationToken == null) - ? pagedFluxResponse.byPage().take(1) - : pagedFluxResponse.byPage(continuationToken).take(1); - return flux.map( - pagedResponse -> - new PagedResponseBase( - pagedResponse.getRequest(), - pagedResponse.getStatusCode(), - pagedResponse.getHeaders(), - pagedResponse.getValue().stream() - .map( - protocolMethodData -> - protocolMethodData.toObject( - TextBlockItem.class)) - .collect(Collectors.toList()), - pagedResponse.getContinuationToken(), - null)); - }); + public Mono analyzeImage(BinaryData content) { + /// Customized convenience method for analyzeImage + AnalyzeImageOptions options = new AnalyzeImageOptions(new ContentSafetyImageData().setContent(content)); + return analyzeImage(options); } } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyClient.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyClient.java index 9b124aecf5977..bfde1c9964b60 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyClient.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyClient.java @@ -1,19 +1,14 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.contentsafety; import com.azure.ai.contentsafety.implementation.ContentSafetyClientImpl; -import com.azure.ai.contentsafety.models.AddBlockItemsOptions; -import com.azure.ai.contentsafety.models.AddBlockItemsResult; import com.azure.ai.contentsafety.models.AnalyzeImageOptions; import com.azure.ai.contentsafety.models.AnalyzeImageResult; import com.azure.ai.contentsafety.models.AnalyzeTextOptions; import com.azure.ai.contentsafety.models.AnalyzeTextResult; -import com.azure.ai.contentsafety.models.RemoveBlockItemsOptions; -import com.azure.ai.contentsafety.models.TextBlockItem; -import com.azure.ai.contentsafety.models.TextBlocklist; +import com.azure.ai.contentsafety.models.ContentSafetyImageData; import com.azure.core.annotation.Generated; import com.azure.core.annotation.ReturnType; import com.azure.core.annotation.ServiceClient; @@ -22,15 +17,18 @@ import com.azure.core.exception.HttpResponseException; import com.azure.core.exception.ResourceModifiedException; import com.azure.core.exception.ResourceNotFoundException; -import com.azure.core.http.rest.PagedIterable; import com.azure.core.http.rest.RequestOptions; import com.azure.core.http.rest.Response; import com.azure.core.util.BinaryData; -/** Initializes a new instance of the synchronous ContentSafetyClient type. */ +/** + * Initializes a new instance of the synchronous ContentSafetyClient type. + */ @ServiceClient(builder = ContentSafetyClientBuilder.class) public final class ContentSafetyClient { - @Generated private final ContentSafetyClientImpl serviceClient; + + @Generated + private final ContentSafetyClientImpl serviceClient; /** * Initializes an instance of ContentSafetyClient class. @@ -45,11 +43,11 @@ public final class ContentSafetyClient { /** * Analyze Text * - *

A sync API for harmful content analysis for text. Currently, we support four categories: Hate, SelfHarm, - * Sexual, Violence. - * - *

Request Body Schema - * + * A synchronous API for the analysis of potentially harmful text content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. + *

+ * Request Body Schema + *

*
{@code
      * {
      *     text: String (Required)
@@ -59,55 +57,53 @@ public final class ContentSafetyClient {
      *     blocklistNames (Optional): [
      *         String (Optional)
      *     ]
-     *     breakByBlocklists: Boolean (Optional)
+     *     haltOnBlocklistHit: Boolean (Optional)
+     *     outputType: String(FourSeverityLevels/EightSeverityLevels) (Optional)
      * }
      * }
- * - *

Response Body Schema - * + *

+ * Response Body Schema + *

*
{@code
      * {
-     *     blocklistsMatchResults (Optional): [
+     *     blocklistsMatch (Optional): [
      *          (Optional){
      *             blocklistName: String (Required)
-     *             blockItemId: String (Required)
-     *             blockItemText: String (Required)
-     *             offset: int (Required)
-     *             length: int (Required)
+     *             blocklistItemId: String (Required)
+     *             blocklistItemText: String (Required)
+     *         }
+     *     ]
+     *     categoriesAnalysis (Required): [
+     *          (Required){
+     *             category: String(Hate/SelfHarm/Sexual/Violence) (Required)
+     *             severity: Integer (Optional)
      *         }
      *     ]
-     *     hateResult (Optional): {
-     *         category: String(Hate/SelfHarm/Sexual/Violence) (Required)
-     *         severity: int (Required)
-     *     }
-     *     selfHarmResult (Optional): (recursive schema, see selfHarmResult above)
-     *     sexualResult (Optional): (recursive schema, see sexualResult above)
-     *     violenceResult (Optional): (recursive schema, see violenceResult above)
      * }
      * }
* - * @param body The request of text analysis. + * @param options The text analysis request. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the analysis response of the text along with {@link Response}. + * @return the text analysis response along with {@link Response}. */ @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public Response analyzeTextWithResponse(BinaryData body, RequestOptions requestOptions) { - return this.serviceClient.analyzeTextWithResponse(body, requestOptions); + public Response analyzeTextWithResponse(BinaryData options, RequestOptions requestOptions) { + return this.serviceClient.analyzeTextWithResponse(options, requestOptions); } /** * Analyze Image * - *

A sync API for harmful content analysis for image. Currently, we support four categories: Hate, SelfHarm, - * Sexual, Violence. - * - *

Request Body Schema - * + * A synchronous API for the analysis of potentially harmful image content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. + *

+ * Request Body Schema + *

*
{@code
      * {
      *     image (Required): {
@@ -117,544 +113,148 @@ public Response analyzeTextWithResponse(BinaryData body, RequestOpti
      *     categories (Optional): [
      *         String(Hate/SelfHarm/Sexual/Violence) (Optional)
      *     ]
+     *     outputType: String(FourSeverityLevels) (Optional)
      * }
      * }
- * - *

Response Body Schema - * + *

+ * Response Body Schema + *

*
{@code
      * {
-     *     hateResult (Optional): {
-     *         category: String(Hate/SelfHarm/Sexual/Violence) (Required)
-     *         severity: int (Required)
-     *     }
-     *     selfHarmResult (Optional): (recursive schema, see selfHarmResult above)
-     *     sexualResult (Optional): (recursive schema, see sexualResult above)
-     *     violenceResult (Optional): (recursive schema, see violenceResult above)
-     * }
-     * }
- * - * @param body The analysis request of the image. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the analysis response of the image along with {@link Response}. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Response analyzeImageWithResponse(BinaryData body, RequestOptions requestOptions) { - return this.serviceClient.analyzeImageWithResponse(body, requestOptions); - } - - /** - * Get Text Blocklist By blocklistName - * - *

Returns text blocklist details. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return text Blocklist along with {@link Response}. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Response getTextBlocklistWithResponse(String blocklistName, RequestOptions requestOptions) { - return this.serviceClient.getTextBlocklistWithResponse(blocklistName, requestOptions); - } - - /** - * Create Or Update Text Blocklist - * - *

Updates a text blocklist, if blocklistName does not exist, create a new blocklist. - * - *

Request Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param resource The resource instance. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return text Blocklist along with {@link Response}. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Response createOrUpdateTextBlocklistWithResponse( - String blocklistName, BinaryData resource, RequestOptions requestOptions) { - // Convenience API is not generated, as operation 'createOrUpdateTextBlocklist' is - // 'application/merge-patch+json' - return this.serviceClient.createOrUpdateTextBlocklistWithResponse(blocklistName, resource, requestOptions); - } - - /** - * Delete Text Blocklist By blocklistName - * - *

Deletes a text blocklist. - * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the {@link Response}. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Response deleteTextBlocklistWithResponse(String blocklistName, RequestOptions requestOptions) { - return this.serviceClient.deleteTextBlocklistWithResponse(blocklistName, requestOptions); - } - - /** - * Get All Text Blocklists - * - *

Get all text blocklists details. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return all text blocklists details as paginated response with {@link PagedIterable}. - */ - @Generated - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedIterable listTextBlocklists(RequestOptions requestOptions) { - return this.serviceClient.listTextBlocklists(requestOptions); - } - - /** - * Add BlockItems To Text Blocklist - * - *

Add blockItems to a text blocklist. You can add at most 100 BlockItems in one request. - * - *

Request Body Schema - * - *

{@code
-     * {
-     *     blockItems (Required): [
+     *     categoriesAnalysis (Required): [
      *          (Required){
-     *             description: String (Optional)
-     *             text: String (Required)
+     *             category: String(Hate/SelfHarm/Sexual/Violence) (Required)
+     *             severity: Integer (Optional)
      *         }
      *     ]
      * }
      * }
* - *

Response Body Schema - * - *

{@code
-     * {
-     *     value (Optional): [
-     *          (Optional){
-     *             blockItemId: String (Required)
-     *             description: String (Optional)
-     *             text: String (Required)
-     *         }
-     *     ]
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param addBlockItemsOptions The request of adding blockItems to text blocklist. + * @param options The image analysis request. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the response of adding blockItems to text blocklist along with {@link Response}. + * @return the image analysis response along with {@link Response}. */ @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public Response addBlockItemsWithResponse( - String blocklistName, BinaryData addBlockItemsOptions, RequestOptions requestOptions) { - return this.serviceClient.addBlockItemsWithResponse(blocklistName, addBlockItemsOptions, requestOptions); - } - - /** - * Remove BlockItems From Text Blocklist - * - *

Remove blockItems from a text blocklist. You can remove at most 100 BlockItems in one request. - * - *

Request Body Schema - * - *

{@code
-     * {
-     *     blockItemIds (Required): [
-     *         String (Required)
-     *     ]
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param removeBlockItemsOptions The request of removing blockItems from text blocklist. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the {@link Response}. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Response removeBlockItemsWithResponse( - String blocklistName, BinaryData removeBlockItemsOptions, RequestOptions requestOptions) { - return this.serviceClient.removeBlockItemsWithResponse(blocklistName, removeBlockItemsOptions, requestOptions); - } - - /** - * Get BlockItem By blocklistName And blockItemId - * - *

Get blockItem By blockItemId from a text blocklist. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blockItemId: String (Required)
-     *     description: String (Optional)
-     *     text: String (Required)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param blockItemId Block Item Id. It will be uuid. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return blockItem By blockItemId from a text blocklist along with {@link Response}. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public Response getTextBlocklistItemWithResponse( - String blocklistName, String blockItemId, RequestOptions requestOptions) { - return this.serviceClient.getTextBlocklistItemWithResponse(blocklistName, blockItemId, requestOptions); - } - - /** - * Get All BlockItems By blocklistName - * - *

Get all blockItems in a text blocklist. - * - *

Query Parameters - * - * - * - * - * - * - * - *
Query Parameters
NameTypeRequiredDescription
topIntegerNoThe number of result items to return.
skipIntegerNoThe number of result items to skip.
maxpagesizeIntegerNoThe maximum number of result items per page.
- * - * You can add these to a request with {@link RequestOptions#addQueryParam} - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blockItemId: String (Required)
-     *     description: String (Optional)
-     *     text: String (Required)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return all blockItems in a text blocklist as paginated response with {@link PagedIterable}. - */ - @Generated - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedIterable listTextBlocklistItems(String blocklistName, RequestOptions requestOptions) { - return this.serviceClient.listTextBlocklistItems(blocklistName, requestOptions); + public Response analyzeImageWithResponse(BinaryData options, RequestOptions requestOptions) { + return this.serviceClient.analyzeImageWithResponse(options, requestOptions); } /** * Analyze Text * - *

A sync API for harmful content analysis for text. Currently, we support four categories: Hate, SelfHarm, - * Sexual, Violence. + * A synchronous API for the analysis of potentially harmful text content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. * - * @param body The request of text analysis. + * @param options The text analysis request. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return the analysis response of the text. + * @return the text analysis response. */ @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public AnalyzeTextResult analyzeText(AnalyzeTextOptions body) { + public AnalyzeTextResult analyzeText(AnalyzeTextOptions options) { // Generated convenience method for analyzeTextWithResponse RequestOptions requestOptions = new RequestOptions(); - return analyzeTextWithResponse(BinaryData.fromObject(body), requestOptions) - .getValue() - .toObject(AnalyzeTextResult.class); - } - - /** - * Analyze Image - * - *

A sync API for harmful content analysis for image. Currently, we support four categories: Hate, SelfHarm, - * Sexual, Violence. - * - * @param body The analysis request of the image. - * @throws IllegalArgumentException thrown if parameters fail the validation. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return the analysis response of the image. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public AnalyzeImageResult analyzeImage(AnalyzeImageOptions body) { - // Generated convenience method for analyzeImageWithResponse - RequestOptions requestOptions = new RequestOptions(); - return analyzeImageWithResponse(BinaryData.fromObject(body), requestOptions) - .getValue() - .toObject(AnalyzeImageResult.class); - } - - /** - * Get Text Blocklist By blocklistName - * - *

Returns text blocklist details. - * - * @param blocklistName Text blocklist name. - * @throws IllegalArgumentException thrown if parameters fail the validation. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return text Blocklist. - */ - @Generated - @ServiceMethod(returns = ReturnType.SINGLE) - public TextBlocklist getTextBlocklist(String blocklistName) { - // Generated convenience method for getTextBlocklistWithResponse - RequestOptions requestOptions = new RequestOptions(); - return getTextBlocklistWithResponse(blocklistName, requestOptions).getValue().toObject(TextBlocklist.class); + return analyzeTextWithResponse(BinaryData.fromObject(options), requestOptions).getValue() + .toObject(AnalyzeTextResult.class); } /** - * Delete Text Blocklist By blocklistName + * Analyze Text * - *

Deletes a text blocklist. + * A synchronous API for the analysis of potentially harmful text content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. * - * @param blocklistName Text blocklist name. + * @param text The text analysis request. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return the text analysis response. */ - @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public void deleteTextBlocklist(String blocklistName) { - // Generated convenience method for deleteTextBlocklistWithResponse - RequestOptions requestOptions = new RequestOptions(); - deleteTextBlocklistWithResponse(blocklistName, requestOptions).getValue(); + public AnalyzeTextResult analyzeText(String text) { + // Customized convenience method for analyzeTextWithResponse + AnalyzeTextOptions options = new AnalyzeTextOptions(text); + return analyzeText(options); } /** - * Get All Text Blocklists - * - *

Get all text blocklists details. - * - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return all text blocklists details as paginated response with {@link PagedIterable}. - */ - @Generated - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedIterable listTextBlocklists() { - // Generated convenience method for listTextBlocklists - RequestOptions requestOptions = new RequestOptions(); - return serviceClient - .listTextBlocklists(requestOptions) - .mapPage(bodyItemValue -> bodyItemValue.toObject(TextBlocklist.class)); - } - - /** - * Add BlockItems To Text Blocklist + * Analyze Image * - *

Add blockItems to a text blocklist. You can add at most 100 BlockItems in one request. + * A synchronous API for the analysis of potentially harmful image content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. * - * @param blocklistName Text blocklist name. - * @param addBlockItemsOptions The request of adding blockItems to text blocklist. + * @param options The image analysis request. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return the response of adding blockItems to text blocklist. + * @return the image analysis response. */ @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public AddBlockItemsResult addBlockItems(String blocklistName, AddBlockItemsOptions addBlockItemsOptions) { - // Generated convenience method for addBlockItemsWithResponse + public AnalyzeImageResult analyzeImage(AnalyzeImageOptions options) { + // Generated convenience method for analyzeImageWithResponse RequestOptions requestOptions = new RequestOptions(); - return addBlockItemsWithResponse(blocklistName, BinaryData.fromObject(addBlockItemsOptions), requestOptions) - .getValue() - .toObject(AddBlockItemsResult.class); + return analyzeImageWithResponse(BinaryData.fromObject(options), requestOptions).getValue() + .toObject(AnalyzeImageResult.class); } /** - * Remove BlockItems From Text Blocklist + * Analyze Image * - *

Remove blockItems from a text blocklist. You can remove at most 100 BlockItems in one request. + * A synchronous API for the analysis of potentially harmful image content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. * - * @param blocklistName Text blocklist name. - * @param removeBlockItemsOptions The request of removing blockItems from text blocklist. + * @param blobUrl The image analysis request. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. + * @return the image analysis response. */ - @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public void removeBlockItems(String blocklistName, RemoveBlockItemsOptions removeBlockItemsOptions) { - // Generated convenience method for removeBlockItemsWithResponse - RequestOptions requestOptions = new RequestOptions(); - removeBlockItemsWithResponse(blocklistName, BinaryData.fromObject(removeBlockItemsOptions), requestOptions) - .getValue(); + public AnalyzeImageResult analyzeImage(String blobUrl) { + // Customized convenience method for analyzeImageWithResponse + AnalyzeImageOptions body = new AnalyzeImageOptions(new ContentSafetyImageData().setBlobUrl(blobUrl)); + return analyzeImage(body); } /** - * Get BlockItem By blocklistName And blockItemId + * Analyze Image * - *

Get blockItem By blockItemId from a text blocklist. + * A synchronous API for the analysis of potentially harmful image content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. * - * @param blocklistName Text blocklist name. - * @param blockItemId Block Item Id. It will be uuid. + * @param content The image analysis request. * @throws IllegalArgumentException thrown if parameters fail the validation. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return blockItem By blockItemId from a text blocklist. + * @return the image analysis response. */ - @Generated @ServiceMethod(returns = ReturnType.SINGLE) - public TextBlockItem getTextBlocklistItem(String blocklistName, String blockItemId) { - // Generated convenience method for getTextBlocklistItemWithResponse - RequestOptions requestOptions = new RequestOptions(); - return getTextBlocklistItemWithResponse(blocklistName, blockItemId, requestOptions) - .getValue() - .toObject(TextBlockItem.class); - } - - /** - * Get All BlockItems By blocklistName - * - *

Get all blockItems in a text blocklist. - * - * @param blocklistName Text blocklist name. - * @param top The number of result items to return. - * @param skip The number of result items to skip. - * @throws IllegalArgumentException thrown if parameters fail the validation. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return all blockItems in a text blocklist as paginated response with {@link PagedIterable}. - */ - @Generated - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedIterable listTextBlocklistItems(String blocklistName, Integer top, Integer skip) { - // Generated convenience method for listTextBlocklistItems - RequestOptions requestOptions = new RequestOptions(); - if (top != null) { - requestOptions.addQueryParam("top", String.valueOf(top), false); - } - if (skip != null) { - requestOptions.addQueryParam("skip", String.valueOf(skip), false); - } - return serviceClient - .listTextBlocklistItems(blocklistName, requestOptions) - .mapPage(bodyItemValue -> bodyItemValue.toObject(TextBlockItem.class)); - } - - /** - * Get All BlockItems By blocklistName - * - *

Get all blockItems in a text blocklist. - * - * @param blocklistName Text blocklist name. - * @throws IllegalArgumentException thrown if parameters fail the validation. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent. - * @return all blockItems in a text blocklist as paginated response with {@link PagedIterable}. - */ - @Generated - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedIterable listTextBlocklistItems(String blocklistName) { - // Generated convenience method for listTextBlocklistItems - RequestOptions requestOptions = new RequestOptions(); - return serviceClient - .listTextBlocklistItems(blocklistName, requestOptions) - .mapPage(bodyItemValue -> bodyItemValue.toObject(TextBlockItem.class)); + public AnalyzeImageResult analyzeImage(BinaryData content) { + // Customized convenience method for analyzeImageWithResponse + AnalyzeImageOptions body = new AnalyzeImageOptions(new ContentSafetyImageData().setContent(content)); + return analyzeImage(body); } } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyClientBuilder.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyClientBuilder.java index cd00472d7e55f..0dfc91c6f6272 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyClientBuilder.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyClientBuilder.java @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.contentsafety; import com.azure.ai.contentsafety.implementation.ContentSafetyClientImpl; @@ -11,7 +10,9 @@ import com.azure.core.client.traits.EndpointTrait; import com.azure.core.client.traits.HttpTrait; import com.azure.core.client.traits.KeyCredentialTrait; +import com.azure.core.client.traits.TokenCredentialTrait; import com.azure.core.credential.KeyCredential; +import com.azure.core.credential.TokenCredential; import com.azure.core.http.HttpClient; import com.azure.core.http.HttpHeaderName; import com.azure.core.http.HttpHeaders; @@ -21,6 +22,7 @@ import com.azure.core.http.policy.AddDatePolicy; import com.azure.core.http.policy.AddHeadersFromContextPolicy; import com.azure.core.http.policy.AddHeadersPolicy; +import com.azure.core.http.policy.BearerTokenAuthenticationPolicy; import com.azure.core.http.policy.HttpLogOptions; import com.azure.core.http.policy.HttpLoggingPolicy; import com.azure.core.http.policy.HttpPipelinePolicy; @@ -41,23 +43,32 @@ import java.util.Map; import java.util.Objects; -/** A builder for creating a new instance of the ContentSafetyClient type. */ -@ServiceClientBuilder(serviceClients = {ContentSafetyClient.class, ContentSafetyAsyncClient.class}) -public final class ContentSafetyClientBuilder - implements HttpTrait, - ConfigurationTrait, - KeyCredentialTrait, - EndpointTrait { - @Generated private static final String SDK_NAME = "name"; +/** + * A builder for creating a new instance of the ContentSafetyClient type. + */ +@ServiceClientBuilder(serviceClients = { ContentSafetyClient.class, ContentSafetyAsyncClient.class }) +public final class ContentSafetyClientBuilder implements HttpTrait, + ConfigurationTrait, TokenCredentialTrait, + KeyCredentialTrait, EndpointTrait { + + @Generated + private static final String SDK_NAME = "name"; - @Generated private static final String SDK_VERSION = "version"; + @Generated + private static final String SDK_VERSION = "version"; + + @Generated + private static final String[] DEFAULT_SCOPES = new String[] { "https://cognitiveservices.azure.com/.default" }; @Generated private static final Map PROPERTIES = CoreUtils.getProperties("azure-ai-contentsafety.properties"); - @Generated private final List pipelinePolicies; + @Generated + private final List pipelinePolicies; - /** Create an instance of the ContentSafetyClientBuilder. */ + /** + * Create an instance of the ContentSafetyClientBuilder. + */ @Generated public ContentSafetyClientBuilder() { this.pipelinePolicies = new ArrayList<>(); @@ -66,9 +77,12 @@ public ContentSafetyClientBuilder() { /* * The HTTP pipeline to send requests through. */ - @Generated private HttpPipeline pipeline; + @Generated + private HttpPipeline pipeline; - /** {@inheritDoc}. */ + /** + * {@inheritDoc}. + */ @Generated @Override public ContentSafetyClientBuilder pipeline(HttpPipeline pipeline) { @@ -82,9 +96,12 @@ public ContentSafetyClientBuilder pipeline(HttpPipeline pipeline) { /* * The HTTP client used to send the request. */ - @Generated private HttpClient httpClient; + @Generated + private HttpClient httpClient; - /** {@inheritDoc}. */ + /** + * {@inheritDoc}. + */ @Generated @Override public ContentSafetyClientBuilder httpClient(HttpClient httpClient) { @@ -95,9 +112,12 @@ public ContentSafetyClientBuilder httpClient(HttpClient httpClient) { /* * The logging configuration for HTTP requests and responses. */ - @Generated private HttpLogOptions httpLogOptions; + @Generated + private HttpLogOptions httpLogOptions; - /** {@inheritDoc}. */ + /** + * {@inheritDoc}. + */ @Generated @Override public ContentSafetyClientBuilder httpLogOptions(HttpLogOptions httpLogOptions) { @@ -108,9 +128,12 @@ public ContentSafetyClientBuilder httpLogOptions(HttpLogOptions httpLogOptions) /* * The client options such as application ID and custom headers to set on a request. */ - @Generated private ClientOptions clientOptions; + @Generated + private ClientOptions clientOptions; - /** {@inheritDoc}. */ + /** + * {@inheritDoc}. + */ @Generated @Override public ContentSafetyClientBuilder clientOptions(ClientOptions clientOptions) { @@ -121,9 +144,12 @@ public ContentSafetyClientBuilder clientOptions(ClientOptions clientOptions) { /* * The retry options to configure retry policy for failed requests. */ - @Generated private RetryOptions retryOptions; + @Generated + private RetryOptions retryOptions; - /** {@inheritDoc}. */ + /** + * {@inheritDoc}. + */ @Generated @Override public ContentSafetyClientBuilder retryOptions(RetryOptions retryOptions) { @@ -131,7 +157,9 @@ public ContentSafetyClientBuilder retryOptions(RetryOptions retryOptions) { return this; } - /** {@inheritDoc}. */ + /** + * {@inheritDoc}. + */ @Generated @Override public ContentSafetyClientBuilder addPolicy(HttpPipelinePolicy customPolicy) { @@ -143,9 +171,12 @@ public ContentSafetyClientBuilder addPolicy(HttpPipelinePolicy customPolicy) { /* * The configuration store that is used during construction of the service client. */ - @Generated private Configuration configuration; + @Generated + private Configuration configuration; - /** {@inheritDoc}. */ + /** + * {@inheritDoc}. + */ @Generated @Override public ContentSafetyClientBuilder configuration(Configuration configuration) { @@ -153,12 +184,31 @@ public ContentSafetyClientBuilder configuration(Configuration configuration) { return this; } + /* + * The TokenCredential used for authentication. + */ + @Generated + private TokenCredential tokenCredential; + + /** + * {@inheritDoc}. + */ + @Generated + @Override + public ContentSafetyClientBuilder credential(TokenCredential tokenCredential) { + this.tokenCredential = tokenCredential; + return this; + } + /* * The KeyCredential used for authentication. */ - @Generated private KeyCredential keyCredential; + @Generated + private KeyCredential keyCredential; - /** {@inheritDoc}. */ + /** + * {@inheritDoc}. + */ @Generated @Override public ContentSafetyClientBuilder credential(KeyCredential keyCredential) { @@ -169,9 +219,12 @@ public ContentSafetyClientBuilder credential(KeyCredential keyCredential) { /* * The service endpoint */ - @Generated private String endpoint; + @Generated + private String endpoint; - /** {@inheritDoc}. */ + /** + * {@inheritDoc}. + */ @Generated @Override public ContentSafetyClientBuilder endpoint(String endpoint) { @@ -182,7 +235,8 @@ public ContentSafetyClientBuilder endpoint(String endpoint) { /* * Service version */ - @Generated private ContentSafetyServiceVersion serviceVersion; + @Generated + private ContentSafetyServiceVersion serviceVersion; /** * Sets Service version. @@ -199,7 +253,8 @@ public ContentSafetyClientBuilder serviceVersion(ContentSafetyServiceVersion ser /* * The retry policy that will attempt to retry failed requests, if applicable. */ - @Generated private RetryPolicy retryPolicy; + @Generated + private RetryPolicy retryPolicy; /** * Sets The retry policy that will attempt to retry failed requests, if applicable. @@ -221,21 +276,17 @@ public ContentSafetyClientBuilder retryPolicy(RetryPolicy retryPolicy) { @Generated private ContentSafetyClientImpl buildInnerClient() { HttpPipeline localPipeline = (pipeline != null) ? pipeline : createHttpPipeline(); - ContentSafetyServiceVersion localServiceVersion = - (serviceVersion != null) ? serviceVersion : ContentSafetyServiceVersion.getLatest(); - ContentSafetyClientImpl client = - new ContentSafetyClientImpl( - localPipeline, - JacksonAdapter.createDefaultSerializerAdapter(), - this.endpoint, - localServiceVersion); + ContentSafetyServiceVersion localServiceVersion + = (serviceVersion != null) ? serviceVersion : ContentSafetyServiceVersion.getLatest(); + ContentSafetyClientImpl client = new ContentSafetyClientImpl(localPipeline, + JacksonAdapter.createDefaultSerializerAdapter(), this.endpoint, localServiceVersion); return client; } @Generated private HttpPipeline createHttpPipeline() { - Configuration buildConfiguration = - (configuration == null) ? Configuration.getGlobalConfiguration() : configuration; + Configuration buildConfiguration + = (configuration == null) ? Configuration.getGlobalConfiguration() : configuration; HttpLogOptions localHttpLogOptions = this.httpLogOptions == null ? new HttpLogOptions() : this.httpLogOptions; ClientOptions localClientOptions = this.clientOptions == null ? new ClientOptions() : this.clientOptions; List policies = new ArrayList<>(); @@ -246,32 +297,28 @@ private HttpPipeline createHttpPipeline() { policies.add(new RequestIdPolicy()); policies.add(new AddHeadersFromContextPolicy()); HttpHeaders headers = new HttpHeaders(); - localClientOptions - .getHeaders() - .forEach(header -> headers.set(HttpHeaderName.fromString(header.getName()), header.getValue())); + localClientOptions.getHeaders() + .forEach(header -> headers.set(HttpHeaderName.fromString(header.getName()), header.getValue())); if (headers.getSize() > 0) { policies.add(new AddHeadersPolicy(headers)); } - this.pipelinePolicies.stream() - .filter(p -> p.getPipelinePosition() == HttpPipelinePosition.PER_CALL) - .forEach(p -> policies.add(p)); + this.pipelinePolicies.stream().filter(p -> p.getPipelinePosition() == HttpPipelinePosition.PER_CALL) + .forEach(p -> policies.add(p)); HttpPolicyProviders.addBeforeRetryPolicies(policies); policies.add(ClientBuilderUtil.validateAndGetRetryPolicy(retryPolicy, retryOptions, new RetryPolicy())); policies.add(new AddDatePolicy()); if (keyCredential != null) { policies.add(new KeyCredentialPolicy("Ocp-Apim-Subscription-Key", keyCredential)); } - this.pipelinePolicies.stream() - .filter(p -> p.getPipelinePosition() == HttpPipelinePosition.PER_RETRY) - .forEach(p -> policies.add(p)); + if (tokenCredential != null) { + policies.add(new BearerTokenAuthenticationPolicy(tokenCredential, DEFAULT_SCOPES)); + } + this.pipelinePolicies.stream().filter(p -> p.getPipelinePosition() == HttpPipelinePosition.PER_RETRY) + .forEach(p -> policies.add(p)); HttpPolicyProviders.addAfterRetryPolicies(policies); policies.add(new HttpLoggingPolicy(httpLogOptions)); - HttpPipeline httpPipeline = - new HttpPipelineBuilder() - .policies(policies.toArray(new HttpPipelinePolicy[0])) - .httpClient(httpClient) - .clientOptions(localClientOptions) - .build(); + HttpPipeline httpPipeline = new HttpPipelineBuilder().policies(policies.toArray(new HttpPipelinePolicy[0])) + .httpClient(httpClient).clientOptions(localClientOptions).build(); return httpPipeline; } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyServiceVersion.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyServiceVersion.java index de967742593d1..17bdff7f6bf8c 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyServiceVersion.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/ContentSafetyServiceVersion.java @@ -6,10 +6,14 @@ import com.azure.core.util.ServiceVersion; -/** Service version of ContentSafetyClient. */ +/** + * Service version of ContentSafetyClient. + */ public enum ContentSafetyServiceVersion implements ServiceVersion { - /** Enum value 2023-04-30-preview. */ - V2023_04_30_PREVIEW("2023-04-30-preview"); + /** + * Enum value 2023-10-01. + */ + V2023_10_01("2023-10-01"); private final String version; @@ -17,7 +21,9 @@ public enum ContentSafetyServiceVersion implements ServiceVersion { this.version = version; } - /** {@inheritDoc} */ + /** + * {@inheritDoc} + */ @Override public String getVersion() { return this.version; @@ -25,10 +31,10 @@ public String getVersion() { /** * Gets the latest service version supported by this client library. - * + * * @return The latest {@link ContentSafetyServiceVersion}. */ public static ContentSafetyServiceVersion getLatest() { - return V2023_04_30_PREVIEW; + return V2023_10_01; } } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/implementation/BlocklistClientImpl.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/implementation/BlocklistClientImpl.java new file mode 100644 index 0000000000000..eedb893f17d2d --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/implementation/BlocklistClientImpl.java @@ -0,0 +1,1362 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package com.azure.ai.contentsafety.implementation; + +import com.azure.ai.contentsafety.ContentSafetyServiceVersion; +import com.azure.core.annotation.BodyParam; +import com.azure.core.annotation.Delete; +import com.azure.core.annotation.ExpectedResponses; +import com.azure.core.annotation.Get; +import com.azure.core.annotation.HeaderParam; +import com.azure.core.annotation.Host; +import com.azure.core.annotation.HostParam; +import com.azure.core.annotation.Patch; +import com.azure.core.annotation.PathParam; +import com.azure.core.annotation.Post; +import com.azure.core.annotation.QueryParam; +import com.azure.core.annotation.ReturnType; +import com.azure.core.annotation.ServiceInterface; +import com.azure.core.annotation.ServiceMethod; +import com.azure.core.annotation.UnexpectedResponseExceptionType; +import com.azure.core.exception.ClientAuthenticationException; +import com.azure.core.exception.HttpResponseException; +import com.azure.core.exception.ResourceModifiedException; +import com.azure.core.exception.ResourceNotFoundException; +import com.azure.core.http.HttpPipeline; +import com.azure.core.http.HttpPipelineBuilder; +import com.azure.core.http.policy.RetryPolicy; +import com.azure.core.http.policy.UserAgentPolicy; +import com.azure.core.http.rest.PagedFlux; +import com.azure.core.http.rest.PagedIterable; +import com.azure.core.http.rest.PagedResponse; +import com.azure.core.http.rest.PagedResponseBase; +import com.azure.core.http.rest.RequestOptions; +import com.azure.core.http.rest.Response; +import com.azure.core.http.rest.RestProxy; +import com.azure.core.util.BinaryData; +import com.azure.core.util.Context; +import com.azure.core.util.FluxUtil; +import com.azure.core.util.UrlBuilder; +import com.azure.core.util.serializer.JacksonAdapter; +import com.azure.core.util.serializer.SerializerAdapter; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import reactor.core.publisher.Mono; + +/** + * Initializes a new instance of the BlocklistClient type. + */ +public final class BlocklistClientImpl { + /** + * The proxy service used to perform REST calls. + */ + private final BlocklistClientService service; + + /** + * Supported Cognitive Services endpoints (protocol and hostname, for example: + * https://<resource-name>.cognitiveservices.azure.com). + */ + private final String endpoint; + + /** + * Gets Supported Cognitive Services endpoints (protocol and hostname, for example: + * https://<resource-name>.cognitiveservices.azure.com). + * + * @return the endpoint value. + */ + public String getEndpoint() { + return this.endpoint; + } + + /** + * Service version. + */ + private final ContentSafetyServiceVersion serviceVersion; + + /** + * Gets Service version. + * + * @return the serviceVersion value. + */ + public ContentSafetyServiceVersion getServiceVersion() { + return this.serviceVersion; + } + + /** + * The HTTP pipeline to send requests through. + */ + private final HttpPipeline httpPipeline; + + /** + * Gets The HTTP pipeline to send requests through. + * + * @return the httpPipeline value. + */ + public HttpPipeline getHttpPipeline() { + return this.httpPipeline; + } + + /** + * The serializer to serialize an object into a string. + */ + private final SerializerAdapter serializerAdapter; + + /** + * Gets The serializer to serialize an object into a string. + * + * @return the serializerAdapter value. + */ + public SerializerAdapter getSerializerAdapter() { + return this.serializerAdapter; + } + + /** + * Initializes an instance of BlocklistClient client. + * + * @param endpoint Supported Cognitive Services endpoints (protocol and hostname, for example: + * https://<resource-name>.cognitiveservices.azure.com). + * @param serviceVersion Service version. + */ + public BlocklistClientImpl(String endpoint, ContentSafetyServiceVersion serviceVersion) { + this(new HttpPipelineBuilder().policies(new UserAgentPolicy(), new RetryPolicy()).build(), + JacksonAdapter.createDefaultSerializerAdapter(), endpoint, serviceVersion); + } + + /** + * Initializes an instance of BlocklistClient client. + * + * @param httpPipeline The HTTP pipeline to send requests through. + * @param endpoint Supported Cognitive Services endpoints (protocol and hostname, for example: + * https://<resource-name>.cognitiveservices.azure.com). + * @param serviceVersion Service version. + */ + public BlocklistClientImpl(HttpPipeline httpPipeline, String endpoint, ContentSafetyServiceVersion serviceVersion) { + this(httpPipeline, JacksonAdapter.createDefaultSerializerAdapter(), endpoint, serviceVersion); + } + + /** + * Initializes an instance of BlocklistClient client. + * + * @param httpPipeline The HTTP pipeline to send requests through. + * @param serializerAdapter The serializer to serialize an object into a string. + * @param endpoint Supported Cognitive Services endpoints (protocol and hostname, for example: + * https://<resource-name>.cognitiveservices.azure.com). + * @param serviceVersion Service version. + */ + public BlocklistClientImpl(HttpPipeline httpPipeline, SerializerAdapter serializerAdapter, String endpoint, + ContentSafetyServiceVersion serviceVersion) { + this.httpPipeline = httpPipeline; + this.serializerAdapter = serializerAdapter; + this.endpoint = endpoint; + this.serviceVersion = serviceVersion; + this.service = RestProxy.create(BlocklistClientService.class, this.httpPipeline, this.getSerializerAdapter()); + } + + /** + * The interface defining all the services for BlocklistClient to be used by the proxy service to perform REST + * calls. + */ + @Host("{endpoint}/contentsafety") + @ServiceInterface(name = "BlocklistClient") + public interface BlocklistClientService { + @Post("/text/blocklists/{blocklistName}:addOrUpdateBlocklistItems") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Mono> addOrUpdateBlocklistItems(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @HeaderParam("accept") String accept, @BodyParam("application/json") BinaryData options, + RequestOptions requestOptions, Context context); + + @Post("/text/blocklists/{blocklistName}:addOrUpdateBlocklistItems") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Response addOrUpdateBlocklistItemsSync(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @HeaderParam("accept") String accept, @BodyParam("application/json") BinaryData options, + RequestOptions requestOptions, Context context); + + @Patch("/text/blocklists/{blocklistName}") + @ExpectedResponses({ 200, 201 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Mono> createOrUpdateTextBlocklist(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @HeaderParam("Content-Type") String contentType, @HeaderParam("accept") String accept, + @BodyParam("application/merge-patch+json") BinaryData options, RequestOptions requestOptions, + Context context); + + @Patch("/text/blocklists/{blocklistName}") + @ExpectedResponses({ 200, 201 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Response createOrUpdateTextBlocklistSync(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @HeaderParam("Content-Type") String contentType, @HeaderParam("accept") String accept, + @BodyParam("application/merge-patch+json") BinaryData options, RequestOptions requestOptions, + Context context); + + @Delete("/text/blocklists/{blocklistName}") + @ExpectedResponses({ 204 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Mono> deleteTextBlocklist(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @HeaderParam("accept") String accept, RequestOptions requestOptions, Context context); + + @Delete("/text/blocklists/{blocklistName}") + @ExpectedResponses({ 204 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Response deleteTextBlocklistSync(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @HeaderParam("accept") String accept, RequestOptions requestOptions, Context context); + + @Get("/text/blocklists/{blocklistName}") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Mono> getTextBlocklist(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @HeaderParam("accept") String accept, RequestOptions requestOptions, Context context); + + @Get("/text/blocklists/{blocklistName}") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Response getTextBlocklistSync(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @HeaderParam("accept") String accept, RequestOptions requestOptions, Context context); + + @Get("/text/blocklists/{blocklistName}/blocklistItems/{blocklistItemId}") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Mono> getTextBlocklistItem(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @PathParam("blocklistItemId") String blocklistItemId, @HeaderParam("accept") String accept, + RequestOptions requestOptions, Context context); + + @Get("/text/blocklists/{blocklistName}/blocklistItems/{blocklistItemId}") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Response getTextBlocklistItemSync(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @PathParam("blocklistItemId") String blocklistItemId, @HeaderParam("accept") String accept, + RequestOptions requestOptions, Context context); + + @Get("/text/blocklists/{blocklistName}/blocklistItems") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Mono> listTextBlocklistItems(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @HeaderParam("accept") String accept, RequestOptions requestOptions, Context context); + + @Get("/text/blocklists/{blocklistName}/blocklistItems") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Response listTextBlocklistItemsSync(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @HeaderParam("accept") String accept, RequestOptions requestOptions, Context context); + + @Get("/text/blocklists") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Mono> listTextBlocklists(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @HeaderParam("accept") String accept, + RequestOptions requestOptions, Context context); + + @Get("/text/blocklists") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Response listTextBlocklistsSync(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @HeaderParam("accept") String accept, + RequestOptions requestOptions, Context context); + + @Post("/text/blocklists/{blocklistName}:removeBlocklistItems") + @ExpectedResponses({ 204 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Mono> removeBlocklistItems(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @HeaderParam("accept") String accept, @BodyParam("application/json") BinaryData options, + RequestOptions requestOptions, Context context); + + @Post("/text/blocklists/{blocklistName}:removeBlocklistItems") + @ExpectedResponses({ 204 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Response removeBlocklistItemsSync(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @PathParam("blocklistName") String name, + @HeaderParam("accept") String accept, @BodyParam("application/json") BinaryData options, + RequestOptions requestOptions, Context context); + + @Get("{nextLink}") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Mono> listTextBlocklistItemsNext( + @PathParam(value = "nextLink", encoded = true) String nextLink, @HostParam("endpoint") String endpoint, + @HeaderParam("accept") String accept, RequestOptions requestOptions, Context context); + + @Get("{nextLink}") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Response listTextBlocklistItemsNextSync( + @PathParam(value = "nextLink", encoded = true) String nextLink, @HostParam("endpoint") String endpoint, + @HeaderParam("accept") String accept, RequestOptions requestOptions, Context context); + + @Get("{nextLink}") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Mono> listTextBlocklistsNext( + @PathParam(value = "nextLink", encoded = true) String nextLink, @HostParam("endpoint") String endpoint, + @HeaderParam("accept") String accept, RequestOptions requestOptions, Context context); + + @Get("{nextLink}") + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) + @UnexpectedResponseExceptionType(HttpResponseException.class) + Response listTextBlocklistsNextSync(@PathParam(value = "nextLink", encoded = true) String nextLink, + @HostParam("endpoint") String endpoint, @HeaderParam("accept") String accept, RequestOptions requestOptions, + Context context); + } + + /** + * Add or update BlocklistItems To Text Blocklist + * + * Add or update blocklistItems to a text blocklist. You can add or update at most 100 blocklistItems in one + * request. + *

+ * Request Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItems (Required): [
+     *          (Required){
+     *             blocklistItemId: String (Required)
+     *             description: String (Optional)
+     *             text: String (Required)
+     *         }
+     *     ]
+     * }
+     * }
+ *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItems (Required): [
+     *          (Required){
+     *             blocklistItemId: String (Required)
+     *             description: String (Optional)
+     *             text: String (Required)
+     *         }
+     *     ]
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param options Options for adding or updating blocklist items. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the response of adding blocklistItems to the text blocklist along with {@link Response} on successful + * completion of {@link Mono}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> addOrUpdateBlocklistItemsWithResponseAsync(String name, BinaryData options, + RequestOptions requestOptions) { + final String accept = "application/json"; + return FluxUtil.withContext(context -> service.addOrUpdateBlocklistItems(this.getEndpoint(), + this.getServiceVersion().getVersion(), name, accept, options, requestOptions, context)); + } + + /** + * Add or update BlocklistItems To Text Blocklist + * + * Add or update blocklistItems to a text blocklist. You can add or update at most 100 blocklistItems in one + * request. + *

+ * Request Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItems (Required): [
+     *          (Required){
+     *             blocklistItemId: String (Required)
+     *             description: String (Optional)
+     *             text: String (Required)
+     *         }
+     *     ]
+     * }
+     * }
+ *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItems (Required): [
+     *          (Required){
+     *             blocklistItemId: String (Required)
+     *             description: String (Optional)
+     *             text: String (Required)
+     *         }
+     *     ]
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param options Options for adding or updating blocklist items. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the response of adding blocklistItems to the text blocklist along with {@link Response}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Response addOrUpdateBlocklistItemsWithResponse(String name, BinaryData options, + RequestOptions requestOptions) { + final String accept = "application/json"; + return service.addOrUpdateBlocklistItemsSync(this.getEndpoint(), this.getServiceVersion().getVersion(), name, + accept, options, requestOptions, Context.NONE); + } + + /** + * Create Or Update Text Blocklist + * + * Updates a text blocklist. If the blocklistName does not exist, a new blocklist will be created. + *

+ * Request Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param options The resource instance. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return text Blocklist along with {@link Response} on successful completion of {@link Mono}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> createOrUpdateTextBlocklistWithResponseAsync(String name, BinaryData options, + RequestOptions requestOptions) { + final String contentType = "application/merge-patch+json"; + final String accept = "application/json"; + return FluxUtil.withContext(context -> service.createOrUpdateTextBlocklist(this.getEndpoint(), + this.getServiceVersion().getVersion(), name, contentType, accept, options, requestOptions, context)); + } + + /** + * Create Or Update Text Blocklist + * + * Updates a text blocklist. If the blocklistName does not exist, a new blocklist will be created. + *

+ * Request Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param options The resource instance. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return text Blocklist along with {@link Response}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Response createOrUpdateTextBlocklistWithResponse(String name, BinaryData options, + RequestOptions requestOptions) { + final String contentType = "application/merge-patch+json"; + final String accept = "application/json"; + return service.createOrUpdateTextBlocklistSync(this.getEndpoint(), this.getServiceVersion().getVersion(), name, + contentType, accept, options, requestOptions, Context.NONE); + } + + /** + * Delete Text Blocklist By blocklistName + * + * Deletes a text blocklist. + * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the {@link Response} on successful completion of {@link Mono}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> deleteTextBlocklistWithResponseAsync(String name, RequestOptions requestOptions) { + final String accept = "application/json"; + return FluxUtil.withContext(context -> service.deleteTextBlocklist(this.getEndpoint(), + this.getServiceVersion().getVersion(), name, accept, requestOptions, context)); + } + + /** + * Delete Text Blocklist By blocklistName + * + * Deletes a text blocklist. + * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the {@link Response}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Response deleteTextBlocklistWithResponse(String name, RequestOptions requestOptions) { + final String accept = "application/json"; + return service.deleteTextBlocklistSync(this.getEndpoint(), this.getServiceVersion().getVersion(), name, accept, + requestOptions, Context.NONE); + } + + /** + * Get Text Blocklist By blocklistName + * + * Returns text blocklist details. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return text Blocklist along with {@link Response} on successful completion of {@link Mono}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> getTextBlocklistWithResponseAsync(String name, RequestOptions requestOptions) { + final String accept = "application/json"; + return FluxUtil.withContext(context -> service.getTextBlocklist(this.getEndpoint(), + this.getServiceVersion().getVersion(), name, accept, requestOptions, context)); + } + + /** + * Get Text Blocklist By blocklistName + * + * Returns text blocklist details. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return text Blocklist along with {@link Response}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Response getTextBlocklistWithResponse(String name, RequestOptions requestOptions) { + final String accept = "application/json"; + return service.getTextBlocklistSync(this.getEndpoint(), this.getServiceVersion().getVersion(), name, accept, + requestOptions, Context.NONE); + } + + /** + * Get BlocklistItem By blocklistName And blocklistItemId + * + * Get blocklistItem by blocklistName and blocklistItemId from a text blocklist. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemId: String (Required)
+     *     description: String (Optional)
+     *     text: String (Required)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param blocklistItemId The service will generate a BlocklistItemId, which will be a UUID. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return blocklistItem by blocklistName and blocklistItemId from a text blocklist along with {@link Response} on + * successful completion of {@link Mono}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> getTextBlocklistItemWithResponseAsync(String name, String blocklistItemId, + RequestOptions requestOptions) { + final String accept = "application/json"; + return FluxUtil.withContext(context -> service.getTextBlocklistItem(this.getEndpoint(), + this.getServiceVersion().getVersion(), name, blocklistItemId, accept, requestOptions, context)); + } + + /** + * Get BlocklistItem By blocklistName And blocklistItemId + * + * Get blocklistItem by blocklistName and blocklistItemId from a text blocklist. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemId: String (Required)
+     *     description: String (Optional)
+     *     text: String (Required)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param blocklistItemId The service will generate a BlocklistItemId, which will be a UUID. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return blocklistItem by blocklistName and blocklistItemId from a text blocklist along with {@link Response}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Response getTextBlocklistItemWithResponse(String name, String blocklistItemId, + RequestOptions requestOptions) { + final String accept = "application/json"; + return service.getTextBlocklistItemSync(this.getEndpoint(), this.getServiceVersion().getVersion(), name, + blocklistItemId, accept, requestOptions, Context.NONE); + } + + /** + * Get All BlocklistItems By blocklistName + * + * Get all blocklistItems in a text blocklist. + *

+ * Query Parameters + *

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Query Parameters
NameTypeRequiredDescription
topIntegerNoThe number of result items to return.
skipIntegerNoThe number of result items to skip.
maxpagesizeIntegerNoThe maximum number of result items per page.
+ * You can add these to a request with {@link RequestOptions#addQueryParam} + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemId: String (Required)
+     *     description: String (Optional)
+     *     text: String (Required)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return all blocklistItems in a text blocklist along with {@link PagedResponse} on successful completion of + * {@link Mono}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + private Mono> listTextBlocklistItemsSinglePageAsync(String name, + RequestOptions requestOptions) { + final String accept = "application/json"; + return FluxUtil + .withContext(context -> service.listTextBlocklistItems(this.getEndpoint(), + this.getServiceVersion().getVersion(), name, accept, requestOptions, context)) + .map(res -> new PagedResponseBase<>(res.getRequest(), res.getStatusCode(), res.getHeaders(), + getValues(res.getValue(), "value"), getNextLink(res.getValue(), "nextLink"), null)); + } + + /** + * Get All BlocklistItems By blocklistName + * + * Get all blocklistItems in a text blocklist. + *

+ * Query Parameters + *

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Query Parameters
NameTypeRequiredDescription
topIntegerNoThe number of result items to return.
skipIntegerNoThe number of result items to skip.
maxpagesizeIntegerNoThe maximum number of result items per page.
+ * You can add these to a request with {@link RequestOptions#addQueryParam} + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemId: String (Required)
+     *     description: String (Optional)
+     *     text: String (Required)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return all blocklistItems in a text blocklist as paginated response with {@link PagedFlux}. + */ + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedFlux listTextBlocklistItemsAsync(String name, RequestOptions requestOptions) { + RequestOptions requestOptionsForNextPage = new RequestOptions(); + requestOptionsForNextPage.setContext( + requestOptions != null && requestOptions.getContext() != null ? requestOptions.getContext() : Context.NONE); + return new PagedFlux<>((pageSize) -> { + RequestOptions requestOptionsLocal = requestOptions == null ? new RequestOptions() : requestOptions; + if (pageSize != null) { + requestOptionsLocal.addRequestCallback(requestLocal -> { + UrlBuilder urlBuilder = UrlBuilder.parse(requestLocal.getUrl()); + urlBuilder.setQueryParameter("maxpagesize", String.valueOf(pageSize)); + requestLocal.setUrl(urlBuilder.toString()); + }); + } + return listTextBlocklistItemsSinglePageAsync(name, requestOptionsLocal); + }, (nextLink, pageSize) -> { + RequestOptions requestOptionsLocal = new RequestOptions(); + requestOptionsLocal.setContext(requestOptionsForNextPage.getContext()); + if (pageSize != null) { + requestOptionsLocal.addRequestCallback(requestLocal -> { + UrlBuilder urlBuilder = UrlBuilder.parse(requestLocal.getUrl()); + urlBuilder.setQueryParameter("maxpagesize", String.valueOf(pageSize)); + requestLocal.setUrl(urlBuilder.toString()); + }); + } + return listTextBlocklistItemsNextSinglePageAsync(nextLink, requestOptionsLocal); + }); + } + + /** + * Get All BlocklistItems By blocklistName + * + * Get all blocklistItems in a text blocklist. + *

+ * Query Parameters + *

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Query Parameters
NameTypeRequiredDescription
topIntegerNoThe number of result items to return.
skipIntegerNoThe number of result items to skip.
maxpagesizeIntegerNoThe maximum number of result items per page.
+ * You can add these to a request with {@link RequestOptions#addQueryParam} + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemId: String (Required)
+     *     description: String (Optional)
+     *     text: String (Required)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return all blocklistItems in a text blocklist along with {@link PagedResponse}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + private PagedResponse listTextBlocklistItemsSinglePage(String name, RequestOptions requestOptions) { + final String accept = "application/json"; + Response res = service.listTextBlocklistItemsSync(this.getEndpoint(), + this.getServiceVersion().getVersion(), name, accept, requestOptions, Context.NONE); + return new PagedResponseBase<>(res.getRequest(), res.getStatusCode(), res.getHeaders(), + getValues(res.getValue(), "value"), getNextLink(res.getValue(), "nextLink"), null); + } + + /** + * Get All BlocklistItems By blocklistName + * + * Get all blocklistItems in a text blocklist. + *

+ * Query Parameters + *

+ * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Query Parameters
NameTypeRequiredDescription
topIntegerNoThe number of result items to return.
skipIntegerNoThe number of result items to skip.
maxpagesizeIntegerNoThe maximum number of result items per page.
+ * You can add these to a request with {@link RequestOptions#addQueryParam} + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemId: String (Required)
+     *     description: String (Optional)
+     *     text: String (Required)
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return all blocklistItems in a text blocklist as paginated response with {@link PagedIterable}. + */ + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedIterable listTextBlocklistItems(String name, RequestOptions requestOptions) { + RequestOptions requestOptionsForNextPage = new RequestOptions(); + requestOptionsForNextPage.setContext( + requestOptions != null && requestOptions.getContext() != null ? requestOptions.getContext() : Context.NONE); + return new PagedIterable<>((pageSize) -> { + RequestOptions requestOptionsLocal = requestOptions == null ? new RequestOptions() : requestOptions; + if (pageSize != null) { + requestOptionsLocal.addRequestCallback(requestLocal -> { + UrlBuilder urlBuilder = UrlBuilder.parse(requestLocal.getUrl()); + urlBuilder.setQueryParameter("maxpagesize", String.valueOf(pageSize)); + requestLocal.setUrl(urlBuilder.toString()); + }); + } + return listTextBlocklistItemsSinglePage(name, requestOptionsLocal); + }, (nextLink, pageSize) -> { + RequestOptions requestOptionsLocal = new RequestOptions(); + requestOptionsLocal.setContext(requestOptionsForNextPage.getContext()); + if (pageSize != null) { + requestOptionsLocal.addRequestCallback(requestLocal -> { + UrlBuilder urlBuilder = UrlBuilder.parse(requestLocal.getUrl()); + urlBuilder.setQueryParameter("maxpagesize", String.valueOf(pageSize)); + requestLocal.setUrl(urlBuilder.toString()); + }); + } + return listTextBlocklistItemsNextSinglePage(nextLink, requestOptionsLocal); + }); + } + + /** + * Get All Text Blocklists + * + * Get all text blocklists details. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return all text blocklists details along with {@link PagedResponse} on successful completion of {@link Mono}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + private Mono> listTextBlocklistsSinglePageAsync(RequestOptions requestOptions) { + final String accept = "application/json"; + return FluxUtil + .withContext(context -> service.listTextBlocklists(this.getEndpoint(), + this.getServiceVersion().getVersion(), accept, requestOptions, context)) + .map(res -> new PagedResponseBase<>(res.getRequest(), res.getStatusCode(), res.getHeaders(), + getValues(res.getValue(), "value"), getNextLink(res.getValue(), "nextLink"), null)); + } + + /** + * Get All Text Blocklists + * + * Get all text blocklists details. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return all text blocklists details as paginated response with {@link PagedFlux}. + */ + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedFlux listTextBlocklistsAsync(RequestOptions requestOptions) { + RequestOptions requestOptionsForNextPage = new RequestOptions(); + requestOptionsForNextPage.setContext( + requestOptions != null && requestOptions.getContext() != null ? requestOptions.getContext() : Context.NONE); + return new PagedFlux<>(() -> listTextBlocklistsSinglePageAsync(requestOptions), + nextLink -> listTextBlocklistsNextSinglePageAsync(nextLink, requestOptionsForNextPage)); + } + + /** + * Get All Text Blocklists + * + * Get all text blocklists details. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return all text blocklists details along with {@link PagedResponse}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + private PagedResponse listTextBlocklistsSinglePage(RequestOptions requestOptions) { + final String accept = "application/json"; + Response res = service.listTextBlocklistsSync(this.getEndpoint(), + this.getServiceVersion().getVersion(), accept, requestOptions, Context.NONE); + return new PagedResponseBase<>(res.getRequest(), res.getStatusCode(), res.getHeaders(), + getValues(res.getValue(), "value"), getNextLink(res.getValue(), "nextLink"), null); + } + + /** + * Get All Text Blocklists + * + * Get all text blocklists details. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return all text blocklists details as paginated response with {@link PagedIterable}. + */ + @ServiceMethod(returns = ReturnType.COLLECTION) + public PagedIterable listTextBlocklists(RequestOptions requestOptions) { + RequestOptions requestOptionsForNextPage = new RequestOptions(); + requestOptionsForNextPage.setContext( + requestOptions != null && requestOptions.getContext() != null ? requestOptions.getContext() : Context.NONE); + return new PagedIterable<>(() -> listTextBlocklistsSinglePage(requestOptions), + nextLink -> listTextBlocklistsNextSinglePage(nextLink, requestOptionsForNextPage)); + } + + /** + * Remove BlocklistItems From Text Blocklist + * + * Remove blocklistItems from a text blocklist. You can remove at most 100 BlocklistItems in one request. + *

+ * Request Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemIds (Required): [
+     *         String (Required)
+     *     ]
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param options Options for removing blocklist items. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the {@link Response} on successful completion of {@link Mono}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Mono> removeBlocklistItemsWithResponseAsync(String name, BinaryData options, + RequestOptions requestOptions) { + final String accept = "application/json"; + return FluxUtil.withContext(context -> service.removeBlocklistItems(this.getEndpoint(), + this.getServiceVersion().getVersion(), name, accept, options, requestOptions, context)); + } + + /** + * Remove BlocklistItems From Text Blocklist + * + * Remove blocklistItems from a text blocklist. You can remove at most 100 BlocklistItems in one request. + *

+ * Request Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemIds (Required): [
+     *         String (Required)
+     *     ]
+     * }
+     * }
+ * + * @param name Text blocklist name. + * @param options Options for removing blocklist items. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return the {@link Response}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + public Response removeBlocklistItemsWithResponse(String name, BinaryData options, + RequestOptions requestOptions) { + final String accept = "application/json"; + return service.removeBlocklistItemsSync(this.getEndpoint(), this.getServiceVersion().getVersion(), name, accept, + options, requestOptions, Context.NONE); + } + + /** + * Get All BlocklistItems By blocklistName + * + * Get the next page of items. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemId: String (Required)
+     *     description: String (Optional)
+     *     text: String (Required)
+     * }
+     * }
+ * + * @param nextLink The URL to get the next list of items + * + * The nextLink parameter. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return paged collection of TextBlocklistItem items along with {@link PagedResponse} on successful completion of + * {@link Mono}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + private Mono> listTextBlocklistItemsNextSinglePageAsync(String nextLink, + RequestOptions requestOptions) { + final String accept = "application/json"; + return FluxUtil + .withContext(context -> service.listTextBlocklistItemsNext(nextLink, this.getEndpoint(), accept, + requestOptions, context)) + .map(res -> new PagedResponseBase<>(res.getRequest(), res.getStatusCode(), res.getHeaders(), + getValues(res.getValue(), "value"), getNextLink(res.getValue(), "nextLink"), null)); + } + + /** + * Get All BlocklistItems By blocklistName + * + * Get the next page of items. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistItemId: String (Required)
+     *     description: String (Optional)
+     *     text: String (Required)
+     * }
+     * }
+ * + * @param nextLink The URL to get the next list of items + * + * The nextLink parameter. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return paged collection of TextBlocklistItem items along with {@link PagedResponse}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + private PagedResponse listTextBlocklistItemsNextSinglePage(String nextLink, + RequestOptions requestOptions) { + final String accept = "application/json"; + Response res = service.listTextBlocklistItemsNextSync(nextLink, this.getEndpoint(), accept, + requestOptions, Context.NONE); + return new PagedResponseBase<>(res.getRequest(), res.getStatusCode(), res.getHeaders(), + getValues(res.getValue(), "value"), getNextLink(res.getValue(), "nextLink"), null); + } + + /** + * Get All Text Blocklists + * + * Get the next page of items. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param nextLink The URL to get the next list of items + * + * The nextLink parameter. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return paged collection of TextBlocklist items along with {@link PagedResponse} on successful completion of + * {@link Mono}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + private Mono> listTextBlocklistsNextSinglePageAsync(String nextLink, + RequestOptions requestOptions) { + final String accept = "application/json"; + return FluxUtil.withContext( + context -> service.listTextBlocklistsNext(nextLink, this.getEndpoint(), accept, requestOptions, context)) + .map(res -> new PagedResponseBase<>(res.getRequest(), res.getStatusCode(), res.getHeaders(), + getValues(res.getValue(), "value"), getNextLink(res.getValue(), "nextLink"), null)); + } + + /** + * Get All Text Blocklists + * + * Get the next page of items. + *

+ * Response Body Schema + *

+ *
{@code
+     * {
+     *     blocklistName: String (Required)
+     *     description: String (Optional)
+     * }
+     * }
+ * + * @param nextLink The URL to get the next list of items + * + * The nextLink parameter. + * @param requestOptions The options to configure the HTTP request before HTTP client sends it. + * @throws HttpResponseException thrown if the request is rejected by server. + * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. + * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. + * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. + * @return paged collection of TextBlocklist items along with {@link PagedResponse}. + */ + @ServiceMethod(returns = ReturnType.SINGLE) + private PagedResponse listTextBlocklistsNextSinglePage(String nextLink, RequestOptions requestOptions) { + final String accept = "application/json"; + Response res + = service.listTextBlocklistsNextSync(nextLink, this.getEndpoint(), accept, requestOptions, Context.NONE); + return new PagedResponseBase<>(res.getRequest(), res.getStatusCode(), res.getHeaders(), + getValues(res.getValue(), "value"), getNextLink(res.getValue(), "nextLink"), null); + } + + private List getValues(BinaryData binaryData, String path) { + try { + Map obj = binaryData.toObject(Map.class); + List values = (List) obj.get(path); + return values.stream().map(BinaryData::fromObject).collect(Collectors.toList()); + } catch (RuntimeException e) { + return null; + } + } + + private String getNextLink(BinaryData binaryData, String path) { + try { + Map obj = binaryData.toObject(Map.class); + return (String) obj.get(path); + } catch (RuntimeException e) { + return null; + } + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/implementation/ContentSafetyClientImpl.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/implementation/ContentSafetyClientImpl.java index 84603c9cf974e..74de26118073c 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/implementation/ContentSafetyClientImpl.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/implementation/ContentSafetyClientImpl.java @@ -6,14 +6,10 @@ import com.azure.ai.contentsafety.ContentSafetyServiceVersion; import com.azure.core.annotation.BodyParam; -import com.azure.core.annotation.Delete; import com.azure.core.annotation.ExpectedResponses; -import com.azure.core.annotation.Get; import com.azure.core.annotation.HeaderParam; import com.azure.core.annotation.Host; import com.azure.core.annotation.HostParam; -import com.azure.core.annotation.Patch; -import com.azure.core.annotation.PathParam; import com.azure.core.annotation.Post; import com.azure.core.annotation.QueryParam; import com.azure.core.annotation.ReturnType; @@ -28,27 +24,23 @@ import com.azure.core.http.HttpPipelineBuilder; import com.azure.core.http.policy.RetryPolicy; import com.azure.core.http.policy.UserAgentPolicy; -import com.azure.core.http.rest.PagedFlux; -import com.azure.core.http.rest.PagedIterable; -import com.azure.core.http.rest.PagedResponse; -import com.azure.core.http.rest.PagedResponseBase; import com.azure.core.http.rest.RequestOptions; import com.azure.core.http.rest.Response; import com.azure.core.http.rest.RestProxy; import com.azure.core.util.BinaryData; import com.azure.core.util.Context; import com.azure.core.util.FluxUtil; -import com.azure.core.util.UrlBuilder; import com.azure.core.util.serializer.JacksonAdapter; import com.azure.core.util.serializer.SerializerAdapter; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; import reactor.core.publisher.Mono; -/** Initializes a new instance of the ContentSafetyClient type. */ +/** + * Initializes a new instance of the ContentSafetyClient type. + */ public final class ContentSafetyClientImpl { - /** The proxy service used to perform REST calls. */ + /** + * The proxy service used to perform REST calls. + */ private final ContentSafetyClientService service; /** @@ -60,43 +52,49 @@ public final class ContentSafetyClientImpl { /** * Gets Supported Cognitive Services endpoints (protocol and hostname, for example: * https://<resource-name>.cognitiveservices.azure.com). - * + * * @return the endpoint value. */ public String getEndpoint() { return this.endpoint; } - /** Service version. */ + /** + * Service version. + */ private final ContentSafetyServiceVersion serviceVersion; /** * Gets Service version. - * + * * @return the serviceVersion value. */ public ContentSafetyServiceVersion getServiceVersion() { return this.serviceVersion; } - /** The HTTP pipeline to send requests through. */ + /** + * The HTTP pipeline to send requests through. + */ private final HttpPipeline httpPipeline; /** * Gets The HTTP pipeline to send requests through. - * + * * @return the httpPipeline value. */ public HttpPipeline getHttpPipeline() { return this.httpPipeline; } - /** The serializer to serialize an object into a string. */ + /** + * The serializer to serialize an object into a string. + */ private final SerializerAdapter serializerAdapter; /** * Gets The serializer to serialize an object into a string. - * + * * @return the serializerAdapter value. */ public SerializerAdapter getSerializerAdapter() { @@ -105,52 +103,46 @@ public SerializerAdapter getSerializerAdapter() { /** * Initializes an instance of ContentSafetyClient client. - * + * * @param endpoint Supported Cognitive Services endpoints (protocol and hostname, for example: - * https://<resource-name>.cognitiveservices.azure.com). + * https://<resource-name>.cognitiveservices.azure.com). * @param serviceVersion Service version. */ public ContentSafetyClientImpl(String endpoint, ContentSafetyServiceVersion serviceVersion) { - this( - new HttpPipelineBuilder().policies(new UserAgentPolicy(), new RetryPolicy()).build(), - JacksonAdapter.createDefaultSerializerAdapter(), - endpoint, - serviceVersion); + this(new HttpPipelineBuilder().policies(new UserAgentPolicy(), new RetryPolicy()).build(), + JacksonAdapter.createDefaultSerializerAdapter(), endpoint, serviceVersion); } /** * Initializes an instance of ContentSafetyClient client. - * + * * @param httpPipeline The HTTP pipeline to send requests through. * @param endpoint Supported Cognitive Services endpoints (protocol and hostname, for example: - * https://<resource-name>.cognitiveservices.azure.com). + * https://<resource-name>.cognitiveservices.azure.com). * @param serviceVersion Service version. */ - public ContentSafetyClientImpl( - HttpPipeline httpPipeline, String endpoint, ContentSafetyServiceVersion serviceVersion) { + public ContentSafetyClientImpl(HttpPipeline httpPipeline, String endpoint, + ContentSafetyServiceVersion serviceVersion) { this(httpPipeline, JacksonAdapter.createDefaultSerializerAdapter(), endpoint, serviceVersion); } /** * Initializes an instance of ContentSafetyClient client. - * + * * @param httpPipeline The HTTP pipeline to send requests through. * @param serializerAdapter The serializer to serialize an object into a string. * @param endpoint Supported Cognitive Services endpoints (protocol and hostname, for example: - * https://<resource-name>.cognitiveservices.azure.com). + * https://<resource-name>.cognitiveservices.azure.com). * @param serviceVersion Service version. */ - public ContentSafetyClientImpl( - HttpPipeline httpPipeline, - SerializerAdapter serializerAdapter, - String endpoint, - ContentSafetyServiceVersion serviceVersion) { + public ContentSafetyClientImpl(HttpPipeline httpPipeline, SerializerAdapter serializerAdapter, String endpoint, + ContentSafetyServiceVersion serviceVersion) { this.httpPipeline = httpPipeline; this.serializerAdapter = serializerAdapter; this.endpoint = endpoint; this.serviceVersion = serviceVersion; - this.service = - RestProxy.create(ContentSafetyClientService.class, this.httpPipeline, this.getSerializerAdapter()); + this.service + = RestProxy.create(ContentSafetyClientService.class, this.httpPipeline, this.getSerializerAdapter()); } /** @@ -161,498 +153,54 @@ public ContentSafetyClientImpl( @ServiceInterface(name = "ContentSafetyClient") public interface ContentSafetyClientService { @Post("/text:analyze") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) @UnexpectedResponseExceptionType(HttpResponseException.class) - Mono> analyzeText( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @HeaderParam("accept") String accept, - @BodyParam("application/json") BinaryData body, - RequestOptions requestOptions, - Context context); + Mono> analyzeText(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @HeaderParam("accept") String accept, + @BodyParam("application/json") BinaryData options, RequestOptions requestOptions, Context context); @Post("/text:analyze") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) @UnexpectedResponseExceptionType(HttpResponseException.class) - Response analyzeTextSync( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @HeaderParam("accept") String accept, - @BodyParam("application/json") BinaryData body, - RequestOptions requestOptions, - Context context); + Response analyzeTextSync(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @HeaderParam("accept") String accept, + @BodyParam("application/json") BinaryData options, RequestOptions requestOptions, Context context); @Post("/image:analyze") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) @UnexpectedResponseExceptionType(HttpResponseException.class) - Mono> analyzeImage( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @HeaderParam("accept") String accept, - @BodyParam("application/json") BinaryData body, - RequestOptions requestOptions, - Context context); + Mono> analyzeImage(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @HeaderParam("accept") String accept, + @BodyParam("application/json") BinaryData options, RequestOptions requestOptions, Context context); @Post("/image:analyze") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Response analyzeImageSync( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @HeaderParam("accept") String accept, - @BodyParam("application/json") BinaryData body, - RequestOptions requestOptions, - Context context); - - @Get("/text/blocklists/{blocklistName}") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Mono> getTextBlocklist( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); - - @Get("/text/blocklists/{blocklistName}") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Response getTextBlocklistSync( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); - - @Patch("/text/blocklists/{blocklistName}") - @ExpectedResponses({200, 201}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Mono> createOrUpdateTextBlocklist( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @HeaderParam("Content-Type") String contentType, - @HeaderParam("accept") String accept, - @BodyParam("application/merge-patch+json") BinaryData resource, - RequestOptions requestOptions, - Context context); - - @Patch("/text/blocklists/{blocklistName}") - @ExpectedResponses({200, 201}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Response createOrUpdateTextBlocklistSync( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @HeaderParam("Content-Type") String contentType, - @HeaderParam("accept") String accept, - @BodyParam("application/merge-patch+json") BinaryData resource, - RequestOptions requestOptions, - Context context); - - @Delete("/text/blocklists/{blocklistName}") - @ExpectedResponses({204}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Mono> deleteTextBlocklist( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); - - @Delete("/text/blocklists/{blocklistName}") - @ExpectedResponses({204}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Response deleteTextBlocklistSync( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); - - @Get("/text/blocklists") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Mono> listTextBlocklists( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); - - @Get("/text/blocklists") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Response listTextBlocklistsSync( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); - - @Post("/text/blocklists/{blocklistName}:addBlockItems") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Mono> addBlockItems( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @HeaderParam("accept") String accept, - @BodyParam("application/json") BinaryData addBlockItemsOptions, - RequestOptions requestOptions, - Context context); - - @Post("/text/blocklists/{blocklistName}:addBlockItems") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Response addBlockItemsSync( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @HeaderParam("accept") String accept, - @BodyParam("application/json") BinaryData addBlockItemsOptions, - RequestOptions requestOptions, - Context context); - - @Post("/text/blocklists/{blocklistName}:removeBlockItems") - @ExpectedResponses({204}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Mono> removeBlockItems( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @HeaderParam("accept") String accept, - @BodyParam("application/json") BinaryData removeBlockItemsOptions, - RequestOptions requestOptions, - Context context); - - @Post("/text/blocklists/{blocklistName}:removeBlockItems") - @ExpectedResponses({204}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Response removeBlockItemsSync( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @HeaderParam("accept") String accept, - @BodyParam("application/json") BinaryData removeBlockItemsOptions, - RequestOptions requestOptions, - Context context); - - @Get("/text/blocklists/{blocklistName}/blockItems/{blockItemId}") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Mono> getTextBlocklistItem( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @PathParam("blockItemId") String blockItemId, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); - - @Get("/text/blocklists/{blocklistName}/blockItems/{blockItemId}") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Response getTextBlocklistItemSync( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @PathParam("blockItemId") String blockItemId, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); - - @Get("/text/blocklists/{blocklistName}/blockItems") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Mono> listTextBlocklistItems( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); - - @Get("/text/blocklists/{blocklistName}/blockItems") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Response listTextBlocklistItemsSync( - @HostParam("endpoint") String endpoint, - @QueryParam("api-version") String apiVersion, - @PathParam("blocklistName") String blocklistName, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); - - @Get("{nextLink}") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Mono> listTextBlocklistsNext( - @PathParam(value = "nextLink", encoded = true) String nextLink, - @HostParam("endpoint") String endpoint, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); - - @Get("{nextLink}") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Response listTextBlocklistsNextSync( - @PathParam(value = "nextLink", encoded = true) String nextLink, - @HostParam("endpoint") String endpoint, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); - - @Get("{nextLink}") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) + @ExpectedResponses({ 200 }) + @UnexpectedResponseExceptionType(value = ClientAuthenticationException.class, code = { 401 }) + @UnexpectedResponseExceptionType(value = ResourceNotFoundException.class, code = { 404 }) + @UnexpectedResponseExceptionType(value = ResourceModifiedException.class, code = { 409 }) @UnexpectedResponseExceptionType(HttpResponseException.class) - Mono> listTextBlocklistItemsNext( - @PathParam(value = "nextLink", encoded = true) String nextLink, - @HostParam("endpoint") String endpoint, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); - - @Get("{nextLink}") - @ExpectedResponses({200}) - @UnexpectedResponseExceptionType( - value = ClientAuthenticationException.class, - code = {401}) - @UnexpectedResponseExceptionType( - value = ResourceNotFoundException.class, - code = {404}) - @UnexpectedResponseExceptionType( - value = ResourceModifiedException.class, - code = {409}) - @UnexpectedResponseExceptionType(HttpResponseException.class) - Response listTextBlocklistItemsNextSync( - @PathParam(value = "nextLink", encoded = true) String nextLink, - @HostParam("endpoint") String endpoint, - @HeaderParam("accept") String accept, - RequestOptions requestOptions, - Context context); + Response analyzeImageSync(@HostParam("endpoint") String endpoint, + @QueryParam("api-version") String apiVersion, @HeaderParam("accept") String accept, + @BodyParam("application/json") BinaryData options, RequestOptions requestOptions, Context context); } /** * Analyze Text - * - *

A sync API for harmful content analysis for text. Currently, we support four categories: Hate, SelfHarm, - * Sexual, Violence. - * - *

Request Body Schema - * + * + * A synchronous API for the analysis of potentially harmful text content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. + *

+ * Request Body Schema + *

*
{@code
      * {
      *     text: String (Required)
@@ -662,63 +210,54 @@ Response listTextBlocklistItemsNextSync(
      *     blocklistNames (Optional): [
      *         String (Optional)
      *     ]
-     *     breakByBlocklists: Boolean (Optional)
+     *     haltOnBlocklistHit: Boolean (Optional)
+     *     outputType: String(FourSeverityLevels/EightSeverityLevels) (Optional)
      * }
      * }
- * - *

Response Body Schema - * + *

+ * Response Body Schema + *

*
{@code
      * {
-     *     blocklistsMatchResults (Optional): [
+     *     blocklistsMatch (Optional): [
      *          (Optional){
      *             blocklistName: String (Required)
-     *             blockItemId: String (Required)
-     *             blockItemText: String (Required)
-     *             offset: int (Required)
-     *             length: int (Required)
+     *             blocklistItemId: String (Required)
+     *             blocklistItemText: String (Required)
+     *         }
+     *     ]
+     *     categoriesAnalysis (Required): [
+     *          (Required){
+     *             category: String(Hate/SelfHarm/Sexual/Violence) (Required)
+     *             severity: Integer (Optional)
      *         }
      *     ]
-     *     hateResult (Optional): {
-     *         category: String(Hate/SelfHarm/Sexual/Violence) (Required)
-     *         severity: int (Required)
-     *     }
-     *     selfHarmResult (Optional): (recursive schema, see selfHarmResult above)
-     *     sexualResult (Optional): (recursive schema, see sexualResult above)
-     *     violenceResult (Optional): (recursive schema, see violenceResult above)
      * }
      * }
- * - * @param body The request of text analysis. + * + * @param options The text analysis request. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the analysis response of the text along with {@link Response} on successful completion of {@link Mono}. + * @return the text analysis response along with {@link Response} on successful completion of {@link Mono}. */ @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> analyzeTextWithResponseAsync(BinaryData body, RequestOptions requestOptions) { + public Mono> analyzeTextWithResponseAsync(BinaryData options, RequestOptions requestOptions) { final String accept = "application/json"; - return FluxUtil.withContext( - context -> - service.analyzeText( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - accept, - body, - requestOptions, - context)); + return FluxUtil.withContext(context -> service.analyzeText(this.getEndpoint(), + this.getServiceVersion().getVersion(), accept, options, requestOptions, context)); } /** * Analyze Text - * - *

A sync API for harmful content analysis for text. Currently, we support four categories: Hate, SelfHarm, - * Sexual, Violence. - * - *

Request Body Schema - * + * + * A synchronous API for the analysis of potentially harmful text content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. + *

+ * Request Body Schema + *

*
{@code
      * {
      *     text: String (Required)
@@ -728,56 +267,54 @@ public Mono> analyzeTextWithResponseAsync(BinaryData body,
      *     blocklistNames (Optional): [
      *         String (Optional)
      *     ]
-     *     breakByBlocklists: Boolean (Optional)
+     *     haltOnBlocklistHit: Boolean (Optional)
+     *     outputType: String(FourSeverityLevels/EightSeverityLevels) (Optional)
      * }
      * }
- * - *

Response Body Schema - * + *

+ * Response Body Schema + *

*
{@code
      * {
-     *     blocklistsMatchResults (Optional): [
+     *     blocklistsMatch (Optional): [
      *          (Optional){
      *             blocklistName: String (Required)
-     *             blockItemId: String (Required)
-     *             blockItemText: String (Required)
-     *             offset: int (Required)
-     *             length: int (Required)
+     *             blocklistItemId: String (Required)
+     *             blocklistItemText: String (Required)
+     *         }
+     *     ]
+     *     categoriesAnalysis (Required): [
+     *          (Required){
+     *             category: String(Hate/SelfHarm/Sexual/Violence) (Required)
+     *             severity: Integer (Optional)
      *         }
      *     ]
-     *     hateResult (Optional): {
-     *         category: String(Hate/SelfHarm/Sexual/Violence) (Required)
-     *         severity: int (Required)
-     *     }
-     *     selfHarmResult (Optional): (recursive schema, see selfHarmResult above)
-     *     sexualResult (Optional): (recursive schema, see sexualResult above)
-     *     violenceResult (Optional): (recursive schema, see violenceResult above)
      * }
      * }
- * - * @param body The request of text analysis. + * + * @param options The text analysis request. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the analysis response of the text along with {@link Response}. + * @return the text analysis response along with {@link Response}. */ @ServiceMethod(returns = ReturnType.SINGLE) - public Response analyzeTextWithResponse(BinaryData body, RequestOptions requestOptions) { + public Response analyzeTextWithResponse(BinaryData options, RequestOptions requestOptions) { final String accept = "application/json"; - return service.analyzeTextSync( - this.getEndpoint(), this.getServiceVersion().getVersion(), accept, body, requestOptions, Context.NONE); + return service.analyzeTextSync(this.getEndpoint(), this.getServiceVersion().getVersion(), accept, options, + requestOptions, Context.NONE); } /** * Analyze Image - * - *

A sync API for harmful content analysis for image. Currently, we support four categories: Hate, SelfHarm, - * Sexual, Violence. - * - *

Request Body Schema - * + * + * A synchronous API for the analysis of potentially harmful image content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. + *

+ * Request Body Schema + *

*
{@code
      * {
      *     image (Required): {
@@ -787,53 +324,46 @@ public Response analyzeTextWithResponse(BinaryData body, RequestOpti
      *     categories (Optional): [
      *         String(Hate/SelfHarm/Sexual/Violence) (Optional)
      *     ]
+     *     outputType: String(FourSeverityLevels) (Optional)
      * }
      * }
- * - *

Response Body Schema - * + *

+ * Response Body Schema + *

*
{@code
      * {
-     *     hateResult (Optional): {
-     *         category: String(Hate/SelfHarm/Sexual/Violence) (Required)
-     *         severity: int (Required)
-     *     }
-     *     selfHarmResult (Optional): (recursive schema, see selfHarmResult above)
-     *     sexualResult (Optional): (recursive schema, see sexualResult above)
-     *     violenceResult (Optional): (recursive schema, see violenceResult above)
+     *     categoriesAnalysis (Required): [
+     *          (Required){
+     *             category: String(Hate/SelfHarm/Sexual/Violence) (Required)
+     *             severity: Integer (Optional)
+     *         }
+     *     ]
      * }
      * }
- * - * @param body The analysis request of the image. + * + * @param options The image analysis request. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the analysis response of the image along with {@link Response} on successful completion of {@link Mono}. + * @return the image analysis response along with {@link Response} on successful completion of {@link Mono}. */ @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> analyzeImageWithResponseAsync(BinaryData body, RequestOptions requestOptions) { + public Mono> analyzeImageWithResponseAsync(BinaryData options, RequestOptions requestOptions) { final String accept = "application/json"; - return FluxUtil.withContext( - context -> - service.analyzeImage( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - accept, - body, - requestOptions, - context)); + return FluxUtil.withContext(context -> service.analyzeImage(this.getEndpoint(), + this.getServiceVersion().getVersion(), accept, options, requestOptions, context)); } /** * Analyze Image - * - *

A sync API for harmful content analysis for image. Currently, we support four categories: Hate, SelfHarm, - * Sexual, Violence. - * - *

Request Body Schema - * + * + * A synchronous API for the analysis of potentially harmful image content. Currently, it supports four categories: + * Hate, SelfHarm, Sexual, and Violence. + *

+ * Request Body Schema + *

*
{@code
      * {
      *     image (Required): {
@@ -843,1115 +373,35 @@ public Mono> analyzeImageWithResponseAsync(BinaryData body,
      *     categories (Optional): [
      *         String(Hate/SelfHarm/Sexual/Violence) (Optional)
      *     ]
+     *     outputType: String(FourSeverityLevels) (Optional)
      * }
      * }
- * - *

Response Body Schema - * - *

{@code
-     * {
-     *     hateResult (Optional): {
-     *         category: String(Hate/SelfHarm/Sexual/Violence) (Required)
-     *         severity: int (Required)
-     *     }
-     *     selfHarmResult (Optional): (recursive schema, see selfHarmResult above)
-     *     sexualResult (Optional): (recursive schema, see sexualResult above)
-     *     violenceResult (Optional): (recursive schema, see violenceResult above)
-     * }
-     * }
- * - * @param body The analysis request of the image. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the analysis response of the image along with {@link Response}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - public Response analyzeImageWithResponse(BinaryData body, RequestOptions requestOptions) { - final String accept = "application/json"; - return service.analyzeImageSync( - this.getEndpoint(), this.getServiceVersion().getVersion(), accept, body, requestOptions, Context.NONE); - } - - /** - * Get Text Blocklist By blocklistName - * - *

Returns text blocklist details. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return text Blocklist along with {@link Response} on successful completion of {@link Mono}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> getTextBlocklistWithResponseAsync( - String blocklistName, RequestOptions requestOptions) { - final String accept = "application/json"; - return FluxUtil.withContext( - context -> - service.getTextBlocklist( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - accept, - requestOptions, - context)); - } - - /** - * Get Text Blocklist By blocklistName - * - *

Returns text blocklist details. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return text Blocklist along with {@link Response}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - public Response getTextBlocklistWithResponse(String blocklistName, RequestOptions requestOptions) { - final String accept = "application/json"; - return service.getTextBlocklistSync( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - accept, - requestOptions, - Context.NONE); - } - - /** - * Create Or Update Text Blocklist - * - *

Updates a text blocklist, if blocklistName does not exist, create a new blocklist. - * - *

Request Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param resource The resource instance. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return text Blocklist along with {@link Response} on successful completion of {@link Mono}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> createOrUpdateTextBlocklistWithResponseAsync( - String blocklistName, BinaryData resource, RequestOptions requestOptions) { - final String contentType = "application/merge-patch+json"; - final String accept = "application/json"; - return FluxUtil.withContext( - context -> - service.createOrUpdateTextBlocklist( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - contentType, - accept, - resource, - requestOptions, - context)); - } - - /** - * Create Or Update Text Blocklist - * - *

Updates a text blocklist, if blocklistName does not exist, create a new blocklist. - * - *

Request Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param resource The resource instance. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return text Blocklist along with {@link Response}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - public Response createOrUpdateTextBlocklistWithResponse( - String blocklistName, BinaryData resource, RequestOptions requestOptions) { - final String contentType = "application/merge-patch+json"; - final String accept = "application/json"; - return service.createOrUpdateTextBlocklistSync( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - contentType, - accept, - resource, - requestOptions, - Context.NONE); - } - - /** - * Delete Text Blocklist By blocklistName - * - *

Deletes a text blocklist. - * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the {@link Response} on successful completion of {@link Mono}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> deleteTextBlocklistWithResponseAsync( - String blocklistName, RequestOptions requestOptions) { - final String accept = "application/json"; - return FluxUtil.withContext( - context -> - service.deleteTextBlocklist( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - accept, - requestOptions, - context)); - } - - /** - * Delete Text Blocklist By blocklistName - * - *

Deletes a text blocklist. - * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the {@link Response}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - public Response deleteTextBlocklistWithResponse(String blocklistName, RequestOptions requestOptions) { - final String accept = "application/json"; - return service.deleteTextBlocklistSync( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - accept, - requestOptions, - Context.NONE); - } - - /** - * Get All Text Blocklists - * - *

Get all text blocklists details. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return all text blocklists details along with {@link PagedResponse} on successful completion of {@link Mono}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - private Mono> listTextBlocklistsSinglePageAsync(RequestOptions requestOptions) { - final String accept = "application/json"; - return FluxUtil.withContext( - context -> - service.listTextBlocklists( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - accept, - requestOptions, - context)) - .map( - res -> - new PagedResponseBase<>( - res.getRequest(), - res.getStatusCode(), - res.getHeaders(), - getValues(res.getValue(), "value"), - getNextLink(res.getValue(), "nextLink"), - null)); - } - - /** - * Get All Text Blocklists - * - *

Get all text blocklists details. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return all text blocklists details as paginated response with {@link PagedFlux}. - */ - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedFlux listTextBlocklistsAsync(RequestOptions requestOptions) { - RequestOptions requestOptionsForNextPage = new RequestOptions(); - requestOptionsForNextPage.setContext( - requestOptions != null && requestOptions.getContext() != null - ? requestOptions.getContext() - : Context.NONE); - return new PagedFlux<>( - () -> listTextBlocklistsSinglePageAsync(requestOptions), - nextLink -> listTextBlocklistsNextSinglePageAsync(nextLink, requestOptionsForNextPage)); - } - - /** - * Get All Text Blocklists - * - *

Get all text blocklists details. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return all text blocklists details along with {@link PagedResponse}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - private PagedResponse listTextBlocklistsSinglePage(RequestOptions requestOptions) { - final String accept = "application/json"; - Response res = - service.listTextBlocklistsSync( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - accept, - requestOptions, - Context.NONE); - return new PagedResponseBase<>( - res.getRequest(), - res.getStatusCode(), - res.getHeaders(), - getValues(res.getValue(), "value"), - getNextLink(res.getValue(), "nextLink"), - null); - } - - /** - * Get All Text Blocklists - * - *

Get all text blocklists details. - * - *

Response Body Schema - * + *

+ * Response Body Schema + *

*
{@code
      * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return all text blocklists details as paginated response with {@link PagedIterable}. - */ - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedIterable listTextBlocklists(RequestOptions requestOptions) { - RequestOptions requestOptionsForNextPage = new RequestOptions(); - requestOptionsForNextPage.setContext( - requestOptions != null && requestOptions.getContext() != null - ? requestOptions.getContext() - : Context.NONE); - return new PagedIterable<>( - () -> listTextBlocklistsSinglePage(requestOptions), - nextLink -> listTextBlocklistsNextSinglePage(nextLink, requestOptionsForNextPage)); - } - - /** - * Add BlockItems To Text Blocklist - * - *

Add blockItems to a text blocklist. You can add at most 100 BlockItems in one request. - * - *

Request Body Schema - * - *

{@code
-     * {
-     *     blockItems (Required): [
-     *          (Required){
-     *             description: String (Optional)
-     *             text: String (Required)
-     *         }
-     *     ]
-     * }
-     * }
- * - *

Response Body Schema - * - *

{@code
-     * {
-     *     value (Optional): [
-     *          (Optional){
-     *             blockItemId: String (Required)
-     *             description: String (Optional)
-     *             text: String (Required)
-     *         }
-     *     ]
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param addBlockItemsOptions The request of adding blockItems to text blocklist. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the response of adding blockItems to text blocklist along with {@link Response} on successful completion - * of {@link Mono}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> addBlockItemsWithResponseAsync( - String blocklistName, BinaryData addBlockItemsOptions, RequestOptions requestOptions) { - final String accept = "application/json"; - return FluxUtil.withContext( - context -> - service.addBlockItems( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - accept, - addBlockItemsOptions, - requestOptions, - context)); - } - - /** - * Add BlockItems To Text Blocklist - * - *

Add blockItems to a text blocklist. You can add at most 100 BlockItems in one request. - * - *

Request Body Schema - * - *

{@code
-     * {
-     *     blockItems (Required): [
+     *     categoriesAnalysis (Required): [
      *          (Required){
-     *             description: String (Optional)
-     *             text: String (Required)
-     *         }
-     *     ]
-     * }
-     * }
- * - *

Response Body Schema - * - *

{@code
-     * {
-     *     value (Optional): [
-     *          (Optional){
-     *             blockItemId: String (Required)
-     *             description: String (Optional)
-     *             text: String (Required)
+     *             category: String(Hate/SelfHarm/Sexual/Violence) (Required)
+     *             severity: Integer (Optional)
      *         }
      *     ]
      * }
      * }
- * - * @param blocklistName Text blocklist name. - * @param addBlockItemsOptions The request of adding blockItems to text blocklist. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the response of adding blockItems to text blocklist along with {@link Response}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - public Response addBlockItemsWithResponse( - String blocklistName, BinaryData addBlockItemsOptions, RequestOptions requestOptions) { - final String accept = "application/json"; - return service.addBlockItemsSync( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - accept, - addBlockItemsOptions, - requestOptions, - Context.NONE); - } - - /** - * Remove BlockItems From Text Blocklist - * - *

Remove blockItems from a text blocklist. You can remove at most 100 BlockItems in one request. - * - *

Request Body Schema - * - *

{@code
-     * {
-     *     blockItemIds (Required): [
-     *         String (Required)
-     *     ]
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param removeBlockItemsOptions The request of removing blockItems from text blocklist. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the {@link Response} on successful completion of {@link Mono}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> removeBlockItemsWithResponseAsync( - String blocklistName, BinaryData removeBlockItemsOptions, RequestOptions requestOptions) { - final String accept = "application/json"; - return FluxUtil.withContext( - context -> - service.removeBlockItems( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - accept, - removeBlockItemsOptions, - requestOptions, - context)); - } - - /** - * Remove BlockItems From Text Blocklist - * - *

Remove blockItems from a text blocklist. You can remove at most 100 BlockItems in one request. - * - *

Request Body Schema - * - *

{@code
-     * {
-     *     blockItemIds (Required): [
-     *         String (Required)
-     *     ]
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param removeBlockItemsOptions The request of removing blockItems from text blocklist. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return the {@link Response}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - public Response removeBlockItemsWithResponse( - String blocklistName, BinaryData removeBlockItemsOptions, RequestOptions requestOptions) { - final String accept = "application/json"; - return service.removeBlockItemsSync( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - accept, - removeBlockItemsOptions, - requestOptions, - Context.NONE); - } - - /** - * Get BlockItem By blocklistName And blockItemId - * - *

Get blockItem By blockItemId from a text blocklist. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blockItemId: String (Required)
-     *     description: String (Optional)
-     *     text: String (Required)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param blockItemId Block Item Id. It will be uuid. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return blockItem By blockItemId from a text blocklist along with {@link Response} on successful completion of - * {@link Mono}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - public Mono> getTextBlocklistItemWithResponseAsync( - String blocklistName, String blockItemId, RequestOptions requestOptions) { - final String accept = "application/json"; - return FluxUtil.withContext( - context -> - service.getTextBlocklistItem( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - blockItemId, - accept, - requestOptions, - context)); - } - - /** - * Get BlockItem By blocklistName And blockItemId - * - *

Get blockItem By blockItemId from a text blocklist. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blockItemId: String (Required)
-     *     description: String (Optional)
-     *     text: String (Required)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param blockItemId Block Item Id. It will be uuid. + * + * @param options The image analysis request. * @param requestOptions The options to configure the HTTP request before HTTP client sends it. * @throws HttpResponseException thrown if the request is rejected by server. * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return blockItem By blockItemId from a text blocklist along with {@link Response}. + * @return the image analysis response along with {@link Response}. */ @ServiceMethod(returns = ReturnType.SINGLE) - public Response getTextBlocklistItemWithResponse( - String blocklistName, String blockItemId, RequestOptions requestOptions) { + public Response analyzeImageWithResponse(BinaryData options, RequestOptions requestOptions) { final String accept = "application/json"; - return service.getTextBlocklistItemSync( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - blockItemId, - accept, - requestOptions, - Context.NONE); - } - - /** - * Get All BlockItems By blocklistName - * - *

Get all blockItems in a text blocklist. - * - *

Query Parameters - * - * - * - * - * - * - * - *
Query Parameters
NameTypeRequiredDescription
topIntegerNoThe number of result items to return.
skipIntegerNoThe number of result items to skip.
maxpagesizeIntegerNoThe maximum number of result items per page.
- * - * You can add these to a request with {@link RequestOptions#addQueryParam} - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blockItemId: String (Required)
-     *     description: String (Optional)
-     *     text: String (Required)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return all blockItems in a text blocklist along with {@link PagedResponse} on successful completion of {@link - * Mono}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - private Mono> listTextBlocklistItemsSinglePageAsync( - String blocklistName, RequestOptions requestOptions) { - final String accept = "application/json"; - return FluxUtil.withContext( - context -> - service.listTextBlocklistItems( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - accept, - requestOptions, - context)) - .map( - res -> - new PagedResponseBase<>( - res.getRequest(), - res.getStatusCode(), - res.getHeaders(), - getValues(res.getValue(), "value"), - getNextLink(res.getValue(), "nextLink"), - null)); - } - - /** - * Get All BlockItems By blocklistName - * - *

Get all blockItems in a text blocklist. - * - *

Query Parameters - * - * - * - * - * - * - * - *
Query Parameters
NameTypeRequiredDescription
topIntegerNoThe number of result items to return.
skipIntegerNoThe number of result items to skip.
maxpagesizeIntegerNoThe maximum number of result items per page.
- * - * You can add these to a request with {@link RequestOptions#addQueryParam} - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blockItemId: String (Required)
-     *     description: String (Optional)
-     *     text: String (Required)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return all blockItems in a text blocklist as paginated response with {@link PagedFlux}. - */ - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedFlux listTextBlocklistItemsAsync(String blocklistName, RequestOptions requestOptions) { - RequestOptions requestOptionsForNextPage = new RequestOptions(); - requestOptionsForNextPage.setContext( - requestOptions != null && requestOptions.getContext() != null - ? requestOptions.getContext() - : Context.NONE); - return new PagedFlux<>( - (pageSize) -> { - RequestOptions requestOptionsLocal = requestOptions == null ? new RequestOptions() : requestOptions; - if (pageSize != null) { - requestOptionsLocal.addRequestCallback( - requestLocal -> { - UrlBuilder urlBuilder = UrlBuilder.parse(requestLocal.getUrl()); - urlBuilder.setQueryParameter("maxpagesize", String.valueOf(pageSize)); - requestLocal.setUrl(urlBuilder.toString()); - }); - } - return listTextBlocklistItemsSinglePageAsync(blocklistName, requestOptionsLocal); - }, - (nextLink, pageSize) -> { - RequestOptions requestOptionsLocal = new RequestOptions(); - requestOptionsLocal.setContext(requestOptionsForNextPage.getContext()); - if (pageSize != null) { - requestOptionsLocal.addRequestCallback( - requestLocal -> { - UrlBuilder urlBuilder = UrlBuilder.parse(requestLocal.getUrl()); - urlBuilder.setQueryParameter("maxpagesize", String.valueOf(pageSize)); - requestLocal.setUrl(urlBuilder.toString()); - }); - } - return listTextBlocklistItemsNextSinglePageAsync(nextLink, requestOptionsLocal); - }); - } - - /** - * Get All BlockItems By blocklistName - * - *

Get all blockItems in a text blocklist. - * - *

Query Parameters - * - * - * - * - * - * - * - *
Query Parameters
NameTypeRequiredDescription
topIntegerNoThe number of result items to return.
skipIntegerNoThe number of result items to skip.
maxpagesizeIntegerNoThe maximum number of result items per page.
- * - * You can add these to a request with {@link RequestOptions#addQueryParam} - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blockItemId: String (Required)
-     *     description: String (Optional)
-     *     text: String (Required)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return all blockItems in a text blocklist along with {@link PagedResponse}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - private PagedResponse listTextBlocklistItemsSinglePage( - String blocklistName, RequestOptions requestOptions) { - final String accept = "application/json"; - Response res = - service.listTextBlocklistItemsSync( - this.getEndpoint(), - this.getServiceVersion().getVersion(), - blocklistName, - accept, - requestOptions, - Context.NONE); - return new PagedResponseBase<>( - res.getRequest(), - res.getStatusCode(), - res.getHeaders(), - getValues(res.getValue(), "value"), - getNextLink(res.getValue(), "nextLink"), - null); - } - - /** - * Get All BlockItems By blocklistName - * - *

Get all blockItems in a text blocklist. - * - *

Query Parameters - * - * - * - * - * - * - * - *
Query Parameters
NameTypeRequiredDescription
topIntegerNoThe number of result items to return.
skipIntegerNoThe number of result items to skip.
maxpagesizeIntegerNoThe maximum number of result items per page.
- * - * You can add these to a request with {@link RequestOptions#addQueryParam} - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blockItemId: String (Required)
-     *     description: String (Optional)
-     *     text: String (Required)
-     * }
-     * }
- * - * @param blocklistName Text blocklist name. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return all blockItems in a text blocklist as paginated response with {@link PagedIterable}. - */ - @ServiceMethod(returns = ReturnType.COLLECTION) - public PagedIterable listTextBlocklistItems(String blocklistName, RequestOptions requestOptions) { - RequestOptions requestOptionsForNextPage = new RequestOptions(); - requestOptionsForNextPage.setContext( - requestOptions != null && requestOptions.getContext() != null - ? requestOptions.getContext() - : Context.NONE); - return new PagedIterable<>( - (pageSize) -> { - RequestOptions requestOptionsLocal = requestOptions == null ? new RequestOptions() : requestOptions; - if (pageSize != null) { - requestOptionsLocal.addRequestCallback( - requestLocal -> { - UrlBuilder urlBuilder = UrlBuilder.parse(requestLocal.getUrl()); - urlBuilder.setQueryParameter("maxpagesize", String.valueOf(pageSize)); - requestLocal.setUrl(urlBuilder.toString()); - }); - } - return listTextBlocklistItemsSinglePage(blocklistName, requestOptionsLocal); - }, - (nextLink, pageSize) -> { - RequestOptions requestOptionsLocal = new RequestOptions(); - requestOptionsLocal.setContext(requestOptionsForNextPage.getContext()); - if (pageSize != null) { - requestOptionsLocal.addRequestCallback( - requestLocal -> { - UrlBuilder urlBuilder = UrlBuilder.parse(requestLocal.getUrl()); - urlBuilder.setQueryParameter("maxpagesize", String.valueOf(pageSize)); - requestLocal.setUrl(urlBuilder.toString()); - }); - } - return listTextBlocklistItemsNextSinglePage(nextLink, requestOptionsLocal); - }); - } - - /** - * Get All Text Blocklists - * - *

Get the next page of items. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param nextLink The URL to get the next list of items - *

The nextLink parameter. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return paged collection of TextBlocklist items along with {@link PagedResponse} on successful completion of - * {@link Mono}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - private Mono> listTextBlocklistsNextSinglePageAsync( - String nextLink, RequestOptions requestOptions) { - final String accept = "application/json"; - return FluxUtil.withContext( - context -> - service.listTextBlocklistsNext( - nextLink, this.getEndpoint(), accept, requestOptions, context)) - .map( - res -> - new PagedResponseBase<>( - res.getRequest(), - res.getStatusCode(), - res.getHeaders(), - getValues(res.getValue(), "value"), - getNextLink(res.getValue(), "nextLink"), - null)); - } - - /** - * Get All Text Blocklists - * - *

Get the next page of items. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blocklistName: String (Required)
-     *     description: String (Optional)
-     * }
-     * }
- * - * @param nextLink The URL to get the next list of items - *

The nextLink parameter. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return paged collection of TextBlocklist items along with {@link PagedResponse}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - private PagedResponse listTextBlocklistsNextSinglePage(String nextLink, RequestOptions requestOptions) { - final String accept = "application/json"; - Response res = - service.listTextBlocklistsNextSync(nextLink, this.getEndpoint(), accept, requestOptions, Context.NONE); - return new PagedResponseBase<>( - res.getRequest(), - res.getStatusCode(), - res.getHeaders(), - getValues(res.getValue(), "value"), - getNextLink(res.getValue(), "nextLink"), - null); - } - - /** - * Get All BlockItems By blocklistName - * - *

Get the next page of items. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blockItemId: String (Required)
-     *     description: String (Optional)
-     *     text: String (Required)
-     * }
-     * }
- * - * @param nextLink The URL to get the next list of items - *

The nextLink parameter. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return paged collection of TextBlockItem items along with {@link PagedResponse} on successful completion of - * {@link Mono}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - private Mono> listTextBlocklistItemsNextSinglePageAsync( - String nextLink, RequestOptions requestOptions) { - final String accept = "application/json"; - return FluxUtil.withContext( - context -> - service.listTextBlocklistItemsNext( - nextLink, this.getEndpoint(), accept, requestOptions, context)) - .map( - res -> - new PagedResponseBase<>( - res.getRequest(), - res.getStatusCode(), - res.getHeaders(), - getValues(res.getValue(), "value"), - getNextLink(res.getValue(), "nextLink"), - null)); - } - - /** - * Get All BlockItems By blocklistName - * - *

Get the next page of items. - * - *

Response Body Schema - * - *

{@code
-     * {
-     *     blockItemId: String (Required)
-     *     description: String (Optional)
-     *     text: String (Required)
-     * }
-     * }
- * - * @param nextLink The URL to get the next list of items - *

The nextLink parameter. - * @param requestOptions The options to configure the HTTP request before HTTP client sends it. - * @throws HttpResponseException thrown if the request is rejected by server. - * @throws ClientAuthenticationException thrown if the request is rejected by server on status code 401. - * @throws ResourceNotFoundException thrown if the request is rejected by server on status code 404. - * @throws ResourceModifiedException thrown if the request is rejected by server on status code 409. - * @return paged collection of TextBlockItem items along with {@link PagedResponse}. - */ - @ServiceMethod(returns = ReturnType.SINGLE) - private PagedResponse listTextBlocklistItemsNextSinglePage( - String nextLink, RequestOptions requestOptions) { - final String accept = "application/json"; - Response res = - service.listTextBlocklistItemsNextSync( - nextLink, this.getEndpoint(), accept, requestOptions, Context.NONE); - return new PagedResponseBase<>( - res.getRequest(), - res.getStatusCode(), - res.getHeaders(), - getValues(res.getValue(), "value"), - getNextLink(res.getValue(), "nextLink"), - null); - } - - private List getValues(BinaryData binaryData, String path) { - try { - Map obj = binaryData.toObject(Map.class); - List values = (List) obj.get(path); - return values.stream().map(BinaryData::fromObject).collect(Collectors.toList()); - } catch (RuntimeException e) { - return null; - } - } - - private String getNextLink(BinaryData binaryData, String path) { - try { - Map obj = binaryData.toObject(Map.class); - return (String) obj.get(path); - } catch (RuntimeException e) { - return null; - } + return service.analyzeImageSync(this.getEndpoint(), this.getServiceVersion().getVersion(), accept, options, + requestOptions, Context.NONE); } } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/implementation/package-info.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/implementation/package-info.java index a19f389f978a2..8a68c9e7eac13 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/implementation/package-info.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/implementation/package-info.java @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - -/** Package containing the implementations for ContentSafety. Analyze harmful content. */ +/** + * Package containing the implementations for ContentSafety. + * Analyze harmful content. + */ package com.azure.ai.contentsafety.implementation; diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddBlockItemsOptions.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddBlockItemsOptions.java deleted file mode 100644 index 3b62da44952f6..0000000000000 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddBlockItemsOptions.java +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. - -package com.azure.ai.contentsafety.models; - -import com.azure.core.annotation.Generated; -import com.azure.core.annotation.Immutable; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.List; - -/** The request of adding blockItems to text blocklist. */ -@Immutable -public final class AddBlockItemsOptions { - /* - * Array of blockItemInfo to add. - */ - @Generated - @JsonProperty(value = "blockItems") - private List blockItems; - - /** - * Creates an instance of AddBlockItemsOptions class. - * - * @param blockItems the blockItems value to set. - */ - @Generated - @JsonCreator - public AddBlockItemsOptions(@JsonProperty(value = "blockItems") List blockItems) { - this.blockItems = blockItems; - } - - /** - * Get the blockItems property: Array of blockItemInfo to add. - * - * @return the blockItems value. - */ - @Generated - public List getBlockItems() { - return this.blockItems; - } -} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddBlockItemsResult.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddBlockItemsResult.java deleted file mode 100644 index 6657cf2f2fe4d..0000000000000 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddBlockItemsResult.java +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. - -package com.azure.ai.contentsafety.models; - -import com.azure.core.annotation.Generated; -import com.azure.core.annotation.Immutable; -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.List; - -/** The response of adding blockItems to text blocklist. */ -@Immutable -public final class AddBlockItemsResult { - /* - * Array of blockItems added. - */ - @Generated - @JsonProperty(value = "value") - private List value; - - /** Creates an instance of AddBlockItemsResult class. */ - @Generated - private AddBlockItemsResult() {} - - /** - * Get the value property: Array of blockItems added. - * - * @return the value value. - */ - @Generated - public List getValue() { - return this.value; - } -} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddOrUpdateTextBlocklistItemsOptions.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddOrUpdateTextBlocklistItemsOptions.java new file mode 100644 index 0000000000000..f2fe1ed9153ec --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddOrUpdateTextBlocklistItemsOptions.java @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.contentsafety.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +/** + * The request to add blocklistItems to a text blocklist. + */ +@Immutable +public final class AddOrUpdateTextBlocklistItemsOptions { + + /* + * Array of blocklistItems to add. + */ + @Generated + @JsonProperty(value = "blocklistItems") + private List blocklistItems; + + /** + * Creates an instance of AddOrUpdateTextBlocklistItemsOptions class. + * + * @param blocklistItems the blocklistItems value to set. + */ + @Generated + @JsonCreator + public AddOrUpdateTextBlocklistItemsOptions( + @JsonProperty(value = "blocklistItems") List blocklistItems) { + this.blocklistItems = blocklistItems; + } + + /** + * Get the blocklistItems property: Array of blocklistItems to add. + * + * @return the blocklistItems value. + */ + @Generated + public List getBlocklistItems() { + return this.blocklistItems; + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddOrUpdateTextBlocklistItemsResult.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddOrUpdateTextBlocklistItemsResult.java new file mode 100644 index 0000000000000..15fd4cb3e3b2b --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AddOrUpdateTextBlocklistItemsResult.java @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.contentsafety.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +/** + * The response of adding blocklistItems to the text blocklist. + */ +@Immutable +public final class AddOrUpdateTextBlocklistItemsResult { + + /* + * Array of blocklistItems have been added. + */ + @Generated + @JsonProperty(value = "blocklistItems") + private List blocklistItems; + + /** + * Creates an instance of AddOrUpdateTextBlocklistItemsResult class. + * + * @param blocklistItems the blocklistItems value to set. + */ + @Generated + @JsonCreator + private AddOrUpdateTextBlocklistItemsResult( + @JsonProperty(value = "blocklistItems") List blocklistItems) { + this.blocklistItems = blocklistItems; + } + + /** + * Get the blocklistItems property: Array of blocklistItems have been added. + * + * @return the blocklistItems value. + */ + @Generated + public List getBlocklistItems() { + return this.blocklistItems; + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeImageOptions.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeImageOptions.java index 1bae3af92367f..d599b95471f71 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeImageOptions.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeImageOptions.java @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.contentsafety.models; import com.azure.core.annotation.Fluent; @@ -10,24 +9,35 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; -/** The analysis request of the image. */ +/** + * The image analysis request. + */ @Fluent public final class AnalyzeImageOptions { + /* * The image needs to be analyzed. */ @Generated @JsonProperty(value = "image") - private ImageData image; + private ContentSafetyImageData image; /* - * The categories will be analyzed. If not assigned, a default set of the categories' analysis results will be - * returned. + * The categories will be analyzed. If they are not assigned, a default set of analysis results for the categories + * will be returned. */ @Generated @JsonProperty(value = "categories") private List categories; + /* + * This refers to the type of image analysis output. If no value is assigned, the default value will be + * "FourSeverityLevels". + */ + @Generated + @JsonProperty(value = "outputType") + private AnalyzeImageOutputType outputType; + /** * Creates an instance of AnalyzeImageOptions class. * @@ -35,7 +45,7 @@ public final class AnalyzeImageOptions { */ @Generated @JsonCreator - public AnalyzeImageOptions(@JsonProperty(value = "image") ImageData image) { + public AnalyzeImageOptions(@JsonProperty(value = "image") ContentSafetyImageData image) { this.image = image; } @@ -45,13 +55,13 @@ public AnalyzeImageOptions(@JsonProperty(value = "image") ImageData image) { * @return the image value. */ @Generated - public ImageData getImage() { + public ContentSafetyImageData getImage() { return this.image; } /** - * Get the categories property: The categories will be analyzed. If not assigned, a default set of the categories' - * analysis results will be returned. + * Get the categories property: The categories will be analyzed. If they are not assigned, a default set of + * analysis results for the categories will be returned. * * @return the categories value. */ @@ -61,8 +71,8 @@ public List getCategories() { } /** - * Set the categories property: The categories will be analyzed. If not assigned, a default set of the categories' - * analysis results will be returned. + * Set the categories property: The categories will be analyzed. If they are not assigned, a default set of + * analysis results for the categories will be returned. * * @param categories the categories value to set. * @return the AnalyzeImageOptions object itself. @@ -72,4 +82,28 @@ public AnalyzeImageOptions setCategories(List categories) { this.categories = categories; return this; } + + /** + * Get the outputType property: This refers to the type of image analysis output. If no value is assigned, the + * default value will be "FourSeverityLevels". + * + * @return the outputType value. + */ + @Generated + public AnalyzeImageOutputType getOutputType() { + return this.outputType; + } + + /** + * Set the outputType property: This refers to the type of image analysis output. If no value is assigned, the + * default value will be "FourSeverityLevels". + * + * @param outputType the outputType value to set. + * @return the AnalyzeImageOptions object itself. + */ + @Generated + public AnalyzeImageOptions setOutputType(AnalyzeImageOutputType outputType) { + this.outputType = outputType; + return this; + } } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeImageOutputType.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeImageOutputType.java new file mode 100644 index 0000000000000..26b19f3b75a4d --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeImageOutputType.java @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.contentsafety.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.util.ExpandableStringEnum; +import com.fasterxml.jackson.annotation.JsonCreator; +import java.util.Collection; + +/** + * The type of image analysis output. + */ +public final class AnalyzeImageOutputType extends ExpandableStringEnum { + + /** + * Output severities in four levels, the value could be 0,2,4,6. + */ + @Generated + public static final AnalyzeImageOutputType FOUR_SEVERITY_LEVELS = fromString("FourSeverityLevels"); + + /** + * Creates a new instance of AnalyzeImageOutputType value. + * + * @deprecated Use the {@link #fromString(String)} factory method. + */ + @Generated + @Deprecated + public AnalyzeImageOutputType() { + } + + /** + * Creates or finds a AnalyzeImageOutputType from its string representation. + * + * @param name a name to look for. + * @return the corresponding AnalyzeImageOutputType. + */ + @Generated + @JsonCreator + public static AnalyzeImageOutputType fromString(String name) { + return fromString(name, AnalyzeImageOutputType.class); + } + + /** + * Gets known AnalyzeImageOutputType values. + * + * @return known AnalyzeImageOutputType values. + */ + @Generated + public static Collection values() { + return values(AnalyzeImageOutputType.class); + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeImageResult.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeImageResult.java index d33e2980c04d1..c81638c92d426 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeImageResult.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeImageResult.java @@ -1,85 +1,46 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.contentsafety.models; import com.azure.core.annotation.Generated; import com.azure.core.annotation.Immutable; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; -/** The analysis response of the image. */ +/** + * The image analysis response. + */ @Immutable public final class AnalyzeImageResult { - /* - * Analysis result for Hate category. - */ - @Generated - @JsonProperty(value = "hateResult") - private ImageAnalyzeSeverityResult hateResult; /* - * Analysis result for SelfHarm category. - */ - @Generated - @JsonProperty(value = "selfHarmResult") - private ImageAnalyzeSeverityResult selfHarmResult; - - /* - * Analysis result for Sexual category. - */ - @Generated - @JsonProperty(value = "sexualResult") - private ImageAnalyzeSeverityResult sexualResult; - - /* - * Analysis result for Violence category. - */ - @Generated - @JsonProperty(value = "violenceResult") - private ImageAnalyzeSeverityResult violenceResult; - - /** Creates an instance of AnalyzeImageResult class. */ - @Generated - private AnalyzeImageResult() {} - - /** - * Get the hateResult property: Analysis result for Hate category. - * - * @return the hateResult value. + * Analysis result for categories. */ @Generated - public ImageAnalyzeSeverityResult getHateResult() { - return this.hateResult; - } - - /** - * Get the selfHarmResult property: Analysis result for SelfHarm category. - * - * @return the selfHarmResult value. - */ - @Generated - public ImageAnalyzeSeverityResult getSelfHarmResult() { - return this.selfHarmResult; - } + @JsonProperty(value = "categoriesAnalysis") + private List categoriesAnalysis; /** - * Get the sexualResult property: Analysis result for Sexual category. + * Creates an instance of AnalyzeImageResult class. * - * @return the sexualResult value. + * @param categoriesAnalysis the categoriesAnalysis value to set. */ @Generated - public ImageAnalyzeSeverityResult getSexualResult() { - return this.sexualResult; + @JsonCreator + private AnalyzeImageResult( + @JsonProperty(value = "categoriesAnalysis") List categoriesAnalysis) { + this.categoriesAnalysis = categoriesAnalysis; } /** - * Get the violenceResult property: Analysis result for Violence category. + * Get the categoriesAnalysis property: Analysis result for categories. * - * @return the violenceResult value. + * @return the categoriesAnalysis value. */ @Generated - public ImageAnalyzeSeverityResult getViolenceResult() { - return this.violenceResult; + public List getCategoriesAnalysis() { + return this.categoriesAnalysis; } } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeTextOptions.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeTextOptions.java index a6e28b8434de4..21ff6f5a2dd7e 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeTextOptions.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeTextOptions.java @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.contentsafety.models; import com.azure.core.annotation.Fluent; @@ -10,19 +9,23 @@ import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; -/** The analysis request of the text. */ +/** + * The text analysis request. + */ @Fluent public final class AnalyzeTextOptions { + /* - * The text needs to be scanned. We support at most 1000 characters (unicode code points) in text of one request. + * The text needs to be analyzed. We support a maximum of 10k Unicode characters (Unicode code points) in the text + * of one request. */ @Generated @JsonProperty(value = "text") private String text; /* - * The categories will be analyzed. If not assigned, a default set of the categories' analysis results will be - * returned. + * The categories will be analyzed. If they are not assigned, a default set of analysis results for the categories + * will be returned. */ @Generated @JsonProperty(value = "categories") @@ -40,8 +43,16 @@ public final class AnalyzeTextOptions { * When set to false, all analyses of harmful content will be performed, whether or not blocklists are hit. */ @Generated - @JsonProperty(value = "breakByBlocklists") - private Boolean breakByBlocklists; + @JsonProperty(value = "haltOnBlocklistHit") + private Boolean haltOnBlocklistHit; + + /* + * This refers to the type of text analysis output. If no value is assigned, the default value will be + * "FourSeverityLevels". + */ + @Generated + @JsonProperty(value = "outputType") + private AnalyzeTextOutputType outputType; /** * Creates an instance of AnalyzeTextOptions class. @@ -55,8 +66,8 @@ public AnalyzeTextOptions(@JsonProperty(value = "text") String text) { } /** - * Get the text property: The text needs to be scanned. We support at most 1000 characters (unicode code points) in - * text of one request. + * Get the text property: The text needs to be analyzed. We support a maximum of 10k Unicode characters (Unicode + * code points) in the text of one request. * * @return the text value. */ @@ -66,8 +77,8 @@ public String getText() { } /** - * Get the categories property: The categories will be analyzed. If not assigned, a default set of the categories' - * analysis results will be returned. + * Get the categories property: The categories will be analyzed. If they are not assigned, a default set of + * analysis results for the categories will be returned. * * @return the categories value. */ @@ -77,8 +88,8 @@ public List getCategories() { } /** - * Set the categories property: The categories will be analyzed. If not assigned, a default set of the categories' - * analysis results will be returned. + * Set the categories property: The categories will be analyzed. If they are not assigned, a default set of + * analysis results for the categories will be returned. * * @param categories the categories value to set. * @return the AnalyzeTextOptions object itself. @@ -112,28 +123,52 @@ public AnalyzeTextOptions setBlocklistNames(List blocklistNames) { } /** - * Get the breakByBlocklists property: When set to true, further analyses of harmful content will not be performed + * Get the haltOnBlocklistHit property: When set to true, further analyses of harmful content will not be performed * in cases where blocklists are hit. When set to false, all analyses of harmful content will be performed, whether * or not blocklists are hit. * - * @return the breakByBlocklists value. + * @return the haltOnBlocklistHit value. */ @Generated - public Boolean isBreakByBlocklists() { - return this.breakByBlocklists; + public Boolean isHaltOnBlocklistHit() { + return this.haltOnBlocklistHit; } /** - * Set the breakByBlocklists property: When set to true, further analyses of harmful content will not be performed + * Set the haltOnBlocklistHit property: When set to true, further analyses of harmful content will not be performed * in cases where blocklists are hit. When set to false, all analyses of harmful content will be performed, whether * or not blocklists are hit. * - * @param breakByBlocklists the breakByBlocklists value to set. + * @param haltOnBlocklistHit the haltOnBlocklistHit value to set. + * @return the AnalyzeTextOptions object itself. + */ + @Generated + public AnalyzeTextOptions setHaltOnBlocklistHit(Boolean haltOnBlocklistHit) { + this.haltOnBlocklistHit = haltOnBlocklistHit; + return this; + } + + /** + * Get the outputType property: This refers to the type of text analysis output. If no value is assigned, the + * default value will be "FourSeverityLevels". + * + * @return the outputType value. + */ + @Generated + public AnalyzeTextOutputType getOutputType() { + return this.outputType; + } + + /** + * Set the outputType property: This refers to the type of text analysis output. If no value is assigned, the + * default value will be "FourSeverityLevels". + * + * @param outputType the outputType value to set. * @return the AnalyzeTextOptions object itself. */ @Generated - public AnalyzeTextOptions setBreakByBlocklists(Boolean breakByBlocklists) { - this.breakByBlocklists = breakByBlocklists; + public AnalyzeTextOptions setOutputType(AnalyzeTextOutputType outputType) { + this.outputType = outputType; return this; } } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeTextOutputType.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeTextOutputType.java new file mode 100644 index 0000000000000..25a21e33b6de0 --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeTextOutputType.java @@ -0,0 +1,59 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.contentsafety.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.util.ExpandableStringEnum; +import com.fasterxml.jackson.annotation.JsonCreator; +import java.util.Collection; + +/** + * The type of text analysis output. + */ +public final class AnalyzeTextOutputType extends ExpandableStringEnum { + + /** + * Output severities in four levels, the value could be 0,2,4,6. + */ + @Generated + public static final AnalyzeTextOutputType FOUR_SEVERITY_LEVELS = fromString("FourSeverityLevels"); + + /** + * Output severities in eight levels, the value could be 0,1,2,3,4,5,6,7. + */ + @Generated + public static final AnalyzeTextOutputType EIGHT_SEVERITY_LEVELS = fromString("EightSeverityLevels"); + + /** + * Creates a new instance of AnalyzeTextOutputType value. + * + * @deprecated Use the {@link #fromString(String)} factory method. + */ + @Generated + @Deprecated + public AnalyzeTextOutputType() { + } + + /** + * Creates or finds a AnalyzeTextOutputType from its string representation. + * + * @param name a name to look for. + * @return the corresponding AnalyzeTextOutputType. + */ + @Generated + @JsonCreator + public static AnalyzeTextOutputType fromString(String name) { + return fromString(name, AnalyzeTextOutputType.class); + } + + /** + * Gets known AnalyzeTextOutputType values. + * + * @return known AnalyzeTextOutputType values. + */ + @Generated + public static Collection values() { + return values(AnalyzeTextOutputType.class); + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeTextResult.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeTextResult.java index e0ae7ea8e2d2a..21a0a6d339368 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeTextResult.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/AnalyzeTextResult.java @@ -1,103 +1,63 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.contentsafety.models; import com.azure.core.annotation.Generated; import com.azure.core.annotation.Immutable; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; -/** The analysis response of the text. */ +/** + * The text analysis response. + */ @Immutable public final class AnalyzeTextResult { - /* - * The details of blocklist match. - */ - @Generated - @JsonProperty(value = "blocklistsMatchResults") - private List blocklistsMatchResults; /* - * Analysis result for Hate category. + * The blocklist match details. */ @Generated - @JsonProperty(value = "hateResult") - private TextAnalyzeSeverityResult hateResult; + @JsonProperty(value = "blocklistsMatch") + private List blocklistsMatch; /* - * Analysis result for SelfHarm category. - */ - @Generated - @JsonProperty(value = "selfHarmResult") - private TextAnalyzeSeverityResult selfHarmResult; - - /* - * Analysis result for Sexual category. - */ - @Generated - @JsonProperty(value = "sexualResult") - private TextAnalyzeSeverityResult sexualResult; - - /* - * Analysis result for Violence category. - */ - @Generated - @JsonProperty(value = "violenceResult") - private TextAnalyzeSeverityResult violenceResult; - - /** Creates an instance of AnalyzeTextResult class. */ - @Generated - private AnalyzeTextResult() {} - - /** - * Get the blocklistsMatchResults property: The details of blocklist match. - * - * @return the blocklistsMatchResults value. + * Analysis result for categories. */ @Generated - public List getBlocklistsMatchResults() { - return this.blocklistsMatchResults; - } - - /** - * Get the hateResult property: Analysis result for Hate category. - * - * @return the hateResult value. - */ - @Generated - public TextAnalyzeSeverityResult getHateResult() { - return this.hateResult; - } + @JsonProperty(value = "categoriesAnalysis") + private List categoriesAnalysis; /** - * Get the selfHarmResult property: Analysis result for SelfHarm category. + * Creates an instance of AnalyzeTextResult class. * - * @return the selfHarmResult value. + * @param categoriesAnalysis the categoriesAnalysis value to set. */ @Generated - public TextAnalyzeSeverityResult getSelfHarmResult() { - return this.selfHarmResult; + @JsonCreator + private AnalyzeTextResult( + @JsonProperty(value = "categoriesAnalysis") List categoriesAnalysis) { + this.categoriesAnalysis = categoriesAnalysis; } /** - * Get the sexualResult property: Analysis result for Sexual category. + * Get the blocklistsMatch property: The blocklist match details. * - * @return the sexualResult value. + * @return the blocklistsMatch value. */ @Generated - public TextAnalyzeSeverityResult getSexualResult() { - return this.sexualResult; + public List getBlocklistsMatch() { + return this.blocklistsMatch; } /** - * Get the violenceResult property: Analysis result for Violence category. + * Get the categoriesAnalysis property: Analysis result for categories. * - * @return the violenceResult value. + * @return the categoriesAnalysis value. */ @Generated - public TextAnalyzeSeverityResult getViolenceResult() { - return this.violenceResult; + public List getCategoriesAnalysis() { + return this.categoriesAnalysis; } } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ContentSafetyImageData.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ContentSafetyImageData.java new file mode 100644 index 0000000000000..9097a10a7d789 --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ContentSafetyImageData.java @@ -0,0 +1,81 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.contentsafety.models; + +import com.azure.core.annotation.Fluent; +import com.azure.core.annotation.Generated; +import com.azure.core.util.BinaryData; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * The image can be either base64 encoded bytes or a blob URL. You can choose only one of these options. If both are + * provided, the request will be refused. The maximum image size is 2048 x 2048 pixels and should not exceed 4 MB, + * while the minimum image size is 50 x 50 pixels. + */ +@Fluent +public final class ContentSafetyImageData { + + /* + * The Base64 encoding of the image. + */ + @Generated + @JsonProperty(value = "content") + private byte[] content; + + /* + * The blob url of the image. + */ + @Generated + @JsonProperty(value = "blobUrl") + private String blobUrl; + + /** + * Creates an instance of ContentSafetyImageData class. + */ + @Generated + public ContentSafetyImageData() { + } + + /** + * Get the content property: The Base64 encoding of the image. + * + * @return the content value. + */ + public BinaryData getContent() { + return this.content == null ? null : BinaryData.fromBytes(this.content); + } + + /** + * Set the content property: The Base64 encoding of the image. + * + * @param content the content value to set. + * @return the ContentSafetyImageData object itself. + */ + public ContentSafetyImageData setContent(BinaryData content) { + this.content = content == null ? null : content.toBytes(); + return this; + } + + /** + * Get the blobUrl property: The blob url of the image. + * + * @return the blobUrl value. + */ + @Generated + public String getBlobUrl() { + return this.blobUrl; + } + + /** + * Set the blobUrl property: The blob url of the image. + * + * @param blobUrl the blobUrl value to set. + * @return the ContentSafetyImageData object itself. + */ + @Generated + public ContentSafetyImageData setBlobUrl(String blobUrl) { + this.blobUrl = blobUrl; + return this; + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageAnalyzeSeverityResult.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageCategoriesAnalysis.java similarity index 51% rename from sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageAnalyzeSeverityResult.java rename to sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageCategoriesAnalysis.java index 6d341d6ac95b9..478642f2ee5aa 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageAnalyzeSeverityResult.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageCategoriesAnalysis.java @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.contentsafety.models; import com.azure.core.annotation.Generated; @@ -9,39 +8,41 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -/** Image analysis result. */ +/** + * Image analysis result. + */ @Immutable -public final class ImageAnalyzeSeverityResult { +public final class ImageCategoriesAnalysis { + /* - * The image category. + * The image analysis category. */ @Generated @JsonProperty(value = "category") private ImageCategory category; /* - * The higher the severity of input content, the larger this value, currently its value could be: 0,2,4,6. + * The value increases with the severity of the input content. The value of this field is determined by the output + * type specified in the request. The output type could be ‘FourSeverityLevels’, and the output value can be 0, 2, + * 4, 6. */ @Generated @JsonProperty(value = "severity") - private int severity; + private Integer severity; /** - * Creates an instance of ImageAnalyzeSeverityResult class. + * Creates an instance of ImageCategoriesAnalysis class. * * @param category the category value to set. - * @param severity the severity value to set. */ @Generated @JsonCreator - private ImageAnalyzeSeverityResult( - @JsonProperty(value = "category") ImageCategory category, @JsonProperty(value = "severity") int severity) { + private ImageCategoriesAnalysis(@JsonProperty(value = "category") ImageCategory category) { this.category = category; - this.severity = severity; } /** - * Get the category property: The image category. + * Get the category property: The image analysis category. * * @return the category value. */ @@ -51,13 +52,14 @@ public ImageCategory getCategory() { } /** - * Get the severity property: The higher the severity of input content, the larger this value, currently its value - * could be: 0,2,4,6. + * Get the severity property: The value increases with the severity of the input content. The value of this field + * is determined by the output type specified in the request. The output type could be ‘FourSeverityLevels’, and + * the output value can be 0, 2, 4, 6. * * @return the severity value. */ @Generated - public int getSeverity() { + public Integer getSeverity() { return this.severity; } } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageCategory.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageCategory.java index 792251b15473a..36ceb6947c512 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageCategory.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageCategory.java @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.contentsafety.models; import com.azure.core.annotation.Generated; @@ -9,19 +8,34 @@ import com.fasterxml.jackson.annotation.JsonCreator; import java.util.Collection; -/** Image analyze category. */ +/** + * Image analyze category. + */ public final class ImageCategory extends ExpandableStringEnum { - /** Static value Hate for ImageCategory. */ - @Generated public static final ImageCategory HATE = fromString("Hate"); - /** Static value SelfHarm for ImageCategory. */ - @Generated public static final ImageCategory SELF_HARM = fromString("SelfHarm"); + /** + * Static value Hate for ImageCategory. + */ + @Generated + public static final ImageCategory HATE = fromString("Hate"); - /** Static value Sexual for ImageCategory. */ - @Generated public static final ImageCategory SEXUAL = fromString("Sexual"); + /** + * Static value SelfHarm for ImageCategory. + */ + @Generated + public static final ImageCategory SELF_HARM = fromString("SelfHarm"); - /** Static value Violence for ImageCategory. */ - @Generated public static final ImageCategory VIOLENCE = fromString("Violence"); + /** + * Static value Sexual for ImageCategory. + */ + @Generated + public static final ImageCategory SEXUAL = fromString("Sexual"); + + /** + * Static value Violence for ImageCategory. + */ + @Generated + public static final ImageCategory VIOLENCE = fromString("Violence"); /** * Creates a new instance of ImageCategory value. @@ -30,7 +44,8 @@ public final class ImageCategory extends ExpandableStringEnum { */ @Generated @Deprecated - public ImageCategory() {} + public ImageCategory() { + } /** * Creates or finds a ImageCategory from its string representation. diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageData.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageData.java deleted file mode 100644 index 0f33dbeba6b59..0000000000000 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/ImageData.java +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. - -package com.azure.ai.contentsafety.models; - -import com.azure.core.annotation.Fluent; -import com.azure.core.annotation.Generated; -import com.azure.core.util.CoreUtils; -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * The content or blob url of image, could be base64 encoding bytes or blob url. If both are given, the request will be - * refused. The maximum size of image is 2048 pixels * 2048 pixels, no larger than 4MB at the same time. The minimum - * size of image is 50 pixels * 50 pixels. - */ -@Fluent -public final class ImageData { - /* - * Base64 encoding of image. - */ - @Generated - @JsonProperty(value = "content") - private byte[] content; - - /* - * The blob url of image. - */ - @Generated - @JsonProperty(value = "blobUrl") - private String blobUrl; - - /** Creates an instance of ImageData class. */ - @Generated - public ImageData() {} - - /** - * Get the content property: Base64 encoding of image. - * - * @return the content value. - */ - @Generated - public byte[] getContent() { - return CoreUtils.clone(this.content); - } - - /** - * Set the content property: Base64 encoding of image. - * - * @param content the content value to set. - * @return the ImageData object itself. - */ - @Generated - public ImageData setContent(byte[] content) { - this.content = CoreUtils.clone(content); - return this; - } - - /** - * Get the blobUrl property: The blob url of image. - * - * @return the blobUrl value. - */ - @Generated - public String getBlobUrl() { - return this.blobUrl; - } - - /** - * Set the blobUrl property: The blob url of image. - * - * @param blobUrl the blobUrl value to set. - * @return the ImageData object itself. - */ - @Generated - public ImageData setBlobUrl(String blobUrl) { - this.blobUrl = blobUrl; - return this; - } -} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/RemoveBlockItemsOptions.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/RemoveBlockItemsOptions.java deleted file mode 100644 index 72145baba70f0..0000000000000 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/RemoveBlockItemsOptions.java +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. - -package com.azure.ai.contentsafety.models; - -import com.azure.core.annotation.Generated; -import com.azure.core.annotation.Immutable; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.List; - -/** The request of removing blockItems from text blocklist. */ -@Immutable -public final class RemoveBlockItemsOptions { - /* - * Array of blockItemIds to remove. - */ - @Generated - @JsonProperty(value = "blockItemIds") - private List blockItemIds; - - /** - * Creates an instance of RemoveBlockItemsOptions class. - * - * @param blockItemIds the blockItemIds value to set. - */ - @Generated - @JsonCreator - public RemoveBlockItemsOptions(@JsonProperty(value = "blockItemIds") List blockItemIds) { - this.blockItemIds = blockItemIds; - } - - /** - * Get the blockItemIds property: Array of blockItemIds to remove. - * - * @return the blockItemIds value. - */ - @Generated - public List getBlockItemIds() { - return this.blockItemIds; - } -} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/RemoveTextBlocklistItemsOptions.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/RemoveTextBlocklistItemsOptions.java new file mode 100644 index 0000000000000..f98bd7536e898 --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/RemoveTextBlocklistItemsOptions.java @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.contentsafety.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +/** + * The request to remove blocklistItems from a text blocklist. + */ +@Immutable +public final class RemoveTextBlocklistItemsOptions { + + /* + * Array of blocklistItemIds to remove. + */ + @Generated + @JsonProperty(value = "blocklistItemIds") + private List blocklistItemIds; + + /** + * Creates an instance of RemoveTextBlocklistItemsOptions class. + * + * @param blocklistItemIds the blocklistItemIds value to set. + */ + @Generated + @JsonCreator + public RemoveTextBlocklistItemsOptions(@JsonProperty(value = "blocklistItemIds") List blocklistItemIds) { + this.blocklistItemIds = blocklistItemIds; + } + + /** + * Get the blocklistItemIds property: Array of blocklistItemIds to remove. + * + * @return the blocklistItemIds value. + */ + @Generated + public List getBlocklistItemIds() { + return this.blocklistItemIds; + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextAnalyzeSeverityResult.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextAnalyzeSeverityResult.java deleted file mode 100644 index 07d588814dcda..0000000000000 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextAnalyzeSeverityResult.java +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. - -package com.azure.ai.contentsafety.models; - -import com.azure.core.annotation.Generated; -import com.azure.core.annotation.Immutable; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -/** Text analysis result. */ -@Immutable -public final class TextAnalyzeSeverityResult { - /* - * The text category. - */ - @Generated - @JsonProperty(value = "category") - private TextCategory category; - - /* - * The higher the severity of input content, the larger this value is. The values could be: 0,2,4,6. - */ - @Generated - @JsonProperty(value = "severity") - private int severity; - - /** - * Creates an instance of TextAnalyzeSeverityResult class. - * - * @param category the category value to set. - * @param severity the severity value to set. - */ - @Generated - @JsonCreator - private TextAnalyzeSeverityResult( - @JsonProperty(value = "category") TextCategory category, @JsonProperty(value = "severity") int severity) { - this.category = category; - this.severity = severity; - } - - /** - * Get the category property: The text category. - * - * @return the category value. - */ - @Generated - public TextCategory getCategory() { - return this.category; - } - - /** - * Get the severity property: The higher the severity of input content, the larger this value is. The values could - * be: 0,2,4,6. - * - * @return the severity value. - */ - @Generated - public int getSeverity() { - return this.severity; - } -} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlockItem.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlockItem.java deleted file mode 100644 index ed5a89f949cb8..0000000000000 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlockItem.java +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. - -package com.azure.ai.contentsafety.models; - -import com.azure.core.annotation.Generated; -import com.azure.core.annotation.Immutable; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -/** Item in TextBlocklist. */ -@Immutable -public final class TextBlockItem { - /* - * Block Item Id. It will be uuid. - */ - @Generated - @JsonProperty(value = "blockItemId", access = JsonProperty.Access.WRITE_ONLY) - private String blockItemId; - - /* - * Block item description. - */ - @Generated - @JsonProperty(value = "description") - private String description; - - /* - * Block item content. - */ - @Generated - @JsonProperty(value = "text") - private String text; - - /** - * Creates an instance of TextBlockItem class. - * - * @param text the text value to set. - */ - @Generated - @JsonCreator - private TextBlockItem(@JsonProperty(value = "text") String text) { - this.text = text; - } - - /** - * Get the blockItemId property: Block Item Id. It will be uuid. - * - * @return the blockItemId value. - */ - @Generated - public String getBlockItemId() { - return this.blockItemId; - } - - /** - * Get the description property: Block item description. - * - * @return the description value. - */ - @Generated - public String getDescription() { - return this.description; - } - - /** - * Get the text property: Block item content. - * - * @return the text value. - */ - @Generated - public String getText() { - return this.text; - } -} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklist.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklist.java index d21e672989cbd..841d737761337 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklist.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklist.java @@ -1,22 +1,24 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.contentsafety.models; import com.azure.core.annotation.Fluent; import com.azure.core.annotation.Generated; import com.fasterxml.jackson.annotation.JsonProperty; -/** Text Blocklist. */ +/** + * Text Blocklist. + */ @Fluent public final class TextBlocklist { + /* * Text blocklist name. */ @Generated @JsonProperty(value = "blocklistName", access = JsonProperty.Access.WRITE_ONLY) - private String blocklistName; + private String name; /* * Text blocklist description. @@ -25,18 +27,21 @@ public final class TextBlocklist { @JsonProperty(value = "description") private String description; - /** Creates an instance of TextBlocklist class. */ + /** + * Creates an instance of TextBlocklist class. + */ @Generated - public TextBlocklist() {} + public TextBlocklist() { + } /** - * Get the blocklistName property: Text blocklist name. + * Get the name property: Text blocklist name. * - * @return the blocklistName value. + * @return the name value. */ @Generated - public String getBlocklistName() { - return this.blocklistName; + public String getName() { + return this.name; } /** diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlockItemInfo.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklistItem.java similarity index 52% rename from sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlockItemInfo.java rename to sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklistItem.java index b72c12abf0272..b14a3c043d88d 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlockItemInfo.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklistItem.java @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.contentsafety.models; import com.azure.core.annotation.Fluent; @@ -9,36 +8,56 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -/** Block item info in text blocklist. */ +/** + * Item in a TextBlocklist. + */ @Fluent -public final class TextBlockItemInfo { +public final class TextBlocklistItem { + + /* + * The service will generate a BlocklistItemId, which will be a UUID. + */ + @Generated + @JsonProperty(value = "blocklistItemId", access = JsonProperty.Access.WRITE_ONLY) + private String blocklistItemId; + /* - * Block item description. + * BlocklistItem description. */ @Generated @JsonProperty(value = "description") private String description; /* - * Block item content. + * BlocklistItem content. */ @Generated @JsonProperty(value = "text") private String text; /** - * Creates an instance of TextBlockItemInfo class. + * Creates an instance of TextBlocklistItem class. * * @param text the text value to set. */ @Generated @JsonCreator - public TextBlockItemInfo(@JsonProperty(value = "text") String text) { + public TextBlocklistItem(@JsonProperty(value = "text") String text) { this.text = text; } /** - * Get the description property: Block item description. + * Get the blocklistItemId property: The service will generate a BlocklistItemId, which will be a UUID. + * + * @return the blocklistItemId value. + */ + @Generated + public String getBlocklistItemId() { + return this.blocklistItemId; + } + + /** + * Get the description property: BlocklistItem description. * * @return the description value. */ @@ -48,19 +67,19 @@ public String getDescription() { } /** - * Set the description property: Block item description. + * Set the description property: BlocklistItem description. * * @param description the description value to set. - * @return the TextBlockItemInfo object itself. + * @return the TextBlocklistItem object itself. */ @Generated - public TextBlockItemInfo setDescription(String description) { + public TextBlocklistItem setDescription(String description) { this.description = description; return this; } /** - * Get the text property: Block item content. + * Get the text property: BlocklistItem content. * * @return the text value. */ diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklistMatch.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklistMatch.java new file mode 100644 index 0000000000000..e12e49b2c84f2 --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklistMatch.java @@ -0,0 +1,84 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.contentsafety.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * The result of blocklist match. + */ +@Immutable +public final class TextBlocklistMatch { + + /* + * The name of the matched blocklist. + */ + @Generated + @JsonProperty(value = "blocklistName") + private String blocklistName; + + /* + * The ID of the matched item. + */ + @Generated + @JsonProperty(value = "blocklistItemId") + private String blocklistItemId; + + /* + * The content of the matched item. + */ + @Generated + @JsonProperty(value = "blocklistItemText") + private String blocklistItemText; + + /** + * Creates an instance of TextBlocklistMatch class. + * + * @param blocklistName the blocklistName value to set. + * @param blocklistItemId the blocklistItemId value to set. + * @param blocklistItemText the blocklistItemText value to set. + */ + @Generated + @JsonCreator + private TextBlocklistMatch(@JsonProperty(value = "blocklistName") String blocklistName, + @JsonProperty(value = "blocklistItemId") String blocklistItemId, + @JsonProperty(value = "blocklistItemText") String blocklistItemText) { + this.blocklistName = blocklistName; + this.blocklistItemId = blocklistItemId; + this.blocklistItemText = blocklistItemText; + } + + /** + * Get the blocklistName property: The name of the matched blocklist. + * + * @return the blocklistName value. + */ + @Generated + public String getBlocklistName() { + return this.blocklistName; + } + + /** + * Get the blocklistItemId property: The ID of the matched item. + * + * @return the blocklistItemId value. + */ + @Generated + public String getBlocklistItemId() { + return this.blocklistItemId; + } + + /** + * Get the blocklistItemText property: The content of the matched item. + * + * @return the blocklistItemText value. + */ + @Generated + public String getBlocklistItemText() { + return this.blocklistItemText; + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklistMatchResult.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklistMatchResult.java deleted file mode 100644 index 3e23d5a0674b9..0000000000000 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextBlocklistMatchResult.java +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// Code generated by Microsoft (R) TypeSpec Code Generator. - -package com.azure.ai.contentsafety.models; - -import com.azure.core.annotation.Generated; -import com.azure.core.annotation.Immutable; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -/** The result of blocklist match. */ -@Immutable -public final class TextBlocklistMatchResult { - /* - * The name of matched blocklist. - */ - @Generated - @JsonProperty(value = "blocklistName") - private String blocklistName; - - /* - * The id of matched item. - */ - @Generated - @JsonProperty(value = "blockItemId") - private String blockItemId; - - /* - * The content of matched item. - */ - @Generated - @JsonProperty(value = "blockItemText") - private String blockItemText; - - /* - * The character offset of matched text in original input. - */ - @Generated - @JsonProperty(value = "offset") - private int offset; - - /* - * The length of matched text in original input. - */ - @Generated - @JsonProperty(value = "length") - private int length; - - /** - * Creates an instance of TextBlocklistMatchResult class. - * - * @param blocklistName the blocklistName value to set. - * @param blockItemId the blockItemId value to set. - * @param blockItemText the blockItemText value to set. - * @param offset the offset value to set. - * @param length the length value to set. - */ - @Generated - @JsonCreator - private TextBlocklistMatchResult( - @JsonProperty(value = "blocklistName") String blocklistName, - @JsonProperty(value = "blockItemId") String blockItemId, - @JsonProperty(value = "blockItemText") String blockItemText, - @JsonProperty(value = "offset") int offset, - @JsonProperty(value = "length") int length) { - this.blocklistName = blocklistName; - this.blockItemId = blockItemId; - this.blockItemText = blockItemText; - this.offset = offset; - this.length = length; - } - - /** - * Get the blocklistName property: The name of matched blocklist. - * - * @return the blocklistName value. - */ - @Generated - public String getBlocklistName() { - return this.blocklistName; - } - - /** - * Get the blockItemId property: The id of matched item. - * - * @return the blockItemId value. - */ - @Generated - public String getBlockItemId() { - return this.blockItemId; - } - - /** - * Get the blockItemText property: The content of matched item. - * - * @return the blockItemText value. - */ - @Generated - public String getBlockItemText() { - return this.blockItemText; - } - - /** - * Get the offset property: The character offset of matched text in original input. - * - * @return the offset value. - */ - @Generated - public int getOffset() { - return this.offset; - } - - /** - * Get the length property: The length of matched text in original input. - * - * @return the length value. - */ - @Generated - public int getLength() { - return this.length; - } -} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextCategoriesAnalysis.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextCategoriesAnalysis.java new file mode 100644 index 0000000000000..623f87ad2535f --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextCategoriesAnalysis.java @@ -0,0 +1,65 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. +package com.azure.ai.contentsafety.models; + +import com.azure.core.annotation.Generated; +import com.azure.core.annotation.Immutable; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Text analysis result. + */ +@Immutable +public final class TextCategoriesAnalysis { + + /* + * The text analysis category. + */ + @Generated + @JsonProperty(value = "category") + private TextCategory category; + + /* + * The value increases with the severity of the input content. The value of this field is determined by the output + * type specified in the request. The output type could be ‘FourSeverityLevels’ or ‘EightSeverity Levels’, and the + * output value can be 0, 2, 4, 6 or 0, 1, 2, 3, 4, 5, 6, or 7. + */ + @Generated + @JsonProperty(value = "severity") + private Integer severity; + + /** + * Creates an instance of TextCategoriesAnalysis class. + * + * @param category the category value to set. + */ + @Generated + @JsonCreator + private TextCategoriesAnalysis(@JsonProperty(value = "category") TextCategory category) { + this.category = category; + } + + /** + * Get the category property: The text analysis category. + * + * @return the category value. + */ + @Generated + public TextCategory getCategory() { + return this.category; + } + + /** + * Get the severity property: The value increases with the severity of the input content. The value of this field + * is determined by the output type specified in the request. The output type could be ‘FourSeverityLevels’ or + * ‘EightSeverity Levels’, and the output value can be 0, 2, 4, 6 or 0, 1, 2, 3, 4, 5, 6, or 7. + * + * @return the severity value. + */ + @Generated + public Integer getSeverity() { + return this.severity; + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextCategory.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextCategory.java index fd8ced41ef283..fb5942c6f1dca 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextCategory.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/TextCategory.java @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - package com.azure.ai.contentsafety.models; import com.azure.core.annotation.Generated; @@ -9,19 +8,34 @@ import com.fasterxml.jackson.annotation.JsonCreator; import java.util.Collection; -/** Text analyze category. */ +/** + * Text analyze category. + */ public final class TextCategory extends ExpandableStringEnum { - /** Static value Hate for TextCategory. */ - @Generated public static final TextCategory HATE = fromString("Hate"); - /** Static value SelfHarm for TextCategory. */ - @Generated public static final TextCategory SELF_HARM = fromString("SelfHarm"); + /** + * Static value Hate for TextCategory. + */ + @Generated + public static final TextCategory HATE = fromString("Hate"); - /** Static value Sexual for TextCategory. */ - @Generated public static final TextCategory SEXUAL = fromString("Sexual"); + /** + * Static value SelfHarm for TextCategory. + */ + @Generated + public static final TextCategory SELF_HARM = fromString("SelfHarm"); - /** Static value Violence for TextCategory. */ - @Generated public static final TextCategory VIOLENCE = fromString("Violence"); + /** + * Static value Sexual for TextCategory. + */ + @Generated + public static final TextCategory SEXUAL = fromString("Sexual"); + + /** + * Static value Violence for TextCategory. + */ + @Generated + public static final TextCategory VIOLENCE = fromString("Violence"); /** * Creates a new instance of TextCategory value. @@ -30,7 +44,8 @@ public final class TextCategory extends ExpandableStringEnum { */ @Generated @Deprecated - public TextCategory() {} + public TextCategory() { + } /** * Creates or finds a TextCategory from its string representation. diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/package-info.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/package-info.java index adead5a08b8ed..29eab670d8bdd 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/package-info.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/models/package-info.java @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - -/** Package containing the data models for ContentSafety. Analyze harmful content. */ +/** + * Package containing the data models for ContentSafety. + * Analyze harmful content. + */ package com.azure.ai.contentsafety.models; diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/package-info.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/package-info.java index 9cdb8adab125e..23c1b3cb371a5 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/package-info.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/com/azure/ai/contentsafety/package-info.java @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. // Code generated by Microsoft (R) TypeSpec Code Generator. - -/** Package containing the classes for ContentSafety. Analyze harmful content. */ +/** + * Package containing the classes for ContentSafety. + * Analyze harmful content. + */ package com.azure.ai.contentsafety; diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/module-info.java b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/module-info.java index 829e3d2e20132..e93265d61ae97 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/main/java/module-info.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/main/java/module-info.java @@ -8,7 +8,5 @@ exports com.azure.ai.contentsafety; exports com.azure.ai.contentsafety.models; - opens com.azure.ai.contentsafety.models to - com.azure.core, - com.fasterxml.jackson.databind; + opens com.azure.ai.contentsafety.models to com.azure.core, com.fasterxml.jackson.databind; } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/samples/README.md b/sdk/contentsafety/azure-ai-contentsafety/src/samples/README.md new file mode 100644 index 0000000000000..abdefa910194c --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/samples/README.md @@ -0,0 +1,71 @@ +--- +page_type: sample +languages: + - java +products: + - azure + - azure-cognitive-services + - azure-cognitive-services +urlFragment: ai-contentsafety-samples +--- + +# Azure AI Content Safety Samples client library for Java + +This document explains samples and how to use them. + +## Examples + +Following section document various examples. + +### Create Content Safety Client Sample + +* [CreateContentSafetyClient.java][sample_CreateContentSafetyClient] - Contains samples for following scenarios: + * Authenticate client by Key Credential + * Authenticate client by Token Credential + +### Analyze Text Sample + +* [AnalyzeText.java][sample_AnalyzeText] - Contains samples for following scenarios: + * Authenticate client + * Analyze text + +### Analyze Image Samples + +* [AnalyzeImage.java][sample_AnalyzeImage] - Contains samples for following scenarios: + * Authenticate client + * Analyze image + +### Manage text blocklist Samples + +* [ManageTextBlocklist.java][sample_ManageTextBlocklist] - Contains samples for following scenarios: + * Authenticate client + * Create or update text blocklist + * Add blockItems + * Analyze text with blocklists + * List text blocklists + * Get text blocklist + * List blockItems + * Get blockItem + * Remove blockItems + * Delete text blocklist + +## Troubleshooting + +### General + +|Error Code |Possible reasons |Suggestions| +|-----------|-------------------|-----------| +|InvalidRequestBody |One or more fields in the request body do not match the API definition. |1. Check the API version you specified in the API call.
2. Check the corresponding API definition for the API version you selected.| +|InvalidResourceName |The resource name you specified in the URL does not meet the requirements, like the blocklist name, blocklist term ID, etc. |1. Check the API version you specified in the API call.
2. Check whether the given name has invalid characters according to the API definition.| +|ResourceNotFound |The resource you specified in the URL may not exist, like the blocklist name. |1. Check the API version you specified in the API call.
2. Double check the existence of the resource specified in the URL.| +|InternalError |Some unexpected situations on the server side have been triggered. |1. You may want to retry a few times after a small period and see it the issue happens again.
2. Contact Azure Support if this issue persists.| +|ServerBusy |The server side cannot process the request temporarily. |1. You may want to retry a few times after a small period and see it the issue happens again.
2.Contact Azure Support if this issue persists.| +|TooManyRequests |The current RPS has exceeded the quota for your current SKU. |1. Check the pricing table to understand the RPS quota.
2.Contact Azure Support if you need more QPS.| + + + + +[sample_CreateContentSafetyClient]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/AnalyzeText.java +[sample_AnalyzeText]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/AnalyzeText.java +[sample_AnalyzeImage]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/AnalyzeImage.java +[sample_ManageTextBlocklist]: https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/ManageTextBlocklist.java diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/AnalyzeImage.java b/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/AnalyzeImage.java index 0eb16cf98681d..e9ac63cd61e56 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/AnalyzeImage.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/AnalyzeImage.java @@ -6,8 +6,10 @@ import com.azure.ai.contentsafety.models.AnalyzeImageOptions; import com.azure.ai.contentsafety.models.AnalyzeImageResult; -import com.azure.ai.contentsafety.models.ImageData; +import com.azure.ai.contentsafety.models.ContentSafetyImageData; +import com.azure.ai.contentsafety.models.ImageCategoriesAnalysis; import com.azure.core.credential.KeyCredential; +import com.azure.core.util.BinaryData; import com.azure.core.util.Configuration; import java.io.IOException; @@ -24,18 +26,17 @@ public static void main(String[] args) throws IOException { .credential(new KeyCredential(key)) .endpoint(endpoint).buildClient(); - ImageData image = new ImageData(); + ContentSafetyImageData image = new ContentSafetyImageData(); String cwd = System.getProperty("user.dir"); - String source = "/src/samples/resources/image.jpg"; - image.setContent(Files.readAllBytes(Paths.get(cwd, source))); + String source = "/src/samples/resources/image.png"; + image.setContent(BinaryData.fromBytes(Files.readAllBytes(Paths.get(cwd, source)))); AnalyzeImageResult response = - contentSafetyClient.analyzeImage(new AnalyzeImageOptions(image)); + contentSafetyClient.analyzeImage(new AnalyzeImageOptions(image)); - System.out.println("Hate severity: " + response.getHateResult().getSeverity()); - System.out.println("SelfHarm severity: " + response.getSelfHarmResult().getSeverity()); - System.out.println("Sexual severity: " + response.getSexualResult().getSeverity()); - System.out.println("Violence severity: " + response.getViolenceResult().getSeverity()); + for (ImageCategoriesAnalysis result : response.getCategoriesAnalysis()) { + System.out.println(result.getCategory() + " severity: " + result.getSeverity()); + } // END:com.azure.ai.contentsafety.analyzeimage } } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/AnalyzeText.java b/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/AnalyzeText.java index 31eb01c7b5815..21fd78f8ed19d 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/AnalyzeText.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/AnalyzeText.java @@ -6,6 +6,7 @@ import com.azure.ai.contentsafety.models.AnalyzeTextOptions; import com.azure.ai.contentsafety.models.AnalyzeTextResult; +import com.azure.ai.contentsafety.models.TextCategoriesAnalysis; import com.azure.core.credential.KeyCredential; import com.azure.core.util.Configuration; @@ -21,10 +22,9 @@ public static void main(String[] args) { AnalyzeTextResult response = contentSafetyClient.analyzeText(new AnalyzeTextOptions("This is text example")); - System.out.println("Hate severity: " + response.getHateResult().getSeverity()); - System.out.println("SelfHarm severity: " + response.getSelfHarmResult().getSeverity()); - System.out.println("Sexual severity: " + response.getSexualResult().getSeverity()); - System.out.println("Violence severity: " + response.getViolenceResult().getSeverity()); + for (TextCategoriesAnalysis result : response.getCategoriesAnalysis()) { + System.out.println(result.getCategory() + " severity: " + result.getSeverity()); + } // END:com.azure.ai.contentsafety.analyzetext } } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/CreateContentSafetyClient.java b/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/CreateContentSafetyClient.java new file mode 100644 index 0000000000000..1d1ad328a4f9b --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/CreateContentSafetyClient.java @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) AutoRest Code Generator. + +package com.azure.ai.contentsafety; + +import com.azure.core.credential.KeyCredential; +import com.azure.core.util.Configuration; +import com.azure.identity.DefaultAzureCredentialBuilder; + +public class CreateContentSafetyClient { + public static void main(String[] args) { + // BEGIN:com.azure.ai.contentsafety.createcontentsafetyclient + String endpoint = Configuration.getGlobalConfiguration().get("CONTENT_SAFETY_ENDPOINT"); + String key = Configuration.getGlobalConfiguration().get("CONTENT_SAFETY_KEY"); + ContentSafetyClient contentSafetyClient = new ContentSafetyClientBuilder() + .credential(new KeyCredential(key)) + .endpoint(endpoint).buildClient(); + // END:com.azure.ai.contentsafety.createcontentsafetyclient + + // BEGIN:com.azure.ai.contentsafety.createcontentsafetyclienttoken + ContentSafetyClient contentSafetyClientOauth = new ContentSafetyClientBuilder() + .credential(new DefaultAzureCredentialBuilder().build()) + .endpoint(endpoint).buildClient(); + // END:com.azure.ai.contentsafety.createcontentsafetyclienttoken + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/ManageTextBlocklist.java b/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/ManageTextBlocklist.java index ee40b1e93eee4..71c295a1a3735 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/ManageTextBlocklist.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/samples/java/com/azure/ai/contentsafety/ManageTextBlocklist.java @@ -4,15 +4,15 @@ package com.azure.ai.contentsafety; -import com.azure.ai.contentsafety.models.TextBlockItem; -import com.azure.ai.contentsafety.models.TextBlocklistMatchResult; -import com.azure.ai.contentsafety.models.AddBlockItemsResult; -import com.azure.ai.contentsafety.models.TextBlockItemInfo; -import com.azure.ai.contentsafety.models.RemoveBlockItemsOptions; + +import com.azure.ai.contentsafety.models.AddOrUpdateTextBlocklistItemsOptions; +import com.azure.ai.contentsafety.models.AddOrUpdateTextBlocklistItemsResult; import com.azure.ai.contentsafety.models.AnalyzeTextOptions; import com.azure.ai.contentsafety.models.AnalyzeTextResult; +import com.azure.ai.contentsafety.models.RemoveTextBlocklistItemsOptions; import com.azure.ai.contentsafety.models.TextBlocklist; -import com.azure.ai.contentsafety.models.AddBlockItemsOptions; +import com.azure.ai.contentsafety.models.TextBlocklistItem; +import com.azure.ai.contentsafety.models.TextBlocklistMatch; import com.azure.core.credential.KeyCredential; import com.azure.core.exception.HttpResponseException; import com.azure.core.http.rest.PagedIterable; @@ -29,14 +29,14 @@ public class ManageTextBlocklist { public static void main(String[] args) { - // BEGIN:com.azure.ai.contentsafety.createClient + // BEGIN:com.azure.ai.contentsafety.createblocklistclient String endpoint = Configuration.getGlobalConfiguration().get("CONTENT_SAFETY_ENDPOINT"); String key = Configuration.getGlobalConfiguration().get("CONTENT_SAFETY_KEY"); - ContentSafetyClient contentSafetyClient = new ContentSafetyClientBuilder() + BlocklistClient blocklistClient = new BlocklistClientBuilder() .credential(new KeyCredential(key)) .endpoint(endpoint).buildClient(); - // END:com.azure.ai.contentsafety.createClient + // END:com.azure.ai.contentsafety.createblocklistclient // BEGIN:com.azure.ai.contentsafety.createtextblocklist String blocklistName = "TestBlocklist"; @@ -45,7 +45,7 @@ public static void main(String[] args) { BinaryData resource = BinaryData.fromObject(description); RequestOptions requestOptions = new RequestOptions(); Response response = - contentSafetyClient.createOrUpdateTextBlocklistWithResponse(blocklistName, resource, requestOptions); + blocklistClient.createOrUpdateTextBlocklistWithResponse(blocklistName, resource, requestOptions); if (response.getStatusCode() == 201) { System.out.println("\nBlocklist " + blocklistName + " created."); } else if (response.getStatusCode() == 200) { @@ -56,13 +56,14 @@ public static void main(String[] args) { // BEGIN:com.azure.ai.contentsafety.addblockitems String blockItemText1 = "k*ll"; String blockItemText2 = "h*te"; - List blockItems = Arrays.asList(new TextBlockItemInfo(blockItemText1).setDescription("Kill word"), - new TextBlockItemInfo(blockItemText2).setDescription("Hate word")); - AddBlockItemsResult addedBlockItems = contentSafetyClient.addBlockItems(blocklistName, new AddBlockItemsOptions(blockItems)); - if (addedBlockItems != null && addedBlockItems.getValue() != null) { + List blockItems = Arrays.asList(new TextBlocklistItem(blockItemText1).setDescription("Kill word"), + new TextBlocklistItem(blockItemText2).setDescription("Hate word")); + AddOrUpdateTextBlocklistItemsResult addedBlockItems = blocklistClient.addOrUpdateBlocklistItems(blocklistName, + new AddOrUpdateTextBlocklistItemsOptions(blockItems)); + if (addedBlockItems != null && addedBlockItems.getBlocklistItems() != null) { System.out.println("\nBlockItems added:"); - for (TextBlockItem addedBlockItem : addedBlockItems.getValue()) { - System.out.println("BlockItemId: " + addedBlockItem.getBlockItemId() + ", Text: " + addedBlockItem.getText() + ", Description: " + addedBlockItem.getDescription()); + for (TextBlocklistItem addedBlockItem : addedBlockItems.getBlocklistItems()) { + System.out.println("BlockItemId: " + addedBlockItem.getBlocklistItemId() + ", Text: " + addedBlockItem.getText() + ", Description: " + addedBlockItem.getDescription()); } } // END:com.azure.ai.contentsafety.addblockitems @@ -70,9 +71,12 @@ public static void main(String[] args) { // BEGIN:com.azure.ai.contentsafety.analyzetextwithblocklist // After you edit your blocklist, it usually takes effect in 5 minutes, please wait some time before analyzing with blocklist after editing. + ContentSafetyClient contentSafetyClient = new ContentSafetyClientBuilder() + .credential(new KeyCredential(key)) + .endpoint(endpoint).buildClient(); AnalyzeTextOptions request = new AnalyzeTextOptions("I h*te you and I want to k*ll you"); - request.getBlocklistNames().add(blocklistName); - request.setBreakByBlocklists(true); + request.setBlocklistNames(Arrays.asList(blocklistName)); + request.setHaltOnBlocklistHit(true); AnalyzeTextResult analyzeTextResult; try { @@ -82,55 +86,54 @@ public static void main(String[] args) { throw ex; } - if (analyzeTextResult.getBlocklistsMatchResults() != null) { + if (analyzeTextResult.getBlocklistsMatch() != null) { System.out.println("\nBlocklist match result:"); - for (TextBlocklistMatchResult matchResult : analyzeTextResult.getBlocklistsMatchResults()) { - System.out.println("Blockitem was hit in text: Offset: " + matchResult.getOffset() + ", Length: " + matchResult.getLength()); - System.out.println("BlocklistName: " + matchResult.getBlocklistName() + ", BlockItemId: " + matchResult.getBlockItemId() + ", BlockItemText: " + matchResult.getBlockItemText()); + for (TextBlocklistMatch matchResult : analyzeTextResult.getBlocklistsMatch()) { + System.out.println("BlocklistName: " + matchResult.getBlocklistName() + ", BlockItemId: " + matchResult.getBlocklistItemId() + ", BlockItemText: " + matchResult.getBlocklistItemText()); } } // END:com.azure.ai.contentsafety.analyzetextwithblocklist // BEGIN:com.azure.ai.contentsafety.listtextblocklists - PagedIterable allTextBlocklists = contentSafetyClient.listTextBlocklists(); + PagedIterable allTextBlocklists = blocklistClient.listTextBlocklists(); System.out.println("\nList Blocklist:"); for (TextBlocklist blocklist : allTextBlocklists) { - System.out.println("Blocklist: " + blocklist.getBlocklistName() + ", Description: " + blocklist.getDescription()); + System.out.println("Blocklist: " + blocklist.getName() + ", Description: " + blocklist.getDescription()); } // END:com.azure.ai.contentsafety.listtextblocklists // BEGIN:com.azure.ai.contentsafety.gettextblocklist - TextBlocklist getBlocklist = contentSafetyClient.getTextBlocklist(blocklistName); + TextBlocklist getBlocklist = blocklistClient.getTextBlocklist(blocklistName); if (getBlocklist != null) { System.out.println("\nGet blocklist:"); - System.out.println("BlocklistName: " + getBlocklist.getBlocklistName() + ", Description: " + getBlocklist.getDescription()); + System.out.println("BlocklistName: " + getBlocklist.getName() + ", Description: " + getBlocklist.getDescription()); } // END:com.azure.ai.contentsafety.gettextblocklist // BEGIN:com.azure.ai.contentsafety.listtextblocklistitems - PagedIterable allBlockitems = contentSafetyClient.listTextBlocklistItems(blocklistName); + PagedIterable allBlockitems = blocklistClient.listTextBlocklistItems(blocklistName); System.out.println("\nList BlockItems:"); - for (TextBlockItem blocklistItem : allBlockitems) { - System.out.println("BlockItemId: " + blocklistItem.getBlockItemId() + ", Text: " + blocklistItem.getText() + ", Description: " + blocklistItem.getDescription()); + for (TextBlocklistItem blocklistItem : allBlockitems) { + System.out.println("BlockItemId: " + blocklistItem.getBlocklistItemId() + ", Text: " + blocklistItem.getText() + ", Description: " + blocklistItem.getDescription()); } // END:com.azure.ai.contentsafety.listtextblocklistitems // BEGIN:com.azure.ai.contentsafety.gettextblocklistitem - String getBlockItemId = addedBlockItems.getValue().get(0).getBlockItemId(); - TextBlockItem getBlockItem = contentSafetyClient.getTextBlocklistItem(blocklistName, getBlockItemId); + String getBlockItemId = addedBlockItems.getBlocklistItems().get(0).getBlocklistItemId(); + TextBlocklistItem getBlockItem = blocklistClient.getTextBlocklistItem(blocklistName, getBlockItemId); System.out.println("\nGet BlockItem:"); - System.out.println("BlockItemId: " + getBlockItem.getBlockItemId() + ", Text: " + getBlockItem.getText() + ", Description: " + getBlockItem.getDescription()); + System.out.println("BlockItemId: " + getBlockItem.getBlocklistItemId() + ", Text: " + getBlockItem.getText() + ", Description: " + getBlockItem.getDescription()); // END:com.azure.ai.contentsafety.gettextblocklistitem // BEGIN:com.azure.ai.contentsafety.removeblockitems - String removeBlockItemId = addedBlockItems.getValue().get(0).getBlockItemId(); + String removeBlockItemId = addedBlockItems.getBlocklistItems().get(0).getBlocklistItemId(); List removeBlockItemIds = new ArrayList<>(); removeBlockItemIds.add(removeBlockItemId); - contentSafetyClient.removeBlockItems(blocklistName, new RemoveBlockItemsOptions(removeBlockItemIds)); + blocklistClient.removeBlocklistItems(blocklistName, new RemoveTextBlocklistItemsOptions(removeBlockItemIds)); // END:com.azure.ai.contentsafety.removeblockitems // BEGIN:com.azure.ai.contentsafety.deletetextblocklist - contentSafetyClient.deleteTextBlocklist(blocklistName); + blocklistClient.deleteTextBlocklist(blocklistName); // END:com.azure.ai.contentsafety.deletetextblocklist } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/samples/resources/image.jpg b/sdk/contentsafety/azure-ai-contentsafety/src/samples/resources/image.jpg deleted file mode 100644 index 1edbaf9f2936ab494fb627ad46ae1c8b02dc33af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25175 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 diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/samples/resources/image.png b/sdk/contentsafety/azure-ai-contentsafety/src/samples/resources/image.png new file mode 100644 index 0000000000000000000000000000000000000000..87d3705f297938f5339db668e13485ca20574e93 GIT binary patch literal 346196 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"YE!-8 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

%42XuyyfIXKw;<6Z)q!V* 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 m*4F&||9)z_Icw)+O1}mez~|s?njfzK0000 responseBlocklistsMatchResults = response.getBlocklistsMatch(); + Assertions.assertEquals(0, responseBlocklistsMatchResults.size()); + TextCategoriesAnalysis responseHateResult = response.getCategoriesAnalysis().get(0); + Assertions.assertNotNull(responseHateResult); + + TextCategory responseHateResultCategory = responseHateResult.getCategory(); + Assertions.assertEquals(TextCategory.HATE, responseHateResultCategory); + int responseHateResultSeverity = responseHateResult.getSeverity(); + Assertions.assertEquals(0, responseHateResultSeverity); + TextCategoriesAnalysis responseSelfHarmResult = response.getCategoriesAnalysis().get(1); + Assertions.assertNotNull(responseSelfHarmResult); + + TextCategory responseSelfHarmResultCategory = responseSelfHarmResult.getCategory(); + Assertions.assertEquals(TextCategory.SELF_HARM, responseSelfHarmResultCategory); + int responseSelfHarmResultSeverity = responseSelfHarmResult.getSeverity(); + Assertions.assertEquals(0, responseSelfHarmResultSeverity); + TextCategoriesAnalysis responseSexualResult = response.getCategoriesAnalysis().get(2); + Assertions.assertNotNull(responseSexualResult); + + TextCategory responseSexualResultCategory = responseSexualResult.getCategory(); + Assertions.assertEquals(TextCategory.SEXUAL, responseSexualResultCategory); + int responseSexualResultSeverity = responseSexualResult.getSeverity(); + Assertions.assertEquals(0, responseSexualResultSeverity); + TextCategoriesAnalysis responseViolenceResult = response.getCategoriesAnalysis().get(3); + Assertions.assertNotNull(responseViolenceResult); + + TextCategory responseViolenceResultCategory = responseViolenceResult.getCategory(); + Assertions.assertEquals(TextCategory.VIOLENCE, responseViolenceResultCategory); + int responseViolenceResultSeverity = responseViolenceResult.getSeverity(); + Assertions.assertEquals(0, responseViolenceResultSeverity); + } + + @Test + public void testAnalyzeTextAsyncWithText() { + // method invocation + AnalyzeTextResult response = contentSafetyAsyncClient.analyzeText("This is text example").block(); + + // response assertion + Assertions.assertNotNull(response); + + List responseBlocklistsMatchResults = response.getBlocklistsMatch(); + Assertions.assertEquals(0, responseBlocklistsMatchResults.size()); + TextCategoriesAnalysis responseHateResult = response.getCategoriesAnalysis().get(0); + Assertions.assertNotNull(responseHateResult); + + TextCategory responseHateResultCategory = responseHateResult.getCategory(); + Assertions.assertEquals(TextCategory.HATE, responseHateResultCategory); + int responseHateResultSeverity = responseHateResult.getSeverity(); + Assertions.assertEquals(0, responseHateResultSeverity); + TextCategoriesAnalysis responseSelfHarmResult = response.getCategoriesAnalysis().get(1); + Assertions.assertNotNull(responseSelfHarmResult); + + TextCategory responseSelfHarmResultCategory = responseSelfHarmResult.getCategory(); + Assertions.assertEquals(TextCategory.SELF_HARM, responseSelfHarmResultCategory); + int responseSelfHarmResultSeverity = responseSelfHarmResult.getSeverity(); + Assertions.assertEquals(0, responseSelfHarmResultSeverity); + TextCategoriesAnalysis responseSexualResult = response.getCategoriesAnalysis().get(2); + Assertions.assertNotNull(responseSexualResult); + + TextCategory responseSexualResultCategory = responseSexualResult.getCategory(); + Assertions.assertEquals(TextCategory.SEXUAL, responseSexualResultCategory); + int responseSexualResultSeverity = responseSexualResult.getSeverity(); + Assertions.assertEquals(0, responseSexualResultSeverity); + TextCategoriesAnalysis responseViolenceResult = response.getCategoriesAnalysis().get(3); + Assertions.assertNotNull(responseViolenceResult); + + TextCategory responseViolenceResultCategory = responseViolenceResult.getCategory(); + Assertions.assertEquals(TextCategory.VIOLENCE, responseViolenceResultCategory); + int responseViolenceResultSeverity = responseViolenceResult.getSeverity(); + Assertions.assertEquals(0, responseViolenceResultSeverity); + } + + @Test + public void testAnalyzeTextAsyncEightSeverity() { + // method invocation + AnalyzeTextResult response = contentSafetyAsyncClient.analyzeText(new AnalyzeTextOptions("This is text example") + .setOutputType(AnalyzeTextOutputType.EIGHT_SEVERITY_LEVELS)).block(); + + // response assertion + Assertions.assertNotNull(response); + + List responseBlocklistsMatchResults = response.getBlocklistsMatch(); + Assertions.assertEquals(0, responseBlocklistsMatchResults.size()); + TextCategoriesAnalysis responseHateResult = response.getCategoriesAnalysis().get(0); + Assertions.assertNotNull(responseHateResult); + + TextCategory responseHateResultCategory = responseHateResult.getCategory(); + Assertions.assertEquals(TextCategory.HATE, responseHateResultCategory); + int responseHateResultSeverity = responseHateResult.getSeverity(); + Assertions.assertEquals(0, responseHateResultSeverity); + TextCategoriesAnalysis responseSelfHarmResult = response.getCategoriesAnalysis().get(1); + Assertions.assertNotNull(responseSelfHarmResult); + + TextCategory responseSelfHarmResultCategory = responseSelfHarmResult.getCategory(); + Assertions.assertEquals(TextCategory.SELF_HARM, responseSelfHarmResultCategory); + int responseSelfHarmResultSeverity = responseSelfHarmResult.getSeverity(); + Assertions.assertEquals(0, responseSelfHarmResultSeverity); + TextCategoriesAnalysis responseSexualResult = response.getCategoriesAnalysis().get(2); + Assertions.assertNotNull(responseSexualResult); + + TextCategory responseSexualResultCategory = responseSexualResult.getCategory(); + Assertions.assertEquals(TextCategory.SEXUAL, responseSexualResultCategory); + int responseSexualResultSeverity = responseSexualResult.getSeverity(); + Assertions.assertEquals(0, responseSexualResultSeverity); + TextCategoriesAnalysis responseViolenceResult = response.getCategoriesAnalysis().get(3); + Assertions.assertNotNull(responseViolenceResult); + + TextCategory responseViolenceResultCategory = responseViolenceResult.getCategory(); + Assertions.assertEquals(TextCategory.VIOLENCE, responseViolenceResultCategory); + int responseViolenceResultSeverity = responseViolenceResult.getSeverity(); + Assertions.assertEquals(0, responseViolenceResultSeverity); + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/AnalyzeTextTests.java b/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/AnalyzeTextTests.java index 3a7cca60a64fc..1e73d543797f6 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/AnalyzeTextTests.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/AnalyzeTextTests.java @@ -4,7 +4,12 @@ package com.azure.ai.contentsafety; -import com.azure.ai.contentsafety.models.*; +import com.azure.ai.contentsafety.models.AnalyzeTextOptions; +import com.azure.ai.contentsafety.models.AnalyzeTextOutputType; +import com.azure.ai.contentsafety.models.AnalyzeTextResult; +import com.azure.ai.contentsafety.models.TextBlocklistMatch; +import com.azure.ai.contentsafety.models.TextCategoriesAnalysis; +import com.azure.ai.contentsafety.models.TextCategory; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -19,30 +24,150 @@ public void testAnalyzeTextTests() { // response assertion Assertions.assertNotNull(response); - List responseBlocklistsMatchResults = response.getBlocklistsMatchResults(); + List responseBlocklistsMatchResults = response.getBlocklistsMatch(); Assertions.assertEquals(0, responseBlocklistsMatchResults.size()); - TextAnalyzeSeverityResult responseHateResult = response.getHateResult(); + TextCategoriesAnalysis responseHateResult = response.getCategoriesAnalysis().get(0); Assertions.assertNotNull(responseHateResult); TextCategory responseHateResultCategory = responseHateResult.getCategory(); Assertions.assertEquals(TextCategory.HATE, responseHateResultCategory); int responseHateResultSeverity = responseHateResult.getSeverity(); Assertions.assertEquals(0, responseHateResultSeverity); - TextAnalyzeSeverityResult responseSelfHarmResult = response.getSelfHarmResult(); + TextCategoriesAnalysis responseSelfHarmResult = response.getCategoriesAnalysis().get(1); Assertions.assertNotNull(responseSelfHarmResult); TextCategory responseSelfHarmResultCategory = responseSelfHarmResult.getCategory(); Assertions.assertEquals(TextCategory.SELF_HARM, responseSelfHarmResultCategory); int responseSelfHarmResultSeverity = responseSelfHarmResult.getSeverity(); Assertions.assertEquals(0, responseSelfHarmResultSeverity); - TextAnalyzeSeverityResult responseSexualResult = response.getSexualResult(); + TextCategoriesAnalysis responseSexualResult = response.getCategoriesAnalysis().get(2); Assertions.assertNotNull(responseSexualResult); TextCategory responseSexualResultCategory = responseSexualResult.getCategory(); Assertions.assertEquals(TextCategory.SEXUAL, responseSexualResultCategory); int responseSexualResultSeverity = responseSexualResult.getSeverity(); Assertions.assertEquals(0, responseSexualResultSeverity); - TextAnalyzeSeverityResult responseViolenceResult = response.getViolenceResult(); + TextCategoriesAnalysis responseViolenceResult = response.getCategoriesAnalysis().get(3); + Assertions.assertNotNull(responseViolenceResult); + + TextCategory responseViolenceResultCategory = responseViolenceResult.getCategory(); + Assertions.assertEquals(TextCategory.VIOLENCE, responseViolenceResultCategory); + int responseViolenceResultSeverity = responseViolenceResult.getSeverity(); + Assertions.assertEquals(0, responseViolenceResultSeverity); + } + + @Test + public void testAnalyzeTextTestsOAuth() { + // method invocation + AnalyzeTextResult response = contentSafetyClientAAD.analyzeText(new AnalyzeTextOptions("This is text example")); + + // response assertion + Assertions.assertNotNull(response); + + List responseBlocklistsMatchResults = response.getBlocklistsMatch(); + Assertions.assertEquals(0, responseBlocklistsMatchResults.size()); + TextCategoriesAnalysis responseHateResult = response.getCategoriesAnalysis().get(0); + Assertions.assertNotNull(responseHateResult); + + TextCategory responseHateResultCategory = responseHateResult.getCategory(); + Assertions.assertEquals(TextCategory.HATE, responseHateResultCategory); + int responseHateResultSeverity = responseHateResult.getSeverity(); + Assertions.assertEquals(0, responseHateResultSeverity); + TextCategoriesAnalysis responseSelfHarmResult = response.getCategoriesAnalysis().get(1); + Assertions.assertNotNull(responseSelfHarmResult); + + TextCategory responseSelfHarmResultCategory = responseSelfHarmResult.getCategory(); + Assertions.assertEquals(TextCategory.SELF_HARM, responseSelfHarmResultCategory); + int responseSelfHarmResultSeverity = responseSelfHarmResult.getSeverity(); + Assertions.assertEquals(0, responseSelfHarmResultSeverity); + TextCategoriesAnalysis responseSexualResult = response.getCategoriesAnalysis().get(2); + Assertions.assertNotNull(responseSexualResult); + + TextCategory responseSexualResultCategory = responseSexualResult.getCategory(); + Assertions.assertEquals(TextCategory.SEXUAL, responseSexualResultCategory); + int responseSexualResultSeverity = responseSexualResult.getSeverity(); + Assertions.assertEquals(0, responseSexualResultSeverity); + TextCategoriesAnalysis responseViolenceResult = response.getCategoriesAnalysis().get(3); + Assertions.assertNotNull(responseViolenceResult); + + TextCategory responseViolenceResultCategory = responseViolenceResult.getCategory(); + Assertions.assertEquals(TextCategory.VIOLENCE, responseViolenceResultCategory); + int responseViolenceResultSeverity = responseViolenceResult.getSeverity(); + Assertions.assertEquals(0, responseViolenceResultSeverity); + } + @Test + public void testAnalyzeTextWithText() { + // method invocation + AnalyzeTextResult response = contentSafetyClient.analyzeText("This is text example"); + + // response assertion + Assertions.assertNotNull(response); + + List responseBlocklistsMatchResults = response.getBlocklistsMatch(); + Assertions.assertEquals(0, responseBlocklistsMatchResults.size()); + TextCategoriesAnalysis responseHateResult = response.getCategoriesAnalysis().get(0); + Assertions.assertNotNull(responseHateResult); + + TextCategory responseHateResultCategory = responseHateResult.getCategory(); + Assertions.assertEquals(TextCategory.HATE, responseHateResultCategory); + int responseHateResultSeverity = responseHateResult.getSeverity(); + Assertions.assertEquals(0, responseHateResultSeverity); + TextCategoriesAnalysis responseSelfHarmResult = response.getCategoriesAnalysis().get(1); + Assertions.assertNotNull(responseSelfHarmResult); + + TextCategory responseSelfHarmResultCategory = responseSelfHarmResult.getCategory(); + Assertions.assertEquals(TextCategory.SELF_HARM, responseSelfHarmResultCategory); + int responseSelfHarmResultSeverity = responseSelfHarmResult.getSeverity(); + Assertions.assertEquals(0, responseSelfHarmResultSeverity); + TextCategoriesAnalysis responseSexualResult = response.getCategoriesAnalysis().get(2); + Assertions.assertNotNull(responseSexualResult); + + TextCategory responseSexualResultCategory = responseSexualResult.getCategory(); + Assertions.assertEquals(TextCategory.SEXUAL, responseSexualResultCategory); + int responseSexualResultSeverity = responseSexualResult.getSeverity(); + Assertions.assertEquals(0, responseSexualResultSeverity); + TextCategoriesAnalysis responseViolenceResult = response.getCategoriesAnalysis().get(3); + Assertions.assertNotNull(responseViolenceResult); + + TextCategory responseViolenceResultCategory = responseViolenceResult.getCategory(); + Assertions.assertEquals(TextCategory.VIOLENCE, responseViolenceResultCategory); + int responseViolenceResultSeverity = responseViolenceResult.getSeverity(); + Assertions.assertEquals(0, responseViolenceResultSeverity); + } + + @Test + public void testAnalyzeTextEightSeverity() { + // method invocation + AnalyzeTextResult response = contentSafetyClient.analyzeText(new AnalyzeTextOptions("This is text example") + .setOutputType(AnalyzeTextOutputType.EIGHT_SEVERITY_LEVELS)); + + // response assertion + Assertions.assertNotNull(response); + + List responseBlocklistsMatchResults = response.getBlocklistsMatch(); + Assertions.assertEquals(0, responseBlocklistsMatchResults.size()); + TextCategoriesAnalysis responseHateResult = response.getCategoriesAnalysis().get(0); + Assertions.assertNotNull(responseHateResult); + + TextCategory responseHateResultCategory = responseHateResult.getCategory(); + Assertions.assertEquals(TextCategory.HATE, responseHateResultCategory); + int responseHateResultSeverity = responseHateResult.getSeverity(); + Assertions.assertEquals(0, responseHateResultSeverity); + TextCategoriesAnalysis responseSelfHarmResult = response.getCategoriesAnalysis().get(1); + Assertions.assertNotNull(responseSelfHarmResult); + + TextCategory responseSelfHarmResultCategory = responseSelfHarmResult.getCategory(); + Assertions.assertEquals(TextCategory.SELF_HARM, responseSelfHarmResultCategory); + int responseSelfHarmResultSeverity = responseSelfHarmResult.getSeverity(); + Assertions.assertEquals(0, responseSelfHarmResultSeverity); + TextCategoriesAnalysis responseSexualResult = response.getCategoriesAnalysis().get(2); + Assertions.assertNotNull(responseSexualResult); + + TextCategory responseSexualResultCategory = responseSexualResult.getCategory(); + Assertions.assertEquals(TextCategory.SEXUAL, responseSexualResultCategory); + int responseSexualResultSeverity = responseSexualResult.getSeverity(); + Assertions.assertEquals(0, responseSexualResultSeverity); + TextCategoriesAnalysis responseViolenceResult = response.getCategoriesAnalysis().get(3); Assertions.assertNotNull(responseViolenceResult); TextCategory responseViolenceResultCategory = responseViolenceResult.getCategory(); diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/ContentSafetyClientTestBase.java b/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/ContentSafetyClientTestBase.java index d4c30f8f3570d..2818844cfaed2 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/ContentSafetyClientTestBase.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/ContentSafetyClientTestBase.java @@ -8,6 +8,7 @@ // If you wish to modify these files, please copy them out of the 'generated' package, and modify there. // See https://aka.ms/azsdk/dpg/java/tests for guide on adding a test. +import com.azure.core.credential.AccessToken; import com.azure.core.credential.KeyCredential; import com.azure.core.http.HttpClient; import com.azure.core.http.policy.HttpLogDetailLevel; @@ -15,25 +16,84 @@ import com.azure.core.test.TestMode; import com.azure.core.test.TestProxyTestBase; import com.azure.core.util.Configuration; +import com.azure.identity.DefaultAzureCredentialBuilder; +import reactor.core.publisher.Mono; + +import java.time.OffsetDateTime; class ContentSafetyClientTestBase extends TestProxyTestBase { protected ContentSafetyClient contentSafetyClient; + protected ContentSafetyClient contentSafetyClientAAD; + protected ContentSafetyAsyncClient contentSafetyAsyncClient; + protected BlocklistClient blocklistClient; + protected BlocklistAsyncClient blocklistAsyncClient; @Override protected void beforeTest() { String endpoint = Configuration.getGlobalConfiguration().get("CONTENT_SAFETY_ENDPOINT", "https://fake_cs_resource.cognitiveservices.azure.com"); String key = Configuration.getGlobalConfiguration().get("CONTENT_SAFETY_KEY", "00000000000000000000000000000000"); - ContentSafetyClientBuilder contentSafetyClientbuilder = + ContentSafetyClientBuilder contentSafetyClientBuilder = + new ContentSafetyClientBuilder() + .credential(new KeyCredential(key)) + .endpoint(endpoint) + .httpClient(HttpClient.createDefault()) + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BASIC)); + if (getTestMode() == TestMode.PLAYBACK) { + contentSafetyClientBuilder.httpClient(interceptorManager.getPlaybackClient()); + } else if (getTestMode() == TestMode.RECORD) { + contentSafetyClientBuilder.addPolicy(interceptorManager.getRecordPolicy()); + } + contentSafetyClient = contentSafetyClientBuilder.buildClient(); + + ContentSafetyClientBuilder contentSafetyClientAADBuilder = + new ContentSafetyClientBuilder() + .credential(new DefaultAzureCredentialBuilder().build()) + .endpoint(endpoint) + .httpClient(HttpClient.createDefault()) + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BASIC)); + if (getTestMode() == TestMode.PLAYBACK) { + contentSafetyClientAADBuilder.httpClient(interceptorManager.getPlaybackClient()) + .credential(request -> Mono.just(new AccessToken("this_is_a_token", OffsetDateTime.MAX))); + } else if (getTestMode() == TestMode.RECORD) { + contentSafetyClientAADBuilder.addPolicy(interceptorManager.getRecordPolicy()); + } + contentSafetyClientAAD = contentSafetyClientAADBuilder.buildClient(); + + ContentSafetyClientBuilder contentSafetyAsyncClientBuilder = new ContentSafetyClientBuilder() .credential(new KeyCredential(key)) .endpoint(endpoint) .httpClient(HttpClient.createDefault()) .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BASIC)); if (getTestMode() == TestMode.PLAYBACK) { - contentSafetyClientbuilder.httpClient(interceptorManager.getPlaybackClient()); + contentSafetyAsyncClientBuilder.httpClient(interceptorManager.getPlaybackClient()); + } else if (getTestMode() == TestMode.RECORD) { + contentSafetyAsyncClientBuilder.addPolicy(interceptorManager.getRecordPolicy()); + } + contentSafetyAsyncClient = contentSafetyAsyncClientBuilder.buildAsyncClient(); + + BlocklistClientBuilder blocklistClientBuilder = new BlocklistClientBuilder() + .credential(new KeyCredential(key)) + .endpoint(endpoint) + .httpClient(HttpClient.createDefault()) + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BASIC)); + if (getTestMode() == TestMode.PLAYBACK) { + blocklistClientBuilder.httpClient(interceptorManager.getPlaybackClient()); + } else if (getTestMode() == TestMode.RECORD) { + blocklistClientBuilder.addPolicy(interceptorManager.getRecordPolicy()); + } + blocklistClient = blocklistClientBuilder.buildClient(); + + BlocklistClientBuilder blocklistAsyncClientBuilder = new BlocklistClientBuilder() + .credential(new KeyCredential(key)) + .endpoint(endpoint) + .httpClient(HttpClient.createDefault()) + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BASIC)); + if (getTestMode() == TestMode.PLAYBACK) { + blocklistAsyncClientBuilder.httpClient(interceptorManager.getPlaybackClient()); } else if (getTestMode() == TestMode.RECORD) { - contentSafetyClientbuilder.addPolicy(interceptorManager.getRecordPolicy()); + blocklistAsyncClientBuilder.addPolicy(interceptorManager.getRecordPolicy()); } - contentSafetyClient = contentSafetyClientbuilder.buildClient(); + blocklistAsyncClient = blocklistClientBuilder.buildAsyncClient(); } } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/ManageTextBlocklistAsyncTests.java b/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/ManageTextBlocklistAsyncTests.java new file mode 100644 index 0000000000000..ca8ba587d7b80 --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/ManageTextBlocklistAsyncTests.java @@ -0,0 +1,148 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) AutoRest Code Generator. + +package com.azure.ai.contentsafety; + +import com.azure.ai.contentsafety.models.AddOrUpdateTextBlocklistItemsOptions; +import com.azure.ai.contentsafety.models.AddOrUpdateTextBlocklistItemsResult; +import com.azure.ai.contentsafety.models.RemoveTextBlocklistItemsOptions; +import com.azure.ai.contentsafety.models.TextBlocklist; +import com.azure.ai.contentsafety.models.TextBlocklistItem; +import com.azure.core.http.rest.PagedFlux; +import com.azure.core.http.rest.RequestOptions; +import com.azure.core.http.rest.Response; +import com.azure.core.util.BinaryData; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; + +import java.util.Arrays; +import java.util.List; + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public final class ManageTextBlocklistAsyncTests extends ContentSafetyClientTestBase { + private static String blocklistName = "blocklistTestAsync"; + private static String blocklistItemId = ""; + + @Test + @Order(1) + public void testCreateOrUpdateTextBlocklistTests() { + BinaryData resource = BinaryData.fromString("{\"description\":\"Test Blocklist\"}"); + RequestOptions requestOptions = new RequestOptions(); + Response response = + blocklistAsyncClient.createOrUpdateTextBlocklistWithResponse(blocklistName, resource, requestOptions).block(); + Assertions.assertEquals(201, response.getStatusCode()); + } + + + @Test + @Order(2) + public void testGetAllTextBlocklistsTests() { + // method invocation + PagedFlux response = blocklistAsyncClient.listTextBlocklists(); + + // response assertion + TextBlocklist firstItem = response.blockFirst(); + Assertions.assertNotNull(firstItem); + + String firstItemBlocklistName = firstItem.getName(); + Assertions.assertEquals(blocklistName, firstItemBlocklistName); + String firstItemDescription = firstItem.getDescription(); + Assertions.assertEquals("Test Blocklist", firstItemDescription); + + } + + @Test + @Order(3) + public void testGetTextBlocklistByBlocklistNameTests() { + // method invocation + TextBlocklist response = blocklistAsyncClient.getTextBlocklist(blocklistName).block(); + + // response assertion + Assertions.assertNotNull(response); + + String responseBlocklistName = response.getName(); + Assertions.assertEquals(blocklistName, responseBlocklistName); + String responseDescription = response.getDescription(); + Assertions.assertEquals("Test Blocklist", responseDescription); + } + + @Test + @Order(4) + public void testAddBlockItemsToTextBlocklistTests() { + // method invocation + AddOrUpdateTextBlocklistItemsResult response = + blocklistAsyncClient.addOrUpdateBlocklistItems( + blocklistName, + new AddOrUpdateTextBlocklistItemsOptions( + Arrays.asList(new TextBlocklistItem("fuck").setDescription("fuck word"), + new TextBlocklistItem("hate").setDescription("hate word"), + new TextBlocklistItem("violence").setDescription("violence word"), + new TextBlocklistItem("sex").setDescription("sex word")))).block(); + + // response assertion + Assertions.assertNotNull(response); + Assertions.assertEquals(4, response.getBlocklistItems().size()); + + List responseValue = response.getBlocklistItems(); + TextBlocklistItem responseValueFirstItem = responseValue.get(0); + + Assertions.assertNotNull(responseValueFirstItem); + Assertions.assertEquals("fuck word", responseValueFirstItem.getDescription()); + Assertions.assertEquals("fuck", responseValueFirstItem.getText()); + Assertions.assertNotNull(responseValueFirstItem.getBlocklistItemId()); + blocklistItemId = new String(responseValueFirstItem.getBlocklistItemId()); + System.out.println("debug blocklistItemId: " + blocklistItemId); + } + + @Test + @Order(5) + public void testGetAllBlockItemsByBlocklistNameTests() { + // method invocation + PagedFlux response = blocklistAsyncClient.listTextBlocklistItems(blocklistName, 2, 1); + + // response assertion + TextBlocklistItem firstItem = response.blockFirst(); + Assertions.assertNotNull(firstItem); + Assertions.assertEquals("violence word", firstItem.getDescription()); + Assertions.assertEquals("violence", firstItem.getText()); + } + + @Test + @Order(6) + public void testGetBlockItemByBlocklistNameAndBlockItemIdTests() { + // method invocation + System.out.println("debug blocklistItemId: " + blocklistItemId); + TextBlocklistItem response = + blocklistAsyncClient.getTextBlocklistItem(blocklistName, blocklistItemId).block(); + + // response assertion + Assertions.assertNotNull(response); + + String responseBlockItemId = response.getBlocklistItemId(); + Assertions.assertEquals(blocklistItemId, responseBlockItemId); + String responseDescription = response.getDescription(); + Assertions.assertEquals("fuck word", responseDescription); + String responseText = response.getText(); + Assertions.assertEquals("fuck", responseText); + } + + @Test + @Order(7) + public void testRemoveBlockItemsFromTextBlocklistTests() { + // method invocation + System.out.println("debug blocklistItemId: " + blocklistItemId); + blocklistAsyncClient.removeBlocklistItems( + blocklistName, new RemoveTextBlocklistItemsOptions(Arrays.asList(blocklistItemId))); + } + + @Test + @Order(8) + public void testDeleteTextBlocklistByBlocklistNameTests() { + // method invocation + blocklistAsyncClient.deleteTextBlocklist(blocklistName).block(); + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/ManageTextBlocklistTests.java b/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/ManageTextBlocklistTests.java index df30d63c007ee..b603ea2ec770e 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/ManageTextBlocklistTests.java +++ b/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/ManageTextBlocklistTests.java @@ -4,7 +4,11 @@ package com.azure.ai.contentsafety; -import com.azure.ai.contentsafety.models.*; +import com.azure.ai.contentsafety.models.AddOrUpdateTextBlocklistItemsOptions; +import com.azure.ai.contentsafety.models.AddOrUpdateTextBlocklistItemsResult; +import com.azure.ai.contentsafety.models.RemoveTextBlocklistItemsOptions; +import com.azure.ai.contentsafety.models.TextBlocklist; +import com.azure.ai.contentsafety.models.TextBlocklistItem; import com.azure.core.http.rest.PagedIterable; import com.azure.core.http.rest.RequestOptions; import com.azure.core.http.rest.Response; @@ -19,13 +23,14 @@ public final class ManageTextBlocklistTests extends ContentSafetyClientTestBase { private static String blocklistName = "blocklistTest"; private static String blocklistItemId = ""; + @Test @Order(1) public void testCreateOrUpdateTextBlocklistTests() { BinaryData resource = BinaryData.fromString("{\"description\":\"Test Blocklist\"}"); RequestOptions requestOptions = new RequestOptions(); Response response = - contentSafetyClient.createOrUpdateTextBlocklistWithResponse(blocklistName, resource, requestOptions); + blocklistClient.createOrUpdateTextBlocklistWithResponse(blocklistName, resource, requestOptions); Assertions.assertEquals(201, response.getStatusCode()); } @@ -34,14 +39,14 @@ public void testCreateOrUpdateTextBlocklistTests() { @Order(2) public void testGetAllTextBlocklistsTests() { // method invocation - PagedIterable response = contentSafetyClient.listTextBlocklists(); + PagedIterable response = blocklistClient.listTextBlocklists(); // response assertion Assertions.assertEquals(200, response.iterableByPage().iterator().next().getStatusCode()); TextBlocklist firstItem = response.iterator().next(); Assertions.assertNotNull(firstItem); - String firstItemBlocklistName = firstItem.getBlocklistName(); + String firstItemBlocklistName = firstItem.getName(); Assertions.assertEquals(blocklistName, firstItemBlocklistName); String firstItemDescription = firstItem.getDescription(); Assertions.assertEquals("Test Blocklist", firstItemDescription); @@ -52,12 +57,12 @@ public void testGetAllTextBlocklistsTests() { @Order(3) public void testGetTextBlocklistByBlocklistNameTests() { // method invocation - TextBlocklist response = contentSafetyClient.getTextBlocklist(blocklistName); + TextBlocklist response = blocklistClient.getTextBlocklist(blocklistName); // response assertion Assertions.assertNotNull(response); - String responseBlocklistName = response.getBlocklistName(); + String responseBlocklistName = response.getName(); Assertions.assertEquals(blocklistName, responseBlocklistName); String responseDescription = response.getDescription(); Assertions.assertEquals("Test Blocklist", responseDescription); @@ -67,24 +72,27 @@ public void testGetTextBlocklistByBlocklistNameTests() { @Order(4) public void testAddBlockItemsToTextBlocklistTests() { // method invocation - AddBlockItemsResult response = - contentSafetyClient.addBlockItems( + AddOrUpdateTextBlocklistItemsResult response = + blocklistClient.addOrUpdateBlocklistItems( blocklistName, - new AddBlockItemsOptions( - Arrays.asList(new TextBlockItemInfo("fuck").setDescription("fuck word")))); + new AddOrUpdateTextBlocklistItemsOptions( + Arrays.asList(new TextBlocklistItem("fuck").setDescription("fuck word"), + new TextBlocklistItem("hate").setDescription("hate word"), + new TextBlocklistItem("violence").setDescription("violence word"), + new TextBlocklistItem("sex").setDescription("sex word")))); // response assertion Assertions.assertNotNull(response); - Assertions.assertEquals(1, response.getValue().size()); + Assertions.assertEquals(4, response.getBlocklistItems().size()); - List responseValue = response.getValue(); - TextBlockItem responseValueFirstItem = responseValue.get(0); + List responseValue = response.getBlocklistItems(); + TextBlocklistItem responseValueFirstItem = responseValue.get(0); Assertions.assertNotNull(responseValueFirstItem); Assertions.assertEquals("fuck word", responseValueFirstItem.getDescription()); Assertions.assertEquals("fuck", responseValueFirstItem.getText()); - Assertions.assertNotNull(responseValueFirstItem.getBlockItemId()); - blocklistItemId = new String(responseValueFirstItem.getBlockItemId()); + Assertions.assertNotNull(responseValueFirstItem.getBlocklistItemId()); + blocklistItemId = new String(responseValueFirstItem.getBlocklistItemId()); System.out.println("debug blocklistItemId: " + blocklistItemId); } @@ -92,13 +100,14 @@ public void testAddBlockItemsToTextBlocklistTests() { @Order(5) public void testGetAllBlockItemsByBlocklistNameTests() { // method invocation - PagedIterable response = contentSafetyClient.listTextBlocklistItems(blocklistName, null, null); + PagedIterable response = blocklistClient.listTextBlocklistItems(blocklistName, 2, 1); // response assertion - Optional firstItem = response.stream().findFirst(); + Assertions.assertEquals(2, response.stream().count()); + Optional firstItem = response.stream().findFirst(); Assertions.assertNotNull(firstItem); - Assertions.assertEquals("fuck word", firstItem.get().getDescription()); - Assertions.assertEquals("fuck", firstItem.get().getText()); + Assertions.assertEquals("violence word", firstItem.get().getDescription()); + Assertions.assertEquals("violence", firstItem.get().getText()); } @Test @@ -106,13 +115,13 @@ public void testGetAllBlockItemsByBlocklistNameTests() { public void testGetBlockItemByBlocklistNameAndBlockItemIdTests() { // method invocation System.out.println("debug blocklistItemId: " + blocklistItemId); - TextBlockItem response = - contentSafetyClient.getTextBlocklistItem(blocklistName, blocklistItemId); + TextBlocklistItem response = + blocklistClient.getTextBlocklistItem(blocklistName, blocklistItemId); // response assertion Assertions.assertNotNull(response); - String responseBlockItemId = response.getBlockItemId(); + String responseBlockItemId = response.getBlocklistItemId(); Assertions.assertEquals(blocklistItemId, responseBlockItemId); String responseDescription = response.getDescription(); Assertions.assertEquals("fuck word", responseDescription); @@ -125,14 +134,14 @@ public void testGetBlockItemByBlocklistNameAndBlockItemIdTests() { public void testRemoveBlockItemsFromTextBlocklistTests() { // method invocation System.out.println("debug blocklistItemId: " + blocklistItemId); - contentSafetyClient.removeBlockItems( - blocklistName, new RemoveBlockItemsOptions(Arrays.asList(blocklistItemId))); + blocklistClient.removeBlocklistItems( + blocklistName, new RemoveTextBlocklistItemsOptions(Arrays.asList(blocklistItemId))); } @Test @Order(8) public void testDeleteTextBlocklistByBlocklistNameTests() { // method invocation - contentSafetyClient.deleteTextBlocklist(blocklistName); + blocklistClient.deleteTextBlocklist(blocklistName); } } diff --git a/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/generated/ContentSafetyClientTestBase.java b/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/generated/ContentSafetyClientTestBase.java new file mode 100644 index 0000000000000..ba5bcb72dfbe9 --- /dev/null +++ b/sdk/contentsafety/azure-ai-contentsafety/src/test/java/com/azure/ai/contentsafety/generated/ContentSafetyClientTestBase.java @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// Code generated by Microsoft (R) TypeSpec Code Generator. + +package com.azure.ai.contentsafety.generated; + +// The Java test files under 'generated' package are generated for your reference. +// If you wish to modify these files, please copy them out of the 'generated' package, and modify there. +// See https://aka.ms/azsdk/dpg/java/tests for guide on adding a test. + +import com.azure.ai.contentsafety.BlocklistClient; +import com.azure.ai.contentsafety.BlocklistClientBuilder; +import com.azure.ai.contentsafety.ContentSafetyClient; +import com.azure.ai.contentsafety.ContentSafetyClientBuilder; +import com.azure.core.credential.AccessToken; +import com.azure.core.http.HttpClient; +import com.azure.core.http.policy.HttpLogDetailLevel; +import com.azure.core.http.policy.HttpLogOptions; +import com.azure.core.test.TestMode; +import com.azure.core.test.TestProxyTestBase; +import com.azure.core.util.Configuration; +import com.azure.identity.DefaultAzureCredentialBuilder; +import java.time.OffsetDateTime; +import reactor.core.publisher.Mono; + +class ContentSafetyClientTestBase extends TestProxyTestBase { + protected ContentSafetyClient contentSafetyClient; + + protected BlocklistClient blocklistClient; + + @Override + protected void beforeTest() { + ContentSafetyClientBuilder contentSafetyClientbuilder = new ContentSafetyClientBuilder() + .endpoint(Configuration.getGlobalConfiguration().get("ENDPOINT", "endpoint")) + .httpClient(HttpClient.createDefault()) + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BASIC)); + if (getTestMode() == TestMode.PLAYBACK) { + contentSafetyClientbuilder.httpClient(interceptorManager.getPlaybackClient()) + .credential(request -> Mono.just(new AccessToken("this_is_a_token", OffsetDateTime.MAX))); + } else if (getTestMode() == TestMode.RECORD) { + contentSafetyClientbuilder.addPolicy(interceptorManager.getRecordPolicy()) + .credential(new DefaultAzureCredentialBuilder().build()); + } else if (getTestMode() == TestMode.LIVE) { + contentSafetyClientbuilder.credential(new DefaultAzureCredentialBuilder().build()); + } + contentSafetyClient = contentSafetyClientbuilder.buildClient(); + + BlocklistClientBuilder blocklistClientbuilder + = new BlocklistClientBuilder().endpoint(Configuration.getGlobalConfiguration().get("ENDPOINT", "endpoint")) + .httpClient(HttpClient.createDefault()) + .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BASIC)); + if (getTestMode() == TestMode.PLAYBACK) { + blocklistClientbuilder.httpClient(interceptorManager.getPlaybackClient()) + .credential(request -> Mono.just(new AccessToken("this_is_a_token", OffsetDateTime.MAX))); + } else if (getTestMode() == TestMode.RECORD) { + blocklistClientbuilder.addPolicy(interceptorManager.getRecordPolicy()) + .credential(new DefaultAzureCredentialBuilder().build()); + } else if (getTestMode() == TestMode.LIVE) { + blocklistClientbuilder.credential(new DefaultAzureCredentialBuilder().build()); + } + blocklistClient = blocklistClientbuilder.buildClient(); + + } +} diff --git a/sdk/contentsafety/azure-ai-contentsafety/tsp-location.yaml b/sdk/contentsafety/azure-ai-contentsafety/tsp-location.yaml index 36893b3adfe0c..f08f1912274a9 100644 --- a/sdk/contentsafety/azure-ai-contentsafety/tsp-location.yaml +++ b/sdk/contentsafety/azure-ai-contentsafety/tsp-location.yaml @@ -1,5 +1,5 @@ directory: specification/cognitiveservices/ContentSafety -repo: Azure/azure-rest-api-specs -commit: b253e331e2f0365f698e88eb3058a4f69bcc502a +commit: 91ada2b6fbdb06456e440807e5b4706110930c49 additionalDirectories: [] +repo: Azure/azure-rest-api-specs