Data Agent OpenAPI 集成指南

更新时间:
复制 MD 格式

本指南旨在帮助开发者通过 OpenAPI 与Data Agent 服务进行集成。文档将详细阐述 Data Agent 的核心架构、API 调用流程,并提供针对两大核心场景的完整代码实现。

架构概览

资源模型

DataAgent 服务的运行依赖三个核心抽象层,理解其关系是正确集成的前提:

层级

说明

生命周期管理

Agent 资源

Data Agent 运行所需资源的逻辑记录,实现子账号维度的租户隔离。所有操作均需指定 AgentId

自动管理。跟随运行时周期,最后一个session不活跃之后自动销毁(通常先静默1小时)

Agent 运行时

Agent 资源在 Session 启动后实例化的执行环境,负责推理和工具调用。OpenAPI 调用者无需直接感知此层。

自动管理。当最后一个关联的 Session 不活跃(静默约1小时)后,运行时会自动销毁以释放资源。

Session 资源

一次具体对话的上下文,包含对话的自定义配置。Session 会自动调度到最近活跃的 Agent 运行时上执行。

临时存在。任务完成后进入静默期(约6小时),若无追问则自动回收。

交互流程

image

流程说明

  1. Agent 隔离:Agent 资源在子账号维度进行严格的租户隔离。请求中的 AgentId 若与目标资源不匹配,将被直接拒绝。

  2. Session 与 Runtime 分离:CreateDataAgentSession 创建对话会话,仅创建逻辑会话资源,并触发 Agent 运行时的启动(如果尚未运行)。实际的计算任务由 SendChatMessage 触发。

  3. 异步处理:SendChatMessage 是一个异步操作。API 调用成功仅表示消息已进入处理队列,Agent 将在后台进行处理。


调用流程与状态管理

完整调用流程

以下流程覆盖首次对话和在已有会话中追问两种场景:

  1. 判断是否已持有有效的 SessionId。如果没有,调用 CreateDataAgentSession 获取 SessionId 和 AgentId。

  2. 调用 DescribeDataAgentSession 检查当前状态。

  3. 根据 AgentStatus 分支处理:

    • STARTING:Agent 正在启动中,等待 2~3 秒后重试步骤 2。

    • RUNNING:Agent 已就绪,继续检查 SessionStatus(见步骤 4)。

    • STOPPED:Agent 已回收,回到步骤 1 重新创建会话。

  4. 根据 SessionStatus 分支处理:

    • INITIDLE:会话空闲,可以发送消息,继续步骤 5。

    • RUNNING:上一条消息尚在处理,等待或先调用 GetChatContent 获取当前结果。

    • UNAVAILABLE:会话已失效,回到步骤 1 重新创建。

  5. 调用 SendChatMessage 发送消息,获取 MessageId。

  6. 轮询 GetChatContent,直到获取完整回复。

说明

核心原则:发送前先检查状态,状态异常则重建会话,状态正常则正常发送。

在已有会话中追问

对已有会话发送后续消息时,无需重新创建 Session,但仍需先检查状态:

  1. 调用 DescribeDataAgentSession,确认 AgentStatus 为 RUNNING、SessionStatus 为 IDLE

  2. 调用 SendChatMessage 发送消息。

  3. 轮询 GetChatContent 获取回复。

在已有会话中追问包含两类场景:

  • 主动追问:Agent 完成分析后,您需要提出新的问题。

  • 回答 Agent 提问:Data Agent 会主动提问(如引导上传数据源、要求补充必要信息),您需要通过 SendChatMessage 回答。

重要

回答 Data Agent 提问时,SendChatMessageMessageType 参数应设置为 additionalQuestion 参数应填写 Data Agent 提问的原文。Data Agent 的提问内容会出现在 SSE 流中,具体解析方式请参见 GetChatContent 的 API 文档。

操作速查表

场景

调用接口

前置条件

发起新对话

CreateDataAgentSession

检查会话状态

DescribeDataAgentSession

发送消息

SendChatMessage

AgentStatus = RUNNING 且 SessionStatus = INIT 或 IDLE

