更新时间:2026-08-07 GMT+08:00
分享

SDK接入与卸载

AI安全护栏SDK是一个用于集成AI安全检测功能的开发工具包。它的主要目的是帮助开发者在应用程序中实现文本和图片内容安全检测,确保应用内容的合规性和安全性。

接入方案

AI安全护栏支持PythonJava两种编程语言的接入方式。

环境要求

项目

要求

Python

Python JDK 3.9或更高版本。

核心依赖

httpx>=0.24.0(自动安装)。

网络

可访问护栏服务端地址。

SSL

默认不验证服务端证书(verify_ssl=False),后续版本支持证书验证。

SDK安装包

联系客户经理获取。

安装部署
1
2
3
4
5
6
# 从 whl 文件安装(推荐)
pip install aiguard-<version>-py3-none-any.whl

# 验证安装
python -c "import aiguard; print(aiguard.__version__)"
# 输出: <version>+<timestamp>,例如 0.1.0+20260610092627

接入示例代码

AI安全护栏提供最小接入配置、标准接入配置。用户可根据实际业务,选择适合的方式完成接入。关于示例代码中ClientConfig参数说明,请参见表1
  • 未使用代理场景
    • 最小接入配置
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      from aiguard import AiGuardClient, ClientConfig
      
      # 1. 创建客户端
      config = ClientConfig(
          base_url="YOUR_BASE_URL",        # 必填:护栏服务端地址,如 https://aiguard.huaweicloudwaf.cn
          project_id="YOUR_PROJECT_ID",    # 必填:项目ID
          app_id="YOUR_APP_ID",            # 必填:AI应用ID
          verify_ssl=False,                # 当前版本默认不验证服务端证书
      )
      
      with AiGuardClient(
          ak="YOUR_AK",                   # 必填:Access Key
          sk="YOUR_SK",                   # 必填:Secret Key
          config=config,
      ) as client:
          # 2. 文本检测
          result = client.text_detect("今天天气怎么样?")
          print(f"结果: {result.suggestion}")  # pass 或 block
      
          # 3. 图像检测(支持 raw base64 或 data:image/xxx;base64,... 格式)
          import base64
          with open("image.png", "rb") as f:
              image_data = base64.b64encode(f.read()).decode()
          img_result = client.image_detect(image_data)
          print(f"结果: {img_result.suggestion}")
      
    • 标准接入配置
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      #!/usr/bin/env python
      import base64
      from aiguard import AiGuardClient, ClientConfig, TextDetectOptions, Message
      
      config = ClientConfig(
          base_url="https://aiguard.huaweicloudwaf.cn",  # 必填:护栏服务端地址
          project_id="YOUR_PROJECT_ID",            # 必填:项目ID
          app_id="YOUR_APP_ID",                    # 必填:AI应用ID
          verify_ssl=False,         # 当前版本默认不验证服务端证书
          connect_timeout=10,       # 连接超时(秒),默认5
          read_timeout=30,          # 读取超时(秒),默认5
          max_retries=5,            # 最大重试次数,默认3
          initial_delay=2,          # 重试初始延迟(秒),默认1
          max_delay=60,             # 重试最大延迟(秒),默认60
          log_level="DEBUG",        # 日志级别,可选 DEBUG/INFO/ERROR,默认 INFO
          # proxy="http://127.0.0.1:8888",  # 可选:HTTP代理地址(详见1.10节)
      )
      
      with AiGuardClient(
          ak="YOUR_AK",                   # 必填:Access Key
          sk="YOUR_SK",                   # 必填:Secret Key
          config=config,
      ) as client:
          # 1. 带对话历史的文本检测
          history = [
              Message(role="user", content="你好"),
              Message(role="assistant", content="你好,有什么可以帮助你的?"),
          ]
          options = TextDetectOptions(
              role="user",
              history=history,
              end_user="tenant_123",
              source_region="cn-north-4",
              app_id="YOUR_APP_ID",        # 可选:单次请求覆盖 app_id
          )
          result = client.text_detect("谢谢", options=options)
          print(f"文本结果(带历史): {result.suggestion}")
      
          # 2. 图像检测
          image_path = "/path/to/image.bmp"
          with open(image_path, "rb") as f:
              image_data = base64.b64encode(f.read()).decode()
          img_result = client.image_detect(image_data)
          print(f"图像结果: {img_result.suggestion}")
      
          # 3. 单次请求覆盖 project_id/app_id
          options_override = TextDetectOptions(project_id="YOUR_PROJECT_ID")
          result2 = client.text_detect("测试覆盖", options=options_override)
          print(f"文本结果(覆盖project_id): {result2.suggestion}")
      
    表1 ClientConfig参数说明

    参数

    是否必选

    参数类型

    默认值

    描述

    base_url

    str

    --

    服务端地址。

    project_id

    str

    --

    项目ID。

    app_id

    str

    --

    AI应用ID。

    verify_ssl

    bool/str

    False

    当前版本默认不验证服务端证书,后续版本支持证书验证。

    connect_timeout

    int

    5

    连接超时(秒)。

    read_timeout

    int

    5

    读取超时(秒)。

    max_retries

    int

    3

    最大重试次数。

    initial_delay

    int

    1

    重试初始延迟(秒)。

    max_delay

    int

    60

    重试最大延迟(秒)。

    log_level

    str

    INFO

    日志级别:

    • DEBUG:输出请求/响应详情、重试过程等,用于问题排查。
    • INFO:输出常规操作日志(默认)。
    • ERROR:仅输出错误日志。

    proxy

    str

    None

    HTTP代理地址,例如http://127.0.0.1:8888

  • 使用代理场景
    如下业务场景时,可在ClientConfig中配置proxy参数,通过HTTP代理访问护栏服务。
    • 企业网络要求所有外网请求通过代理
    • 需要通过抓包工具(Fiddler / Charles / Nginx)调试请求
    • 服务端在内网,需通过代理网关转发
    接入示例如下所示:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import base64
    from aiguard import AiGuardClient, ClientConfig
    
    config = ClientConfig(
        base_url="https://aiguard.huaweicloudwaf.cn",
        project_id="YOUR_PROJECT_ID",
        app_id="YOUR_APP_ID",
        verify_ssl=False,                    # 当前版本默认不验证服务端证书
        proxy="http://127.0.0.1:8888",      # HTTP 代理地址
        log_level="ERROR",
    )
    
    with AiGuardClient(ak="YOUR_AK", sk="YOUR_SK", config=config) as client:
        # 文本检测(经代理)
        result = client.text_detect("你好,今天天气怎么样?")
        print(f"结果: {result.suggestion}")
    
        # 图像检测(经代理)
        with open("image.png", "rb") as f:
            image_data = base64.b64encode(f.read()).decode()
        img_result = client.image_detect(image_data)
        print(f"结果: {img_result.suggestion}")
    
    • proxy仅支持HTTP/HTTPS协议代理,格式为http://host:port或https://host:port。
    • 使用代理时,SDK默认不验证服务端证书(verifySsl(false)),后续版本将支持证书验证。
    • 配置proxy后,SDK的所有请求(包括文本检测和图像检测)都会经过代理。

