Use AI Guardrails SDK for .NET to create and manage custom text libraries for text anti-spam scenarios. Text libraries let you define terms and patterns that control how content is classified — as blocked, allowed, or flagged for review.
Library types and categories
Text libraries are classified along two dimensions.
By content type:
| Type | LibType value | Description |
|---|---|---|
| Term library | textKeyword | Matches exact or near-exact keywords |
| Text pattern library | similarText | Matches text based on similarity patterns |
By purpose:
| Category | Category value | Effect |
|---|---|---|
| Blacklist | BLACK | Content matching entries is blocked |
| Whitelist | WHITE | Content matching entries is allowed |
| Review list | REVIEW | Content matching entries is flagged for manual review |
Prerequisites
Before you begin, ensure that you have:
Installed the .NET dependencies using the required .NET version. See Install .NET dependencies.
Set your AccessKey ID and AccessKey secret as environment variables:
ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET
Use the exact .NET version specified in the installation topic. Using an unsupported version causes subsequent API calls to fail.
Query text libraries
DescribeKeywordLibRequest returns all text libraries associated with your account — including those used for text anti-spam, image ad moderation, and audio anti-spam. Use the LibType, ResourceType, and Source fields to filter the results.
Query term libraries:
using System;
using Newtonsoft.Json;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Green.Model.V20170823;
using System.Collections.Generic;
namespace csharp_sdk_sample
{
class Program
{
static void Main(string[] args)
{
// Load credentials from environment variables
DefaultProfile profile = DefaultProfile.GetProfile(
"cn-shanghai",
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
DefaultAcsClient client = new DefaultAcsClient(profile);
DescribeKeywordLibRequest request = new DescribeKeywordLibRequest();
request.ServiceModule = "open_api";
try
{
DescribeKeywordLibResponse response = client.GetAcsResponse(request);
Console.WriteLine(System.Text.Encoding.Default.GetString(response.HttpResponse.Content));
List<DescribeKeywordLibResponse.DescribeKeywordLib_KeywordLib> allLibs = response.KeywordLibList;
List<DescribeKeywordLibResponse.DescribeKeywordLib_KeywordLib> termLibs = new List<DescribeKeywordLibResponse.DescribeKeywordLib_KeywordLib>();
foreach (DescribeKeywordLibResponse.DescribeKeywordLib_KeywordLib lib in allLibs)
{
// Filter custom term libraries: LibType=textKeyword, ResourceType=TEXT, Source=MANUAL
if ("textKeyword".Equals(lib.LibType) && "TEXT".Equals(lib.ResourceType) && "MANUAL".Equals(lib.Source))
{
termLibs.Add(lib);
}
// Filter feedback-based term libraries: LibType=textKeyword, ResourceType=TEXT, Source=FEEDBACK
if ("textKeyword".Equals(lib.LibType) && "TEXT".Equals(lib.ResourceType) && "FEEDBACK".Equals(lib.Source))
{
termLibs.Add(lib);
}
}
Console.WriteLine(JsonConvert.SerializeObject(termLibs));
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
}
}Query text pattern libraries:
using System;
using Newtonsoft.Json;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Green.Model.V20170823;
using System.Collections.Generic;
namespace csharp_sdk_sample
{
class Program
{
static void Main(string[] args)
{
// Load credentials from environment variables
DefaultProfile profile = DefaultProfile.GetProfile(
"cn-shanghai",
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
DefaultAcsClient client = new DefaultAcsClient(profile);
DescribeKeywordLibRequest request = new DescribeKeywordLibRequest();
request.ServiceModule = "open_api";
try
{
DescribeKeywordLibResponse response = client.GetAcsResponse(request);
Console.WriteLine(System.Text.Encoding.Default.GetString(response.HttpResponse.Content));
List<DescribeKeywordLibResponse.DescribeKeywordLib_KeywordLib> allLibs = response.KeywordLibList;
List<DescribeKeywordLibResponse.DescribeKeywordLib_KeywordLib> patternLibs = new List<DescribeKeywordLibResponse.DescribeKeywordLib_KeywordLib>();
foreach (DescribeKeywordLibResponse.DescribeKeywordLib_KeywordLib lib in allLibs)
{
// Filter custom text pattern libraries: LibType=similarText, ResourceType=TEXT, Source=MANUAL
if ("similarText".Equals(lib.LibType) && "TEXT".Equals(lib.ResourceType) && "MANUAL".Equals(lib.Source))
{
patternLibs.Add(lib);
}
// Filter feedback-based text pattern libraries: LibType=similarText, ResourceType=TEXT, Source=FEEDBACK
if ("similarText".Equals(lib.LibType) && "TEXT".Equals(lib.ResourceType) && "FEEDBACK".Equals(lib.Source))
{
patternLibs.Add(lib);
}
}
Console.WriteLine(JsonConvert.SerializeObject(patternLibs));
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
}
}For the full list of query parameters, see Get a list of text libraries.
Create a text library
Use CreateKeywordLibRequest to create a term library or text pattern library. Set ResourceType to TEXT for text anti-spam use cases.
Create a term library:
using System;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Green.Model.V20170823;
namespace csharp_sdk_sample
{
class Program
{
static void Main(string[] args)
{
// Load credentials from environment variables
DefaultProfile profile = DefaultProfile.GetProfile(
"cn-shanghai",
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
DefaultAcsClient client = new DefaultAcsClient(profile);
CreateKeywordLibRequest request = new CreateKeywordLibRequest();
request.ServiceModule = "open_api";
request.Name = "Term library for testing";
request.ResourceType = "TEXT"; // For text anti-spam
request.LibType = "textKeyword"; // Term library
request.Category = "BLACK"; // Blacklist; also supports WHITE and REVIEW
try
{
CreateKeywordLibResponse response = client.GetAcsResponse(request);
Console.WriteLine(System.Text.Encoding.Default.GetString(response.HttpResponse.Content));
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
}
}Create a text pattern library:
using System;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Green.Model.V20170823;
namespace csharp_sdk_sample
{
class Program
{
static void Main(string[] args)
{
// Load credentials from environment variables
DefaultProfile profile = DefaultProfile.GetProfile(
"cn-shanghai",
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
DefaultAcsClient client = new DefaultAcsClient(profile);
CreateKeywordLibRequest request = new CreateKeywordLibRequest();
request.ServiceModule = "open_api";
request.Name = "Text pattern library for testing";
request.ResourceType = "TEXT"; // For text anti-spam
request.LibType = "similarText"; // Text pattern library
request.Category = "BLACK"; // Blacklist; also supports WHITE and REVIEW
try
{
CreateKeywordLibResponse response = client.GetAcsResponse(request);
Console.WriteLine(System.Text.Encoding.Default.GetString(response.HttpResponse.Content));
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
}
}Update a text library
Use UpdateKeywordLibRequest to rename a text library or change the business scenarios it applies to.
using System;
using Newtonsoft.Json;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Green.Model.V20170823;
using System.Collections.Generic;
namespace csharp_sdk_sample
{
class Program
{
static void Main(string[] args)
{
// Load credentials from environment variables
DefaultProfile profile = DefaultProfile.GetProfile(
"cn-shanghai",
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
DefaultAcsClient client = new DefaultAcsClient(profile);
UpdateKeywordLibRequest request = new UpdateKeywordLibRequest();
request.Id = <text-library-id>; // ID of the text library to update
request.Name = "<new-library-name>"; // New name for the library
// Specify the business scenarios this library applies to
request.BizTypes = JsonConvert.SerializeObject(new List<string> { "comment", "title" });
try
{
UpdateKeywordLibResponse response = client.GetAcsResponse(request);
Console.WriteLine(System.Text.Encoding.Default.GetString(response.HttpResponse.Content));
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
}
}Replace the following placeholders with actual values:
| Placeholder | Description |
|---|---|
<text-library-id> | The ID of the text library to update |
<new-library-name> | The new name for the text library |
Delete a text library
Deleting a text library permanently deletes all text entries in it. Feedback-based text libraries cannot be deleted.
using System;
using Newtonsoft.Json;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Green.Model.V20170823;
using System.Collections.Generic;
namespace csharp_sdk_sample
{
class Program
{
static void Main(string[] args)
{
// Load credentials from environment variables
DefaultProfile profile = DefaultProfile.GetProfile(
"cn-shanghai",
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
DefaultAcsClient client = new DefaultAcsClient(profile);
DeleteKeywordLibRequest request = new DeleteKeywordLibRequest();
request.Id = <text-library-id>; // ID of the text library to delete
try
{
DeleteKeywordLibResponse response = client.GetAcsResponse(request);
Console.WriteLine(System.Text.Encoding.Default.GetString(response.HttpResponse.Content));
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
}
}Replace <text-library-id> with the ID of the text library to delete.
Search for text entries
By default, DescribeKeywordRequest returns all text entries in a library, paginated. Set the Keyword parameter to filter results using fuzzy search.
using System;
using Newtonsoft.Json;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Green.Model.V20170823;
using System.Collections.Generic;
namespace csharp_sdk_sample
{
class Program
{
static void Main(string[] args)
{
// Load credentials from environment variables
DefaultProfile profile = DefaultProfile.GetProfile(
"cn-shanghai",
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
DefaultAcsClient client = new DefaultAcsClient(profile);
DescribeKeywordRequest request = new DescribeKeywordRequest();
request.KeywordLibId = <text-library-id>; // ID of the library to search
request.PageSize = 10;
request.CurrentPage = 1;
request.Keyword = "<search-term>"; // Optional: fuzzy search term
try
{
DescribeKeywordResponse response = client.GetAcsResponse(request);
Console.WriteLine(System.Text.Encoding.Default.GetString(response.HttpResponse.Content));
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
}
}Replace the following placeholders with actual values:
| Placeholder | Description |
|---|---|
<text-library-id> | The ID of the text library to search |
<search-term> | The term to search for in fuzzy mode (optional) |
Add text entries
Use CreateKeywordRequest to add one or more text entries to a library.
using System;
using Newtonsoft.Json;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Green.Model.V20170823;
using System.Collections.Generic;
namespace csharp_sdk_sample
{
class Program
{
static void Main(string[] args)
{
// Load credentials from environment variables
DefaultProfile profile = DefaultProfile.GetProfile(
"cn-shanghai",
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
DefaultAcsClient client = new DefaultAcsClient(profile);
CreateKeywordRequest request = new CreateKeywordRequest();
request.KeywordLibId = <text-library-id>; // ID of the target text library
// Specify the text entries to add
request.Keywords = JsonConvert.SerializeObject(new List<string> { "Text_1", "Text_2" });
try
{
CreateKeywordResponse response = client.GetAcsResponse(request);
Console.WriteLine(System.Text.Encoding.Default.GetString(response.HttpResponse.Content));
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
}
}Replace <text-library-id> with the ID of the text library to add entries to.
Remove text entries
Use DeleteKeywordRequest to remove specific text entries from a library by their IDs.
using System;
using Newtonsoft.Json;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Green.Model.V20170823;
using System.Collections.Generic;
namespace csharp_sdk_sample
{
class Program
{
static void Main(string[] args)
{
// Load credentials from environment variables
DefaultProfile profile = DefaultProfile.GetProfile(
"cn-shanghai",
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
DefaultAcsClient client = new DefaultAcsClient(profile);
DeleteKeywordRequest request = new DeleteKeywordRequest();
request.KeywordLibId = "<text-library-id>"; // ID of the text library
// Specify the IDs of the text entries to remove
request.Ids = JsonConvert.SerializeObject(new List<int> { <text-entry-id-1>, <text-entry-id-2> });
try
{
DeleteKeywordResponse response = client.GetAcsResponse(request);
Console.WriteLine(System.Text.Encoding.Default.GetString(response.HttpResponse.Content));
}
catch (Exception ex)
{
Console.WriteLine("Failed with error info: {0}", ex.Message);
}
}
}
}Replace the following placeholders with actual values:
| Placeholder | Description |
|---|---|
<text-library-id> | The ID of the text library |
<text-entry-id-1>, <text-entry-id-2> | The IDs of the text entries to remove |
What's next
To apply your text libraries in content moderation requests, specify the library when submitting text anti-spam tasks using the SDK.
For the full API parameter reference, see Get a list of text libraries.