获取回复

GetChatContent

SessionStatus 非 UNAVAILABLE

说明

GetChatContent 支持断点续传:如果调用过程中发生中断,使用相同的 SessionId 配合 Checkpoint 参数重新调用即可。

轮询策略建议

等待 Agent 就绪(轮询 DescribeDataAgentSession)

  • 首次等待 1~2 秒后开始轮询。

  • 轮询间隔建议 2~3 秒。

  • Agent 通常在十几秒内完成启动。

  • 如果超过 2 分钟仍未就绪,建议记录告警并排查。

获取回复(轮询 GetChatContent)

  • 轮询间隔可根据业务场景调整,通常 1~2 秒一次。

前置准备

配置权限

为确保 OpenAPI 调用成功,请为您的 RAM 用户或角色授予以下最小权限集。

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dms:CreateDataAgentSession",
        "dms:DescribeDataAgentSession",
        "dms:SendChatMessage",
        "dms:GetChatContent",
        "dms:DescribeFileUploadSignature",
        "dms:FileUploadCallback",
        "dms:DeleteFileUpload",
        "dms:ListFileUpload"
      ],
      "Resource": "*"
    }
  ]
}

获取 DMSUnit 参数

CreateDataAgentSession 接口的 DMSUnit 参数是 DMS 元数据管理的数据处理地区,并非阿里云地域(RegionCode)。一个阿里云主账号同时只能处在一个 DMSUnit,DMS 管理的数据库实例信息(含元信息以及安全托管的登录信息)存储在该 DMSUnit 对应的元数据库中。

您可以在 DMS 控制台查看您的数据处理地区:登录数据管理DMS 5.0,在页面右上角查看数据处理地区信息。如果未显示该项目,默认为 cn-hangzhou

重要

如果 DMSUnit 传入错误,可能导致数据库分析失败。请务必确认您的数据处理地区后再传入该参数。

配置 SDK 依赖

本文档提供 Java SDK 示例,根据使用场景分为异步和同步两种。

  • 异步 SDK(推荐用于对话交互):适用于流式数据处理。

    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>alibabacloud-dms20250414</artifactId>
        <version>1.0.4</version> <!-- 请使用最新版本 -->
    </dependency>
    
  • 同步 SDK(推荐用于文件管理):适用于请求-响应模式的常规操作,如获取上传签名。

    <dependency>
      <groupId>com.aliyun</groupId>
      <artifactId>dms20250414</artifactId>
      <version>1.8.2</version> <!-- 请使用最新版本 -->
    </dependency>
    

核心场景

实现多轮对话