日志配置

SDK使用Python 标准logging模块,logger名称为aiguard。默认输出到控制台,级别为INFO。
  • 日志级别设置
    通过ClientConfig.logLevel参数控制SDK日志级别:

    级别

    参数值

    说明

    DEBUG

    .logLevel("DEBUG")

    输出请求/响应详情、重试过程等,用于问题排查。

    INFO

    .logLevel("INFO")

    输出常规操作日志(默认)。

    ERROR

    .logLevel("ERROR")

    仅输出错误日志。

  • 日志输出到文件
    SDK默认输出日志到控制台。如需写入文件,业务方可通过Python标准logging模块自行添加FileHandler。
    • SDK只负责日志输出,不管理日志写入位置。业务方通过Python标准logging模块灵活配置日志输出方式(例如控制台、文件、轮转等),与业务自身的日志体系无缝集成。
    • SDK已内置AK/SK脱敏,日志中密钥字段统一显示为 ***。但业务方自身的日志代码需注意不要打印实际密钥值。
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 方式1:仅输出到控制台(默认行为,无需额外配置)
    config = ClientConfig(
        base_url="YOUR_BASE_URL",
        project_id="YOUR_PROJECT_ID",
        app_id="YOUR_APP_ID",
        log_level="DEBUG",
    )
    
    # 方式2:输出到文件(业务方自行配置 Python logging)
    import logging
    sdk_logger = logging.getLogger("aiguard")
    # 使用 FileHandler 写入文件
    file_handler = logging.FileHandler("/path/to/sdk.log", encoding="utf-8")
    file_handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
    sdk_logger.addHandler(file_handler)
    
    # 方式3:高级场景 — 使用 RotatingFileHandler 实现日志轮转
    from logging.handlers import RotatingFileHandler
    rotating_handler = RotatingFileHandler("/path/to/sdk.log", maxBytes=10*1024*1024, backupCount=5, encoding="utf-8")
    rotating_handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
    sdk_logger.addHandler(rotating_handler)
    
  • 日志输出示例
    1
    2
    3
    4
    5
    2026-06-17 10:30:00,123 - aiguard.http - INFO - AiGuardClient initialized - project_id=c12d..., app_id=a5ca...
    2026-06-17 10:30:00,456 - aiguard.http - DEBUG - POST https://aiguard.huaweicloudwaf.cn/v1/.../text-detect - Body: {'app_id': 'a5ca...', 'message': {'role': 'user', 'content': '你好'}}
    2026-06-17 10:30:01,789 - aiguard.http - DEBUG - Response status: 200
    2026-06-17 10:30:01,789 - aiguard.http - DEBUG - Request successful - request_id: 20260617...
    2026-06-17 10:30:02,000 - aiguard.http - INFO - AiGuardClient closed
    