本章节演示如何使用异步 SDK 完成一次完整的对话交互。

  • 初始化客户端:

    import com.aliyun.auth.credentials.Credential;
    import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
    import com.aliyun.dms20250414.AsyncClient;
    import darabonba.core.client.ClientOverrideConfiguration;
    import darabonba.core.enums.SignatureVersion;
    import darabonba.core.srv.Configuration;
    
    // ...
    
    StaticCredentialProvider provider = StaticCredentialProvider.create(
        Credential.builder()
            .accessKeyId("YOUR_ACCESS_KEY_ID")
            .accessKeySecret("YOUR_ACCESS_KEY_SECRET")
            .build()
    );
    
    AsyncClient client = AsyncClient.builder()
            .region("cn-hangzhou") // Region ID
            .credentialsProvider(provider)
            .serviceConfiguration(Configuration.create()
                    .setSignatureVersion(SignatureVersion.V3)
            )
            .overrideConfiguration(
                    ClientOverrideConfiguration.create()
                            .setProtocol("HTTPS")
                            .setEndpointOverride("dms.cn-hangzhou.aliyuncs.com")
            )
            .build();
  • 代码示例:以下代码整合了创建会话、轮询状态、发送消息和流式接收响应的完整逻辑。

    import com.aliyun.dms20250414.models.*;
    import com.aliyun.common.utils.StringUtils;
    import com.google.gson.Gson;
    import java.util.concurrent.CompletableFuture;
    
    // ... 假设 client 已初始化
    
    // 步骤 1: 创建会话
    CreateDataAgentSessionRequest request = CreateDataAgentSessionRequest.builder()
        .DMSUnit("cn-hangzhou") // DMS 单元标识,通常与 region 一致
        .title("test-session")  // 会话标题
        .build();
    
    CompletableFuture<CreateDataAgentSessionResponse> future = client.createDataAgentSession(request);
    CreateDataAgentSessionResponseBody.Data data = future.get().getBody().getData();
    
    String agentId = data.getAgentId();
    String sessionId = data.getSessionId();
    String agentStatus = data.getAgentStatus();
    
    System.out.println("Session created. SessionId: " + sessionId + ", AgentId: " + agentId);
    
    // 步骤 2: 轮询等待 Agent 运行时就绪
    // 注意:首次启动可能耗时较长,请设置合理的超时和轮询间隔(建议 ≥1s)。
    while (!StringUtils.equalsIgnoreCase(agentStatus, "running")) {
        DescribeDataAgentSessionRequest req = DescribeDataAgentSessionRequest.builder()
            .DMSUnit("cn-hangzhou")
            .sessionId(sessionId)
            .build();
        
        DescribeDataAgentSessionResponse resp = client.describeDataAgentSession(req).get();
        agentStatus = resp.getBody().getData().getAgentStatus();
        System.out.println("Current status: " + agentStatus);
        Thread.sleep(1000);
    }
    
    System.out.println("Agent is RUNNING. Ready to send message.");
    
    // 步骤 3: 发送用户消息
    SendChatMessageRequest msgReq = SendChatMessageRequest.builder()
        .DMSUnit("cn-hangzhou")
        .agentId(agentId)
        .sessionId(sessionId)
        .messageType("primary") // 固定值
        .message("你会跳舞吗?")   // 用户输入
        .build();
    
    client.sendChatMessage(msgReq).get(); // 仅需确认发送成功
    
    System.out.println("Message sent. Waiting for response stream...");
    
    // 步骤 4: 流式接收响应 (SSE)
    GetChatContentRequest contentReq = GetChatContentRequest.builder()
        .DMSUnit("cn-hangzhou")
        .agentId(agentId)
        .sessionId(sessionId)
        .build();
    
    // 使用 ResponseIterable 支持 SSE 流式读取
    ResponseIterable<GetChatContentResponseBody> stream = 
        client.getChatContentWithResponseIterable(contentReq);
    
    for (GetChatContentResponseBody event : stream) {
        System.out.println("Received chunk: " + new Gson().toJson(event));
        // 处理 event.getData().getContent() 等字段
    }
    
    System.out.println("\n--- End of Stream ---");
    System.out.println("Full response: " + fullResponse.toString());
    
    // (可选) 步骤 5: 获取 Agent 运行产物(如报告)
    
    ListFileUploadRequest listFileUploadRequest = ListFileUploadRequest.builder()
            .sessionId(sessionId)
            .fileCategory("WebReport")
            .build();
    
    CompletableFuture<ListFileUploadResponse> response = client.listFileUpload(listFileUploadRequest);
    ListFileUploadResponse listFileUploadResponse = response.get();
    System.out.println((listFileUploadResponse.getBody().getData().get(0).getDownloadLink()));
    
    client.close();
    

实现文件上传与管理

本章节演示如何使用同步 SDK 完成文件的上传、回调与删除,为 Data Agent 提供分析数据。

流程概述
  1. 获取签名:调用 DescribeFileUploadSignature 获取直传 OSS 所需的临时凭证和配置。

  2. 上传文件:使用 HTTP客户端,构造 multipart/form-data POST 请求,将文件直传到签名中指定的 OSS 地址。

  3. 上传回调:文件上传成功后,必须调用 FileUploadCallback 通知 DMS 服务,以获取 FileId

  4. (可选) 删除文件:使用 FileId 调用 DeleteFileUpload 删除已上传的文件。