SSL配置

当前版本SDK默认不验证服务端证书(verify_ssl=False),证书验证功能将在后续版本支持。
1
2
3
4
5
6
7
# 当前版本:不验证服务端证书(默认)
config = ClientConfig(
    base_url="https://aiguard.huaweicloudwaf.cn",
    project_id="YOUR_PROJECT_ID",
    app_id="YOUR_APP_ID",
    # verify_ssl=False 为默认值,无需显式配置
)

不验证服务端证书意味着SDK不会校验服务端身份,存在中间人攻击风险。该配置仅适用于当前版本,后续版本将默认开启证书验证。

接入异常处理
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from aiguard import AiGuardClient, ClientConfig
from aiguard.exceptions import (
    AiGuardValidationException,
    AiGuardAuthenticationException,
    AiGuardRateLimitException,
    AiGuardServerException,
    AiGuardTimeoutException,
    AiGuardNetworkException,
    AiGuardException,
)

config = ClientConfig(project_id="p1", app_id="a1")

with AiGuardClient(ak="ak", sk="sk", config=config) as client:
    try:
        result = client.text_detect("内容")
    except AiGuardValidationException:
        # 参数错误(空内容、非法role等),不重试
        # 子类包括:
        #   AiGuardAppDisabledException      — 应用已禁用(MAF.1007)
        #   AiGuardUnsupportedUrlException   — 不支持的 URL(MAF.1001)
        #   AiGuardMediaTypeException        — 不支持的媒体类型(MAF.1002)
        #   AiGuardImageFormatException      — 图像格式错误(MAF.1300/1304)
        #   AiGuardImageParseException       — 图像解析失败(MAF.1301/1303)
        #   AiGuardImageDownloadException    — 图像下载失败(MAF.1302)
        #   AiGuardImageSizeException        — 图像大小超限(MAF.1305)
        pass
    except AiGuardAuthenticationException:
        # AK/SK 认证失败(MAF.1004),不重试
        pass
    except AiGuardRateLimitException:
        # 限流(MAF.3000/3001 或 HTTP 429),SDK 自动重试后仍失败
        pass
    except AiGuardServerException as e:
        # 服务端异常,可重试但重试耗尽
        # e.error_code / e.error_msg 可获取详情
        pass
    except AiGuardTimeoutException:
        # 请求超时,可重试但重试耗尽
        pass
    except AiGuardNetworkException:
        # 网络异常(DNS失败、连接拒绝),可重试但重试耗尽
        pass
    except AiGuardException:
        # 其他 SDK 异常兜底
        pass
接入验证清单

序号

验证项

方法

预期结果

1

SDK包安装成功

python -c "import aiguard"

无报错

2

版本正确

python -c "import aiguard; print(aiguard.version)"

输出对应版本号

3

客户端初始化成功

构造 AiGuardClient(ak, sk, config)

无报错

4

缺少ak抛异常

AiGuardClient(ak="", sk="x", config=config)

抛AiGuardMissingParamException

5

缺少project_id抛异常

config=ClientConfig()

抛 AiGuardMissingParamException

6

文本检测正常

client.text_detect("你好")

返回 DetectResult

7

空内容抛异常

client.text_detect("")

抛 AiGuardValidationException

8

图像检测正常

client.image_detect("data:image/png;base64,...")

返回 DetectResult

9

资源释放

client.close() 或 with 退出

无报错,日志输出 closed

10

日志无AK/SK泄漏

设置 log_level="DEBUG" 后检测

日志中不含AK/SK明文

查看版本号

版本号嵌入在包元数据中,可通过以下方式查看:
1
2
3
4
5
# 方式一:pip show
pip show aiguard

# 方式二:代码中读取
python -c "import aiguard; print(aiguard.__version__)"
环境要求

项目

要求

JDK

JDK 17或更高版本

构建工具

Maven

依赖

OkHttp 4.12.0、Jackson 2.15.3(自动传递)

日志

SLF4J 2.0.9。需业务方提供实现,例如logback

SSL

默认不验证服务端证书(verifySsl(false)),后续版本支持证书验证

SDK安装包

联系客户经理获取。

安装部署示例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<!-- pom.xml 添加依赖 -->
<dependency>
    <groupId>com.huawei</groupId>
    <artifactId>aiguard-sdk</artifactId>
    <version>${aiguard-sdk.version}</version>
</dependency>

<!-- SLF4J 实现logback和logback-classic二选一业务方自选 -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.4.11</version>
</dependency>

接入示例

AI安全护栏提供最小接入配置、标准接入配置。用户可根据实际业务,选择适合的方式完成接入。ClientConfig参数说明请参见表2
  • 未使用代理场景
    • 最小接入配置
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      import com.huawei.aiguard.client.AiGuardClient;
      import com.huawei.aiguard.config.ClientConfig;
      import com.huawei.aiguard.model.DetectResult;
      
      // 1. 创建客户端(try-with-resources 自动释放)
      ClientConfig config = ClientConfig.builder()
          .baseUrl("YOUR_BASE_URL")         // 必填:护栏服务端地址,如 https://aiguard.huaweicloudwaf.cn
          .projectId("YOUR_PROJECT_ID")
          .appId("YOUR_APP_ID")
          .verifySsl(false)                 // 当前版本默认不验证服务端证书
          .build();
      
      try (AiGuardClient client = new AiGuardClient("YOUR_AK", "YOUR_SK", config)) {
          // 2. 文本检测
          DetectResult result = client.textDetect("今天天气怎么样?", null);
          System.out.println("结果: " + result.getSuggestion()); // pass 或 block
      
          // 3. 图像检测
          String imageData = "data:image/png;base64,iVBORw0KGgo...";
          DetectResult imgResult = client.imageDetect(imageData, null);
          System.out.println("结果: " + imgResult.getSuggestion());
      }
      // 4. try-with-resources 自动调用 close()
      
    • 标准接入配置
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      import com.huawei.aiguard.client.AiGuardClient;
      import com.huawei.aiguard.config.ClientConfig;
      import com.huawei.aiguard.model.DetectResult;
      import com.huawei.aiguard.model.Message;
      import com.huawei.aiguard.model.TextDetectOptions;
      
      ClientConfig config = ClientConfig.builder()
          .baseUrl("https://aiguard.huaweicloudwaf.cn")  // 必填:护栏服务端地址
          .projectId("YOUR_PROJECT_ID")
          .appId("YOUR_APP_ID")
          .verifySsl(false)          // 当前版本默认不验证服务端证书
          // .sslCertPath("/path/to/ca.pem")  // 后续版本支持
          .connectTimeout(10)
          .readTimeout(30)
          .maxRetries(5)
          .initialDelay(2)
          .maxDelay(60)
          .logLevel("DEBUG")          // 日志级别,可选 DEBUG/INFO/ERROR,默认 INFO
          // .proxy("http://127.0.0.1:8888")  // 可选:HTTP代理地址(详见2.10节)
          .build();
      
      try (AiGuardClient client = new AiGuardClient("ak", "sk", config)) {
          // 带对话历史的文本检测
          Message history1 = new Message("user", "你好");
          Message history2 = new Message("assistant", "你好,有什么可以帮助你的?");
      
          TextDetectOptions options = TextDetectOptions.builder()
              .role("user")
              .history(Arrays.asList(history1, history2))
              .endUser("tenant_project_id")
              .sourceRegion("cn-north-4")
              .appId("YOUR_APP_ID")          // 可选:单次请求覆盖 appId
              .build();
      
          DetectResult result = client.textDetect("谢谢", options);
      }
      
    表2 ClientConfig参数说明

    参数

    是否必选

    参数类型

    默认值

    描述

    baseUrl

    String

    必填

    服务端地址。

    projectId

    String

    必填

    项目ID。

    appId

    String

    必填

    AI应用ID。

    verifySsl

    boolean

    false

    当前版本默认不验证服务端证书。

    sslCertPath

    String

    null

    后续版本支持。

    connectTimeout

    int

    5

    连接超时(秒)。

    readTimeout

    int

    5

    读取超时(秒)。

    maxRetries

    int

    3

    最大重试次数。

    initialDelay

    int

    1

    重试初始延迟(秒)。

    maxDelay

    int

    60

    重试最大延迟(秒)。

    logLevel

    String

    INFO

    日志级别:

    • DEBUG:输出请求/响应详情、重试过程等,用于问题排查。
    • INFO:输出常规操作日志(默认)。
    • ERROR:仅输出错误日志。

    proxy

    String

    null

    HTTP代理地址,例如http://127.0.0.1:8888。

  • 使用代理场景
    如下业务场景时,可在ClientConfig中配置proxy参数,通过HTTP代理访问护栏服务。
    • 企业网络要求所有外网请求通过代理
    • 需要通过抓包工具(Fiddler/Charles/Nginx)调试请求
    • 服务端在内网,需通过代理网关转发
    接入示例如下所示:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    import com.huawei.aiguard.client.AiGuardClient;
    import com.huawei.aiguard.config.ClientConfig;
    import com.huawei.aiguard.model.DetectResult;
    
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.Base64;
    
    ClientConfig config = ClientConfig.builder()
        .baseUrl("https://aiguard.huaweicloudwaf.cn")
        .projectId("YOUR_PROJECT_ID")
        .appId("YOUR_APP_ID")
        .verifySsl(false)                     // 当前版本默认不验证服务端证书
        .proxy("http://127.0.0.1:8888")       // HTTP 代理地址
        .logLevel("ERROR")
        .build();
    
    try (AiGuardClient client = new AiGuardClient("YOUR_AK", "YOUR_SK", config)) {
        // 文本检测(经代理)
        DetectResult result = client.textDetect("你好,今天天气怎么样?", null);
        System.out.println("结果: " + result.getSuggestion());
    
        // 图像检测(经代理)
        byte[] imageBytes = Files.readAllBytes(Paths.get("/path/to/image.png"));
        String imageData = Base64.getEncoder().encodeToString(imageBytes);
        DetectResult imgResult = client.imageDetect(imageData, null);
        System.out.println("结果: " + imgResult.getSuggestion());
    }
    
    • proxy仅支持HTTP/HTTPS协议代理,格式为http://host:port 或 https://host:port。
    • 使用代理时,SDK 默认不验证服务端证书(verifySsl(false)),后续版本将支持证书验证。
    • 配置 proxy 后,SDK的所有请求(包括文本检测和图像检测)都会经过代理。