流程详解
  • 调用DescribeFileUploadSignature获取签名

    Config config = new Config()
      .setAccessKeyId("**********")
      .setAccessKeySecret("**********")
      .setEndpoint("dms.cn-hangzhou.aliyuncs.com")
      .setRegionId("cn-hangzhou");
    
    // 创建DMS客户端实例
    com.aliyun.dms20250414.Client client = new com.aliyun.dms20250414.Client(config);
    
    // 第一步:获取文件上传签名信息
    // 通过调用describeFileUploadSignature方法获取OSS上传所需的签名和配置信息
    DescribeFileUploadSignatureRequest request = new DescribeFileUploadSignatureRequest();
    DescribeFileUploadSignatureResponse response = client.describeFileUploadSignature(request);
    
    // response.getBody().getData()会返回如下信息,后续上传文件会依赖的参数
    // ossCredential
    // ossDate
    // ossSecurityToken
    // ossSignature
    // ossSignatureVersion
    // policy
    // uploadDir
    // uploadHost
  • 使用签名信息进行上传文件

    • 代码示例:

      import okhttp3.*;
      import java.io.File;
      import java.io.IOException;
      
      /**
        * <dependency>
        *     <groupId>com.squareup.okhttp3</groupId>
        *     <artifactId>okhttp</artifactId>
        *     <version>4.12.0</version>
        * </dependency>
        */
      public class Main {
      
          public static void main(String[] args) throws IOException {
              OkHttpClient client = new OkHttpClient();
      
              # 以下参数为DescribeFileUploadSignature接口出参返回
              String policy = "eyJjb25kaXRpb25zIjpbeyJ4LW9zcy1jcmVkZW50aWFsIjoiU1RTLk5aZXdMdlN5SFRzdURFRGprSlh4VFF3YjgvMjAyNjAxMDMvY24taGFuZ3pob3Uvb3NzL2FsaXl1bl92NF9yZXF1ZXN0In0seyJ4LW9zcy1kYXRlIjoiMjAyNjAxMDNUMDYzN**********************************";
              String signature = "623e53b1d07431d17cd60389329de2906882d8c4eb****************";
              String signatureVersion = "OSS4-HMAC-SHA256";
              String credential = "STS.NZewLvSy**********/20260103/cn-hangzhou/oss/aliyun_v4_request";
              String date = "20260103T063703Z";
              String securityToken = "CAIS4gJ1q6Ft5B2yfSjIr5nQPPbCvqZp47GeRmP1jmsfVPd4vrLJ2jz2IHhMdXlrCOgYt/8xnG1V6f8flrJ/ToQAX0HfatZq5ZkS9AqnaoXM/te496IFg5D9r6Jc9c6gjqHoeOzcYI73WJXEMiLp9EJaxb/9ak/RPTiMOoGIjphKd8keWhLCAxNNGNZRIHkJyqZYTwyzU8ygKRn3mGHdIVN1sw5n8wNF5L+439eX52i17jS46JdM/9ysesH5NpQxbMwkDYnk5oEsKPqdihw3wgNR6aJ7gJZD/Tr6pdyHCzFTmU7ea7uEqYw3clYiOPBnRvEd8eKPnPl5q/HVm4Hs0wxKNuxOSCXZS4yp3MLeH+ekJgOGwWFHz9qnOLmtQXqV22tMCRpzXIiaZEa91greI6iNW+Ory74mxSFbrz3ZP4yv+o+Yv3QbMVumcySkKVbBbVvnv0R8GNsIC2lMUbp+hsgbbvFuG2QagAFh1H7d9Oe4VqNEu9A77lsl40KWoyVULPdbT+3fFlpd4s/gDL2lRdm1pTK60pwHPCp8LEI9sYOuUupKxVeNuCb0xRNOK**************************************************************";
              String key = "data_agent/file_upload/16738266********/20260103T063703Z/b8zokydg5bxg1d*********/date.csv";
              String uploadHost = "https://******.oss-cn-hangzhou.aliyuncs.com";
      
              RequestBody requestBody = new MultipartBody.Builder()
                      .setType(MultipartBody.FORM)
                      .addFormDataPart("success_action_status", "200")
                      .addFormDataPart("policy", policy)
                      .addFormDataPart("x-oss-signature", signature)
                      .addFormDataPart("x-oss-signature-version", signatureVersion)
                      .addFormDataPart("x-oss-credential", credential)
                      .addFormDataPart("x-oss-date", date)
                      .addFormDataPart("key", key)
                      .addFormDataPart("x-oss-security-token", securityToken)
                      .addFormDataPart("file", "date.csv",
                              RequestBody.create(new File("/Downloads/date.csv"), MediaType.parse("text/csv")))
                      .build();
      
              Request request = new Request.Builder()
                      .url(uploadHost)
                      .post(requestBody)
                      .build();
      
              try (Response response = client.newCall(request).execute()) {
                  System.out.println("Response Code: " + response.code());
                  System.out.println("Response Body: " + response.body().string());
              }
          }
      }
      
    • 参数说明:

      参数

      类型

      示例值

      说明

      success_action_status

      int

      200

      必填

      policy

      string

      eyJjb25kaXRpb25zIjpbeyJ4***********************

      必填,DescribeFileUploadSignature接口出参会返回

      x-oss-signature

      string

      78dc0f211df15e21e********

      必填,DescribeFileUploadSignature接口出参会返回

      x-oss-signature-version

      string

      OSS4-HMAC-SHA256

      必填,DescribeFileUploadSignature接口出参会返回

      x-oss-credential

      string

      STS.NZdn3cJ1UX************/20260101/cn-hangzhou/oss/aliyun_v4_request

      必填,DescribeFileUploadSignature接口出参会返回

      x-oss-date

      string

      20260101T161427Z

      必填,DescribeFileUploadSignature接口出参会返回

      x-oss-security-token

      string

      CAIS4gJ1q6Ft5B2yfSjIr5nRJYnXp+5075etelGD3HQjYsoUj****************************

      必填,DescribeFileUploadSignature接口出参会返回

      key

      string

      key=data_agent/file_upload/16738266************/20260101T161427Z/80z0lplhacu4***************/date.csv

      必填,文件上传的完整路径,DescribeFileUploadSignature接口出参UploadDir拼接上文件名称:${UploadDir}/${文件名}

      • UploadDir=data_agent/file_upload/16738266************/20260101T161427Z/80z0lplhacu4***************/date.csv

      • 文件名称=date.csv

      file

      string

      @date.csv;type=text/csv

      必填,文件名、二进制数据、文件MediaType,当前仅支持csv、xlsx、xls文件格式

      • file必须作为最后一个参数

      • 文件大小上限为200MB

      • 仅支持csv、xlsx、xls文件格式,MediaType如下

        • csv:text/csv

        • xlsx:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

        • xls:application/vnd.ms-excel

    • 实现示例:

      curl -v \
        -F "success_action_status=200" \
        -F "policy=eyJjb25kaXRpb25zIjpbeyJ4LW9zcy1jcmVkZW50aWFsIjoiU1RTLk5aZG4zY0oxVVhVRnh3Mjh0dm5FOGJ3V3ovMjAyNjAxMDEvY24taGFuZ3pob3Uvb3NzL2FsaXl1bl92NF9yZXF1ZXN0In0seyJ4LW9zcy1kYXRlIjoiMjAyNjAxMDFUMTYxNDI3WiJ9LHsieC1vc3Mtc2VjdXJpdHktdG9rZW4iOiJDQUlTNGdKMXE2RnQ1QjJ5ZlNqSXI1blJKWW5YcCs1MDc1ZXRlbEdEM0hRallzb1VqYkw4bUR6MklIaE1kWGxyQ09nWXQvOHhuRzFWNmY4ZmxySi9Ub1FBWDBIZmF0WnE1WmtTOUFxbmFvWE0vdGU0OTZJRmc1RDlvL2xOdDhHZ2pxSG9lT3pjWUk3M1dKWEVNaUxwOUVKYXhiLzlhay9SUFRpTU9vR****************************************************************************" \
        -F "x-oss-signature=78dc0f211df15e21e675ad3835a0f18f*******************" \
        -F "x-oss-signature-version=OSS4-HMAC-SHA256" \
        -F "x-oss-credential=STS.NZdn3cJ1UXU**************************************/20260101/cn-hangzhou/oss/aliyun_v4_request" \
        -F "x-oss-date=20260101T161427Z" \
        -F "key=data_agent/file_upload/16738266********/20260101T161427Z/80z0lplhacu40***********/date.csv" \
        -F "x-oss-security-token=CAIS4gJ1q6Ft5B2yfSjIr5nRJYnXp+5075etelGD3HQjYsoUjbL8mDz2IHhMdXlrCOgYt/8xnG1V6f8flrJ/ToQAX0HfatZq5ZkS9AqnaoXM/te496IFg5D9o/lNt8GgjqHoeOzcYI73WJXEMiLp9EJaxb/9ak/RPTiMOoGIjphKd8keWhLCAxNNGNZRIHkJyqZYTwyzU8ygKRn3mGHdIVN1sw5n8wNF5L+439eX52i17jS46JdM/9ysesH5NpQxbMwkDYnk5oEsKPqdihw3wgNR6aJ7gJZD/Tr6pdyHCzFTmU7ea7uEqYw3clYiOPBnRvEd8eKPnPl5q/HVm4Hs0wxKNuxOSCXZS4yp3MLeH+ekJgOGwWFHz9qnOLmtQXqV22tMCRpzXIiaJ1W/5/reI6iNW+Ory74mxSFbrz3ZP4yv+o+Yv3QbMVumcySkKVbBbVvnv0R8GNsIC2lMUbp+oQx4pPFuG2QagAFUp8U5qf8WDmpuc7ztSzLSLizgMnGPNbJGjU1dYCd2P0omHZaZyeuTj7QGpX0IW6DuKpvvHS9i/8R8M0dL2ssMsWTeK4wYE6sWXp7SbqM0mZY**************************************" \
        -F "file=@date.csv;type=text/csv" \
        "https://*******.oss-cn-hangzhou.aliyuncs.com"
  • 文件上传成功后进行回调

    DescribeFileUploadSignatureResponseBody.DescribeFileUploadSignatureResponseBodyData data = response.getBody().getData();
    String filename = "data.csv";
    String uploadLocation = data.getUploadDir() + "/" +  filename;
    
    // 通知DMS服务文件已成功上传,获取文件ID
    FileUploadCallbackRequest callbackRequest = new FileUploadCallbackRequest();
    callbackRequest.setFilename(filename);              // 设置文件名
    callbackRequest.setUploadLocation(uploadLocation);  // 设置上传路径
    
    // 发送回调请求,获取文件ID
    FileUploadCallbackResponse callbackResponse = client.fileUploadCallback(callbackRequest);
    System.out.println("上传成功,文件ID: " + callbackResponse.getBody().getData().getFileId());
  • 删除上传的文件

    // 根据文件ID删除上传的文件
    DeleteFileUploadRequest request = new DeleteFileUploadRequest();
    request.setFileId(callbackResponse.getBody().getData().getFileId());
    
    DeleteFileUploadResponse response = client.deleteFileUpload(request);
  • 以下是一个完整的 Java 示例,整合了上述所有步骤。

    import com.aliyun.dms20250414.models.*;
    import com.aliyun.teaopenapi.models.Config;
    import okhttp3.*;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * 文件上传示例类
     * 
     * 该示例演示了如何使用DMS服务上传文件到OSS的完整流程:
     * 1. 获取上传签名信息
     * 2. 执行文件上传到OSS
     * 3. 发送上传回调确认
     */
    public class FileUploadExample {
    
        // 定义本地文件路径和上传配置
        private static final String localFilePath = "/Users/******/Downloads/date.csv";  // 本地文件路径
        private static final String filename = "date.csv";                               // 文件名
    
        public static void main(String[] args) throws Exception {
            // 配置DMS客户端参数
            Config config = new Config()
                    .setAccessKeyId("********")
                    .setAccessKeySecret("********")
                    .setEndpoint("dms.cn-hangzhou.aliyuncs.com")
                    .setRegionId("cn-hangzhou");
    
            // 创建DMS客户端实例
            com.aliyun.dms20250414.Client client = new com.aliyun.dms20250414.Client(config);
    
            // 第一步:获取文件上传签名信息
            // 通过调用describeFileUploadSignature方法获取OSS上传所需的签名和配置信息
            DescribeFileUploadSignatureRequest request = new DescribeFileUploadSignatureRequest();
            DescribeFileUploadSignatureResponse response = client.describeFileUploadSignature(request);
            System.out.println(response.getBody().getData());
    
            // 解析响应数据,获取上传所需的配置信息
            DescribeFileUploadSignatureResponseBody.DescribeFileUploadSignatureResponseBodyData data = response.getBody().getData();
            String uploadLocation = data.getUploadDir() + "/" +  filename;                   // 在OSS中的上传路径
    
            // 第二步:执行文件上传到OSS
            // 使用获取到的签名信息,将文件上传到OSS
            int code = doUploadFile(data, filename, localFilePath, uploadLocation);
            
            // 上传成功后,发送回调确认
            if (code == 200) {
                // 第三步:上传成功后发送回调确认
                // 通知DMS服务文件已成功上传,获取文件ID
                FileUploadCallbackRequest callbackRequest = new FileUploadCallbackRequest();
                callbackRequest.setFilename(filename);              // 设置文件名
                callbackRequest.setUploadLocation(uploadLocation);  // 设置上传路径
    
                // 发送回调请求,获取文件ID
                FileUploadCallbackResponse callbackResponse = client.fileUploadCallback(callbackRequest);
                
                // 打印上传成功后的文件ID
                System.out.println("上传成功,文件ID: " + callbackResponse.getBody().getData().getFileId());
            } else {
                System.out.println("文件上传失败,状态码: " + code);
            }
        }
    
        /**
         * 执行文件上传到OSS
         * 
         * 该方法使用OkHttp客户端将文件上传到OSS,需要提供OSS签名信息、文件信息等参数
         * 
         * @param data 从describeFileUploadSignature接口获取的签名数据
         * @param filename 文件名
         * @param fileLocalPath 本地文件路径
         * @param uploadLocation 在OSS中的上传路径
         * @return 上传HTTP响应码,200表示成功
         * @throws IOException 网络或文件操作异常
         */
        private static int doUploadFile(DescribeFileUploadSignatureResponseBody.DescribeFileUploadSignatureResponseBodyData data, String filename, String fileLocalPath, String uploadLocation) throws IOException {
            OkHttpClient client = new OkHttpClient();
    
            // 构建多部分表单请求体,包含OSS上传所需的各项参数
            RequestBody requestBody = new MultipartBody.Builder()
                    .setType(MultipartBody.FORM)
                    .addFormDataPart("success_action_status", "200")                      // 必须设置success_action_status=200
                    .addFormDataPart("policy", data.getPolicy())                          // 签名策略
                    .addFormDataPart("x-oss-signature", data.getOssSignature())           // OSS签名
                    .addFormDataPart("x-oss-signature-version", data.getOssSignatureVersion()) // 签名版本
                    .addFormDataPart("x-oss-credential", data.getOssCredential())         // 凭证
                    .addFormDataPart("x-oss-date", data.getOssDate())                     // 日期
                    .addFormDataPart("key", uploadLocation)                               // 上传路径
                    .addFormDataPart("x-oss-security-token", data.getOssSecurityToken())  // 安全令牌
                    .addFormDataPart("file", filename,                                    // 文件部分
                            RequestBody.create(new File(fileLocalPath), MediaType.parse("text/csv"))) // 创建文件请求体,需要按文件类型设置媒体类型
                    .build();
    
            // 构建POST请求
            Request request = new Request.Builder()
                    .url(data.getUploadHost())  // 使用返回的上传主机地址
                    .post(requestBody)          // 设置请求体
                    .build();
    
            // 执行请求并处理响应
            try (Response response = client.newCall(request).execute()) {
                System.out.println("上传响应码: " + response.code());
                System.out.println("上传响应体: " + response.body().string());
                return response.code();
            }
        }
    }
    重要

    在构造上传请求时,请确保所有从 DescribeFileUploadSignature 获取的表单字段都已包含,且 file 字段必须是 multipart/form-data 请求的最后一个部分。

    • 文件大小上限:200MB。

    • 支持格式:CSV, XLSX, XLS。请根据文件类型设置正确的 MediaType