日志配置

如果SDK要使用SLF4J 2.x作为日志门面,业务方必须提供SLF4J实现,否则日志不会输出(SLF4J会打印警告并回退到NOP)。
  • 日志级别设置
    通过ClientConfig.logLevel参数控制SDK日志级别:

    级别

    参数值

    说明

    DEBUG

    .logLevel("DEBUG")

    输出请求/响应详情、重试过程等,用于问题排查。

    INFO

    .logLevel("INFO")

    输出常规操作日志(默认)。

    ERROR

    .logLevel("ERROR")

    仅输出错误日志。

  • 日志输出到文件
    SDK不管理日志写入位置,由业务方通过SLF4J实现自行配置。默认输出到控制台。

    SDK只负责日志输出,不管理日志写入位置。日志路径和格式由业务方选择的SLF4J实现决定。例如logback通过logback.xml配置,slf4j-simple通过JVM参数配置。

    1
    2
    3
    4
    5
    6
    7
    // 仅输出到控制台(默认行为,无需额外配置)
    ClientConfig config = ClientConfig.builder()
        .baseUrl("YOUR_BASE_URL")
        .projectId("YOUR_PROJECT_ID")
        .appId("YOUR_APP_ID")
        .logLevel("DEBUG")
        .build();
    
    • 方式1:使用 logback(推荐,生产环境)

      在pom.xml中添加依赖:

      1
      2
      3
      4
      5
      6
      <!-- SLF4J 实现logback -->
      <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
          <version>1.4.11</version>
      </dependency>
      

      在src/main/resources/logback.xml中配置日志格式和输出:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      <?xml version="1.0" encoding="UTF-8"?>
      <configuration>
          <!-- 控制台输出 -->
          <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
              <encoder>
                  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %logger{36} - %level - %msg%n</pattern>
              </encoder>
          </appender>
      
          <!-- 文件输出 -->
          <appender name="FILE" class="ch.qos.logback.core.FileAppender">
              <file>/path/to/sdk.log</file>
              <encoder>
                  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} - %logger{36} - %level - %msg%n</pattern>
              </encoder>
          </appender>
      
          <!-- SDK 日志级别 -->
          <logger name="com.huawei.aiguard" level="DEBUG" />
      
          <root level="INFO">
              <appender-ref ref="CONSOLE" />
              <appender-ref ref="FILE" />
          </root>
      </configuration>
      
    • 方式2:使用 slf4j-simple(快速测试)

      在pom.xml中添加依赖:

      1
      2
      3
      4
      5
      6
      7
      <!-- SLF4J 实现slf4j-simple仅用于测试 -->
      <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-simple</artifactId>
          <version>2.0.13</version>
          <scope>test</scope>
      </dependency>
      

      通过命令行JVM参数配置日志级别和输出位置:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      # 日志输出到控制台DEBUG级别
      java "-Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG" \
           -cp "your-app.jar:aiguard-sdk-0.1.0-with-dependencies.jar:slf4j-simple-2.0.13.jar" \
           com.example.YourMain
      
      # 日志输出到文件
      java "-Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG" \
           "-Dorg.slf4j.simpleLogger.logFile=/path/to/sdk.log" \
           -cp "your-app.jar:aiguard-sdk-0.1.0-with-dependencies.jar:slf4j-simple-2.0.13.jar" \
           com.example.YourMain
      
      • slf4j-simple版本必须与SDK中的slf4j-api版本匹配(2.x)。使用1.7.x版本会导致 "No SLF4J providers were found" 错误,因为SLF4J 2.x会忽略1.7.x的绑定。
      • SDK已内置AK/SK脱敏,日志中密钥字段统一显示为 ***。但业务方自身的日志代码需注意不要打印实际密钥值。
  • 日志输出示例
    1
    2
    3
    4
    5
    2026-06-17 10:30:00.123 - com.huawei.aiguard.http.HttpClient - INFO - AiGuardClient initialized - projectId=c12d..., appId=a5ca...
    2026-06-17 10:30:00.456 - com.huawei.aiguard.http.HttpClient - DEBUG - POST https://aiguard.huaweicloudwaf.cn/v1/.../text-detect
    2026-06-17 10:30:01.789 - com.huawei.aiguard.http.HttpClient - DEBUG - Response status: 200
    2026-06-17 10:30:01.789 - com.huawei.aiguard.http.HttpClient - DEBUG - Request successful - requestId=20260617...
    2026-06-17 10:30:02.000 - com.huawei.aiguard.http.HttpClient - INFO - AiGuardClient closed
    