API 参考

API 名称

功能

CreateDataAgentSession

创建对话会话,触发 Agent 运行时启动

DescribeDataAgentSession

查询会话状态与元信息

SendChatMessage

向会话发送用户消息

GetChatContent

流式拉取 Agent 生成内容 (SSE)

ListFileUpload

获取 Agent 产物(含报告)

DescribeFileUploadSignature

获取上传文件的签名信息

FileUploadCallback

上传文件成功后回调

DeleteFileUpload

删除已上传的文件

CreateDataAgentKnowledgeBase

创建DataAgent知识库

DeleteDataAgentKnowledgeBase

删除DataAgent知识库

DescribeKnowledgeBaseStats

获取知识库的统计信息

ListKnowledgeBases

获取知识库列表

DescribeKnowledgeBaseUploadSignature

获取知识库上传文档的签名

UpdateKnowledgeBase

更新知识库

DeleteDocument

删除知识库文档

DescribeDocument

查看知识库文档详细信息

ListDocuments

查询知识库文档列表

UpdateDocument

更新知识库文档

UploadDocument

上传知识库文档

DeleteDocumentChunks

删除知识块

ListDocumentChunks

查询知识块列表

UpsertDocumentChunks

更新知识块

ListCustomAgent

查询自定义Agent列表