SSL配置

当前版本SDK默认不验证服务端证书(verifySsl(false)),证书验证功能将在后续版本支持。
1
2
3
4
5
6
7
// 当前版本:不验证服务端证书(默认)
ClientConfig config = ClientConfig.builder()
    .baseUrl("https://aiguard.huaweicloudwaf.cn")
    .projectId("YOUR_PROJECT_ID")
    .appId("YOUR_APP_ID")
    // verifySsl(false) 为默认值,无需显式配置
    .build();

不验证服务端证书意味着SDK不会校验服务端身份,存在中间人攻击风险。该配置仅适用于当前版本,后续版本将默认开启证书验证。

接入异常处理
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import com.huawei.aiguard.exception.*;

try {
    DetectResult result = client.textDetect("内容", null);
} catch (AiGuardValidationException e) {
    // 参数错误,不重试
    // 子类包括:
    //   AiGuardAppDisabledException      — 应用已禁用(MAF.1007)
    //   AiGuardUnsupportedUrlException   — 不支持的 URL(MAF.1001)
    //   AiGuardMediaTypeException        — 不支持的媒体类型(MAF.1002)
    //   AiGuardImageFormatException      — 图像格式错误(MAF.1300/1304)
    //   AiGuardImageParseException       — 图像解析失败(MAF.1301/1303)
    //   AiGuardImageDownloadException    — 图像下载失败(MAF.1302)
    //   AiGuardImageSizeException        — 图像大小超限(MAF.1305)
} catch (AiGuardAuthenticationException e) {
    // AK/SK 认证失败(MAF.1004),不重试
} catch (AiGuardRateLimitException e) {
    // 限流,SDK 自动重试后仍失败
} catch (AiGuardServerException e) {
    // 服务端异常,e.getErrorCode() / e.getErrorMsg()
} catch (AiGuardTimeoutException e) {
    // 请求超时
} catch (AiGuardNetworkException e) {
    // 网络异常
} catch (AiGuardException e) {
    // 其他 SDK 异常兜底
}
接入验证清单

序号

验证项

方法

预期结果

1

依赖解析成功

mvn dependency:resolve

无报错

2

客户端初始化成功

new AiGuardClient(ak, sk, config)

无报错

3

缺少ak抛异常

new AiGuardClient("", sk, config)

抛AiGuardMissingParamException

4

文本检测正常

client.textDetect("你好", null)

返回DetectResult

5

空内容抛异常

client.textDetect("", null)

抛AiGuardValidationException

6

图像检测正常

client.imageDetect(imageData, null)

返回DetectResult

7

try-with-resources释放

退出try块

日志输出closed

8

日志无 AK/SK 泄漏

DEBUG级别检查日志

日志中不含AK/SK明文

查看版本号

版本号嵌入在包元数据中,可通过以下方式查看:
1
2
3
4
5
# 方式一jar  pom.properties
unzip -p aiguard_java_sdk.jar META-INF/maven/com.huawei/aiguard-sdk/pom.properties | grep version

# 方式二jar  MANIFEST.MF
unzip -p aiguard_java_sdk.jar META-INF/MANIFEST.MF | grep Implementation-Version

卸载方案

SDK的安全设计原则决定了AK/SK仅通过构造函数显式传入,SDK自身不会存储、缓存或持久化任何凭证信息。因此卸载时无需从SDK内部清理凭证,但需要检查业务代码中是否残留了AK/SK。

卸载流程

SDK卸载流程分为4个步骤,按序执行即可。其中步骤一、步骤二为必选操作,步骤三为安全检查,步骤为回归验证。