DescribeCustomAgent

查询自定义Agent详情

CreateCustomAgent

创建自定义Agent

DeleteCustomAgent

删除自定义Agent

ModifyCustomAgent

修改自定义Agent配置

OperateCustomAgent

启用或停用自定义Agent

常见问题

  • Q:如何为对话指定数据源?
    A:在调用 SendChatMessage 时,通过其参数传入数据源信息。同一 Session 内可多次传入,以实现数据追加分析。

  • Q:如何使用自定义 Agent?
    A:在调用 CreateDataAgentSession 时,传入您的自定义 AgentId。该 AgentId 在会话生命周期内不可更改。自定义 Agent 同样需要通过控制台创建和获取。

  • Q:agentStatus 状态长时间处于 STARTING 怎么办?
    A:Agent 运行时首次启动可能需要数秒到数分钟。如果长时间未变为 RUNNING,请联系阿里云技术支持。

  • Q:如何实现多轮对话?
    A: 复用同一个 sessionId。每次用户提问都调用一次 SendChatMessage,然后通过 GetChatContent 获取该轮对话的响应。

  • Q:流式响应中断/追加提问怎么继续获取流式响应?

    A:可记录最后收到的 checkpoint,下次请求时作为参数传入,具体参数参考 SendChatMessageOpenAPI 文档。

  • Q:如何获取文字报告?

    A:通过ListFileUpload接口可以获取所有相关的产物,包括Agent运行的中间文件产物,以及产出的文字报告。

  • Q:DMSUnit 参数应该填什么?

    A:DMSUnit 是 DMS 的数据处理地区,不是阿里云地域(RegionCode)。您可以在 DMS 控制台右上角查看,如果未显示该项目,默认为 cn-hangzhou。传入错误的 DMSUnit 可能导致数据库分析失败。

  • Q:能否同时向一个 Session 发送多条消息?

    A:不支持。每个 Session 同一时间只能处理一条消息。如需并行处理多个任务,请创建多个独立的 Session。

  • Q:如何回答 Data Agent 的主动提问?

    A:通过 SendChatMessage 发送回答,将 MessageType 设置为 additionalQuestion 参数填写 Data Agent 提问的原文。