关于凭证安全,需要特别强调:AI安全护栏SDK在设计上不存储、不缓存、不持久化AK/SK。AK/SK仅通过AiGuardClient(ak, sk, config) 构造函数显式传入,保存在Client实例的私有字段中,Client关闭后随对象一起被 GC回收。SDK不会将AK/SK写入文件、不会读取环境变量、不会在日志中输出实际密钥值(日志中统一脱敏为***)。因此卸载时不需要从SDK内部“清理凭证”,但需要检查业务方自己的代码、配置文件、环境变量和日志中是否残留了AK/SK。如果发现AK/SK曾泄露到代码仓库或日志中,应前往云管理控制台轮换凭证(禁用旧的、生成新的)。

图1 卸载流程

卸载方法

Python和Java的SDK卸载方法如下所示。

  1. 停止使用SDK,移除代码引用。

    在卸载依赖之前,必须先移除所有对SDK的代码调用,否则卸载后项目会报ModuleNotFoundError。

    1
    2
    3
    4
    5
    6
    7
    8
    # 第一步:搜索项目中所有 SDK 引用,确认影响范围
    grep -rn "from aiguard" --include="*.py" .
    grep -rn "import aiguard" --include="*.py" .
    
    # 输出示例:
    # src/main.py:3:from aiguard import AiGuardClient, ClientConfig
    # src/main.py:20:from aiguard.exceptions import AiGuardException
    # src/utils/check.py:5:from aiguard import TextDetectOptions
    

    逐个打开搜索到的文件,删除以下内容:

    • from aiguard import ... 或 import aiguard 语句
    • AiGuardClient(...) 实例化代码
    • client.text_detect(...) / client.image_detect(...) 调用代码
    • client.close() 或 with AiGuardClient(...) as client: 相关代码
    • 所有 AiGuardXxxException 的 try/except 块(或改为业务自身异常处理)

  2. 卸载SDK包。

    1
    2
    3
    4
    5
    6
    7
    # 卸载 aiguard 包
    pip uninstall aiguard -y
    
    # 输出示例:
    # Found existing installation: aiguard-<version>
    # Uninstalling aiguard-<version>:
    #   Successfully uninstalled aiguard-<version>
    
    如果项目中没有其他地方使用如下库,清理随aiguard自动安装的依赖:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 先检查 httpx 是否被其他包依赖
    pip show httpx
    # 输出中的 "Required-by:" 字段会显示谁依赖了它
    
    # 如果 "Required-by:" 为空或只有 aiguard,说明可以安全卸载
    pip uninstall httpx -y
    
    # httpx 的子依赖也可以一并清理(按需)
    pip uninstall httpcore sniffio anyio h11 -y
    

    如果项目中有其他库也依赖httpx(如respx、httpx-socks等),则不要卸载httpx,只卸载aiguard即可。

  3. 检查凭证残留。

    SDK不会存储AK/SK,但业务方可能在以下位置写入了凭证,需逐一检查:

    检查位置

    说明

    检查方法

    业务代码

    AK/SK 是否硬编码在Python源码中

    grep -rn "AK\|SK\|access_key\|secret_key" --include="*.py" .

    环境变量

    是否通过 os.environ["AIGUARD_AK"] 等方式注入

    检查 .env 文件、Docker compose、K8s ConfigMap、CI/CD 变量

    配置文件

    是否在yaml/json/ini中配置了AK/SK

    grep -rn "aiguard\|ak:\|sk:" --include=".yaml" --include=".yml" --include="*.json" .

    日志文件

    SDK 已内置脱敏,但业务方自身日志是否打印了AK/SK

    检查应用日志输出,搜索是否有类似 AKX*** 之外的实际密钥值

    Git 历史

    AK/SK是否曾被提交到代码仓库

    git log -p --all -S "YOUR_AK_VALUE" -- "*.py" 替换为实际值搜索

    如果发现AK/SK曾泄露到Git历史,不能仅删除代码,还需使用git filter-branch或bfg-repo-cleaner从历史中彻底清除,然后在云控制台轮换凭证。

  4. 验证是否已完成卸载。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    # 验证1:确认包已卸载
    python -c "import aiguard"
    # 预期输出: ModuleNotFoundError: No module named 'aiguard'
    
    # 验证2:确认包列表中无 aiguard
    pip list | grep aiguard
    # 预期输出: (无结果)
    
    # 验证3:项目可以正常运行
    python -m pytest tests/ -v
    # 或
    python your_main_script.py
    

  1. 停止使用SDK,移除代码引用。

    1
    2
    3
    4
    5
    6
    7
    # 搜索项目中所有 SDK 引用
    grep -rn "com.huawei.aiguard" --include="*.java" .
    grep -rn "AiGuardClient" --include="*.java" .
    
    # 输出示例
    # src/main/java/com/example/Service.java:5:import com.huawei.aiguard.client.AiGuardClient;
    # src/main/java/com/example/Service.java:20:    private AiGuardClient client;
    

    逐个删除:

    • import com.huawei.aiguard.*语句
    • AiGuardClient声明和实例化
    • client.textDetect(...) / client.imageDetect(...) 调用
    • client.close() 或 try-with-resources 中的 AiGuardClient 引用
    • AiGuardXxxException 的catch块

  2. 打开项目根目录的pom.xml,找到并删除aiguard-sdk依赖:

    1
    2
    3
    4
    5
    6
    <!-- 删除以下内容 -->
    <dependency>
        <groupId>com.huawei</groupId>
        <artifactId>aiguard-sdk</artifactId>
        <version>${aiguard-sdk.version}</version>
    </dependency>
    
    删除后,Maven不会再拉取aiguard-sdk及其传递依赖。执行以下命令让变更生效:
    1
    2
    3
    4
    5
    6
    # 刷新依赖移除 aiguard-sdk 及其独占的传递依赖
    mvn dependency:resolve
    
    # 如果使用 IDEIntelliJ IDEA),刷新 Maven 项目
    # 右键 pom.xml -> Maven -> Reload Project
    # 或点击 IDE 右侧 Maven 面板的刷新按钮
    

    关于传递依赖的处理:aiguard-sdk声明了OkHttp、Jackson、SLF4J作为传递依赖。移除aiguard-sdk后:

    传递依赖

    是否自动移除

    说明

    OkHttp 4.12.0

    自动移除(如无其他组件依赖)

    Maven依赖传递机制会自动清理

    Jackson 2.15.3

    SLF4J API 2.0.9

    不会移除

    SLF4J 是日志门面,通常被其他库也依赖

    确认传递依赖状态:
    1
    2
    3
    4
    5
    6
    7
    # 查看当前依赖树确认 aiguard-sdk 已移除
    mvn dependency:tree | grep -i aiguard
    # 预期输出: 无结果说明已完全移除
    
    # 检查 OkHttp/Jackson 是否还在可能被其他组件依赖
    mvn dependency:tree | grep -E "okhttp|jackson"
    # 如有输出说明项目中其他组件也在使用无需额外处理
    

  3. 检查凭证残留。

    SDK不会存储AK/SK,但业务方可能在以下位置写入了凭证,需逐一检查:

    检查位置

    说明

    检查方法

    Java源码

    AK/SK是否硬编码在Java代码中

    grep -rn "ak\|sk\|accessKey\|secretKey" --include="*.java" .

    配置文件

    是否在application.yml/properties中配置

    grep -rn "aiguard\|ak:\|sk:" --include=".yml" --include=".properties" .

    环境变量

    是否通过System.getenv("AIGUARD_AK") 等方式注入

    检查Docker/K8s/CI配置

    日志配置

    logback/log4j2中是否配置了aiguard 包的logger

    检查 logback.xml、log4j2.xml

    日志文件

    SDK 已内置脱敏,但业务方日志是否打印了实际密钥值

    检查应用日志输出

    Git历史

    AK/SK是否曾被提交

    git log -p --all -S "YOUR_AK_VALUE" -- ".java" ".xml" "*.properties"

  4. 验证是否已完成卸载。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    # 验证1Maven 编译通过确认代码中无 SDK 引用残留
    mvn clean compile
    # 预期: BUILD SUCCESS
    
    # 验证2依赖树中无 aiguard
    mvn dependency:tree | grep aiguard
    # 预期输出: 无结果
    
    # 验证3测试通过
    mvn test
    # 预期: BUILD SUCCESS
    

卸载后检查清单

序号

检查项

Python 验证方式

Java 验证方式

通过标准

1

代码中无SDK引用

grep -rn "from aiguard" --include="*.py" . 无结果

grep -rn "com.huawei.aiguard" --include="*.java" . 无结果

无输出

2

依赖已移除

pip list \| grep aiguard 无结果

mvn dependency:tree \| grep aiguard 无结果

无输出

3

项目可正常编译、运行

python your_main.py 无报错

mvn clean compile BUILD SUCCESS

无报错

4

测试通过

pytest tests/ -v 全部通过

mvn test BUILD SUCCESS

全部通过

5

业务代码无AK/SK硬编码

grep 搜索源码无实际密钥值

grep 搜索源码无实际密钥值

无泄露

6

配置文件中无SDK配置

检查 .env/yaml/json

检查 application.yml/properties

无残留

7

日志文件中无敏感信息

检查应用日志输出

检查应用日志输出

无泄露

8

已泄露的AK/SK已轮换

在云管理控制台操作

在云管理控制台操作

旧凭证已禁用

相关文档