手册手册
  • 数字人创作SDK 集成开发

数字人创作SDK 集成开发

安装

示例
# npm 安装
npm install nuwaai-sdk 

# 引入
import { NuwaAISDK } from 'nuwaai-sdk';
const sdk=new NuwaAISDK()

# 或直接下载 SDK 包
# 下载地址:https://nuwaai.com/demo/api-sdk/demo.api.tgz


# 直接下载 SDK 包
# 下载地址 https://docs.nuwaai.com/sdk/NuwaAI-IOSSDK.zip
# 在 Xcode 中添依赖 libNuwaSDK.a, WebRTC.framework


import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaAIConfig;

NuwaAIConfig config = NuwaAIConfig.builder()
    .apiKey("sk-xxxx")
    // .baseUrl("https://api.nuwaai.com")  // 可选,默认即该地址
    .build();
NuwaAIClient.init(config);
// 将 nuwa-sdk.js 置于小程序 utils 目录(与本仓库 miniprogram/utils/nuwa-sdk.js 一致)
const nuwa = require('../../utils/nuwa-sdk.js');
const sdk = nuwa.createClient({ secretKey: 'sk-xxxx' });
// 可选:sdk.baseUrl 默认为 https://api.nuwaai.com
  • sdk 演示

2. 全局约定

接口调用流程:

  • 第一步:到平台申请API Key
  • 第二步:调用鉴权接口,通过API Key获取Token
  • 第三步:调用业务接口,请求头带上token

Base URL:

https://api.nuwaai.com

2.1 请求格式

所有接口默认采用以下 Header:

HeaderValue
Content-Typeapplication/json
AuthorizationBearer <token>

2.2 返回格式

{
  "code": 0,
  "msg": "success",
  "data": Object
}
  • code:0 表示成功
  • message:错误或提示信息
  • data:实际返回内容

3. 鉴权接口

3.1 根据API Key获取Token

POST /web/apiKey/auth

请求示例

示例
const res = await sdk.authByApiKey("sk-xxxx");
console.log(res.data); // token
import NuwaSDK

// 获取访问令牌
NuwaAuthManager.getAccessTokenWithAPIKey("sk-xxxx") { accessToken, error in
    if let error = error {
        print("获取令牌失败: \(error.localizedDescription)")
        return
    }
    
    if let accessToken = accessToken {
        print("获取令牌成功: \(accessToken)")
        // 保存令牌用于后续接口调用
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 获取访问令牌
[NuwaAuthManager getAccessTokenWithAPIKey:@"sk-xxxx" completion:^(NSString * _Nullable accessToken, NSError * _Nullable error) {
    if (error) {
        NSLog(@"获取令牌失败: %@", error.localizedDescription);
        return;
    }
    
    if (accessToken) {
        NSLog(@"获取令牌成功: %@", accessToken);
        // 保存令牌用于后续接口调用
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;

// 需先 NuwaAIConfig + NuwaAIClient.init(见「安装」)
NuwaAIClient.getInstance().authenticate(new NuwaCallback<String>() {
    @Override
    public void onSuccess(String token) {
        // token;SDK 会写入内部 TokenManager,后续接口自动带 Authorization
    }

    @Override
    public void onFailure(int code, String message) { }
});
const nuwa = require('../../utils/nuwa-sdk.js');
const sdk = nuwa.createClient({ secretKey: 'sk-xxxx' });
const token = await sdk.auth(); // 成功后内部已保存 token,后续请求自动带 Authorization
console.log(token);

返回示例

{
  "code": 0,
  "msg": null,
  "data": "MnTjgFHRfslJov-PG9yNdKtGaxPicW06VKCRCt5-zuAh_YA0ECkp9cbFCR8kuK50EgSPFjtabTkAtR-1fNFLUoa-G7o3301t4zIem82yn2Sj5iglV-GDU3OA7pwaZff_"
}

请求参数说明

参数名参数类型是否必填参数说明
secretKeyString是API key

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataStringtoken

4. 文件管理接口

4.1 文件上传

POST /web/web-file/upload

请求示例

示例
const uploadRes = await sdk.uploadFile(file);
console.log(uploadRes.data.url);
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 上传文件
let fileURL = URL(fileURLWithPath: "/path/to/local.jpg")
apiClient.uploadFile(fileURL) { result, error in
    if let error = error {
        print("上传失败: \(error.localizedDescription)")
        return
    }
    
    if let result = result, let url = result["url"] as? String {
        print("上传成功,文件URL: \(url)")
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 上传文件
NSURL *fileURL = [NSURL fileURLWithPath:@"/path/to/local.jpg"];
[apiClient uploadFile:fileURL completion:^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        NSLog(@"上传失败: %@", error.localizedDescription);
        return;
    }
    
    if (result) {
        NSString *url = result[@"url"];
        if (url) {
            NSLog(@"上传成功,文件URL: %@", url);
        }
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.FileUploadResult;

import java.io.File;

File file = new File("/path/to/local.jpg");
NuwaAIClient.getInstance().getFileManager().uploadFile(file, new NuwaCallback<FileUploadResult>() {
    @Override
    public void onSuccess(FileUploadResult data) {
        String url = data.getUrl();
    }

    @Override
    public void onFailure(int code, String message) { }
});
// filePath:wx.chooseMessageFile / chooseMedia 等返回的临时路径
const res = await sdk.uploadFile(filePath);
console.log(res.url);

返回示例

{
    "code": 0,
    "msg": null,
    "data": {
        "bucketName": "nuwa",
        "fileName": "78/202512/20251202/5c0b16e1c89d4ff9ae9b93f775a722f6.jpeg",
        "url": "/nuwa/78/202512/20251202/5c0b16e1c89d4ff9ae9b93f775a722f6.jpeg"
    }
}

请求参数说明

参数名参数类型是否必填参数说明
fileMultipartFile是文件

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
bucketNameString桶名
fileNameStringoss中的文件名
urlStringoss中的路径

4.2 文件删除

DELETE /web/web-file/deleteFile

请求示例

示例
await sdk.deleteFile("/nuwa/xx/xx.pptx");
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 删除文件
apiClient.deleteFile("/nuwa/xx/xx.pptx") { success, error in
    if let error = error {
        print("删除失败: \(error.localizedDescription)")
        return
    }
    
    if success {
        print("删除成功")
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 删除文件
[apiClient deleteFile:@"/nuwa/xx/xx.pptx" completion:^(BOOL success, NSError * _Nullable error) {
    if (error) {
        NSLog(@"删除失败: %@", error.localizedDescription);
        return;
    }
    
    if (success) {
        NSLog(@"删除成功");
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;

NuwaAIClient.getInstance().getFileManager().deleteFile("/nuwa/xx/xx.pptx", new NuwaCallback<Boolean>() {
    @Override
    public void onSuccess(Boolean data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.deleteFile('/nuwa/xx/xx.pptx');

返回示例

 {
  "code": 0,
  "msg": null,
  "data": true
}

请求参数说明

参数名参数类型是否必填参数说明
filePathString是oss中的文件路径

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataBooleantrue : 成功,false:失败

4.3 获取文件预览地址

GET /web/document/getDownPreSignedUrl

请求示例

示例
const previewRes = await sdk.getDownPreSignedUrl("134/figure/demo.mp4");
console.log(previewRes.data);
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 获取文件预览地址
apiClient.getPreviewURLForFilename("134/figure/demo.mp4") { previewURL, error in
    if let error = error {
        print("获取预览地址失败: \(error.localizedDescription)")
        return
    }
    
    if let previewURL = previewURL {
        print("预览地址: \(previewURL)")
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 获取文件预览地址
[apiClient getPreviewURLForFilename:@"134/figure/demo.mp4" completion:^(NSString * _Nullable previewURL, NSError * _Nullable error) {
    if (error) {
        NSLog(@"获取预览地址失败: %@", error.localizedDescription);
        return;
    }
    
    if (previewURL) {
        NSLog(@"预览地址: %@", previewURL);
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;

NuwaAIClient.getInstance().getFileManager().getPreSignedUrl("134/figure/demo.mp4", new NuwaCallback<String>() {
    @Override
    public void onSuccess(String url) { }

    @Override
    public void onFailure(int code, String message) { }
});
const url = await sdk.getDownPreSignedUrl('134/figure/demo.mp4');
console.log(url);

返回示例

{
  "code": 0,
  "msg": null,
  "data": "https://nuwa-ai.oss-cn-shenzhen.aliyuncs.com/134/figure/1947499417004638210/be367e3322de4b0eb857aaa62ddd3e46.mp4?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20251202T025318Z&X-Amz-SignedHeaders=host&X-Amz-Expires=518399&X-Amz-Credential=YHenriLQRiAqWFbmnZgQ%2F20251202%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=93e949dd325710726103601e661b9bb8b517abcc830fc783388fcd067ecee586"
}

请求参数说明

参数名参数类型是否必填参数说明
filenameString是oss中的文件名

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataString文件预览地址

4.4 文件下载

GET /web/web-file/download

请求示例

示例
const resp = await sdk.downloadFile("/nuwa/xx/demo.pptx");
const blob = await resp.blob();
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 下载文件
apiClient.downloadFile("/nuwa/xx/demo.pptx") { data, error in
    if let error = error {
        print("下载失败: \(error.localizedDescription)")
        return
    }
    
    if let data = data {
        // 处理下载的数据,例如保存到本地文件
        let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        let fileURL = documentsDirectory.appendingPathComponent("demo.pptx")
        
        do {
            try data.write(to: fileURL)
            print("文件保存成功: \(fileURL.path)")
        } catch {
            print("保存文件失败: \(error.localizedDescription)")
        }
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 下载文件
[apiClient downloadFile:@"/nuwa/xx/demo.pptx" completion:^(NSData * _Nullable data, NSError * _Nullable error) {
    if (error) {
        NSLog(@"下载失败: %@", error.localizedDescription);
        return;
    }
    
    if (data) {
        // 处理下载的数据,例如保存到本地文件
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"demo.pptx"];
        
        BOOL success = [data writeToFile:filePath atomically:YES];
        if (success) {
            NSLog(@"文件保存成功: %@", filePath);
        } else {
            NSLog(@"保存文件失败");
        }
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;

import okhttp3.ResponseBody;

NuwaAIClient.getInstance().getFileManager().downloadFile("/nuwa/xx/demo.pptx", new NuwaCallback<ResponseBody>() {
    @Override
    public void onSuccess(ResponseBody body) {
        // 将 body.byteStream() 写入本地文件等
    }

    @Override
    public void onFailure(int code, String message) { }
});
const tempFilePath = await sdk.downloadFile('/nuwa/xx/demo.pptx');
// 需在小程序后台配置 downloadFile 合法域名:api.nuwaai.com

返回示例



请求参数说明

参数名参数类型是否必填参数说明
urlString是oss中的文件地址

5. 生图/生视频接口

5.1 文生图

POST /web/model/submitTask

请求示例

示例
await sdk.textToImage({
  forwardPrompt: "生成一张在海边散步的美女图片",
  bizId: 1995841869673639938,
  from: "1",
  aspectRatio: "16:9",
  model: "doubao-seedream-4-5-251128"
});
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 文生图
apiClient.textToImageWithForwardPrompt("生成一张在海边散步的美女图片",
                                      bizId: "1995841869673639938",
                                      from: "1",
                                      aspectRatio: "16:9",
                                      model: "doubao-seedream-4-5-251128") { taskId, error in
    if let error = error {
        print("文生图失败: \(error.localizedDescription)")
        return
    }
    
    if let taskId = taskId {
        print("文生图任务已提交,任务ID: \(taskId)")
        // 可以使用 taskId 查询任务进度
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 文生图
[apiClient textToImageWithForwardPrompt:@"生成一张在海边散步的美女图片"
                                 bizId:@"1995841869673639938"
                                  from:@"1"
                           aspectRatio:@"16:9"
                                 model:@"doubao-seedream-4-5-251128"
                            completion:^(NSString * _Nullable taskId, NSError * _Nullable error) {
    if (error) {
        NSLog(@"文生图失败: %@", error.localizedDescription);
        return;
    }
    
    if (taskId) {
        NSLog(@"文生图任务已提交,任务ID: %@", taskId);
        // 可以使用 taskId 查询任务进度
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;

NuwaAIClient.getInstance().getModelManager().text2Image(
    "生成一张在海边散步的美女图片",
    1995841869673639938L,
    "1",
    "doubao-seedream-4-5-251128",
    "16:9",
    new NuwaCallback<String>() {
        @Override
        public void onSuccess(String requestId) { }

        @Override
        public void onFailure(int code, String message) { }
    });
await sdk.submitTask({
  type: 'text2img',
  forwardPrompt: '生成一张在海边散步的美女图片',
  bizId: 1995841869673639938,
  from: '1',
  aspectRatio: '16:9',
  model: 'doubao-seedream-4-5-251128'
});

返回示例

{
  "code": 0,
  "msg": null,
  "data": "0be340e8bfd4405fab420a02ac3150d1"
}

请求参数说明

参数名参数类型是否必填参数说明
typeString是生成类型(img2img:图生图,text2img:文生图,img2video:图生视频)
forwardPromptString是正向提示词
bizIdLong是形象或才艺Id
fromString是来源(1:形象美化,2:才艺美化,3:创建数字人,4:生成形象动作视频,5:生成才艺动作视频)
modelString是模型Id(文生图可选项:gemini-3-pro-image-preview,gemini-3.1-flash-image-preview,doubao-seedream-4-0-250828,doubao-seedream-4-5-251128,doubao-seedream-5-0-260128)
aspectRatioString否生成图片的宽高比(可选:16:9,9:16,默认:16:9)

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataString请求Id

5.2 图生图

POST /web/model/submitTask

请求示例

示例
await sdk.imageToImage({
  forwardPrompt: "请保持风格生成新图",
  bizId: 1995841869673639938,
  from: "1",
  path: "/nuwa/xx/ref.jpg"
});
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 图生图
apiClient.imageToImageWithForwardPrompt("请保持风格生成新图",
                                       imageURL: "/nuwa/xx/ref.jpg",
                                       bizId: "1995841869673639938",
                                       from: "1",
                                       aspectRatio: nil,
                                       model: "doubao-seedream-4-5-251128") { taskId, error in
    if let error = error {
        print("图生图失败: \(error.localizedDescription)")
        return
    }
    
    if let taskId = taskId {
        print("图生图任务已提交,任务ID: \(taskId)")
        // 可以使用 taskId 查询任务进度
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 图生图
[apiClient imageToImageWithForwardPrompt:@"请保持风格生成新图"
                                imageURL:@"/nuwa/xx/ref.jpg"
                                   bizId:@"1995841869673639938"
                                    from:@"1"
                             aspectRatio:nil
                                   model:@"doubao-seedream-4-5-251128"
                              completion:^(NSString * _Nullable taskId, NSError * _Nullable error) {
    if (error) {
        NSLog(@"图生图失败: %@", error.localizedDescription);
        return;
    }
    
    if (taskId) {
        NSLog(@"图生图任务已提交,任务ID: %@", taskId);
        // 可以使用 taskId 查询任务进度
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;

NuwaAIClient.getInstance().getModelManager().img2Image(
    "请保持风格生成新图",
    1995841869673639938L,
    "1",
    "doubao-seedream-4-5-251128",
    null,
    "/nuwa/xx/ref.jpg",
    new NuwaCallback<String>() {
        @Override
        public void onSuccess(String requestId) { }

        @Override
        public void onFailure(int code, String message) { }
    });
await sdk.submitTask({
  type: 'img2img',
  forwardPrompt: '请保持风格生成新图',
  bizId: 1995841869673639938,
  from: '1',
  model: 'doubao-seedream-4-5-251128',
  path: '/nuwa/xx/ref.jpg'
});

返回示例

{
  "code": 0,
  "msg": null,
  "data": "0be340e8bfd4405fab420a02ac3150d1"
}

请求参数说明

参数名参数类型是否必填参数说明
typeString是生成类型(img2img:图生图,text2img:文生图,img2video:图生视频)
forwardPromptString是正向提示词
bizIdLong是形象或才艺Id
fromString是来源(1:形象美化,2:才艺美化,3:创建数字人,4:生成形象动作视频,5:生成才艺动作视频)
modelString是模型Id(图生图可选项:gemini-3-pro-image-preview,gemini-3.1-flash-image-preview,doubao-seedream-4-0-250828,doubao-seedream-4-5-251128,doubao-seedream-5-0-260128)
aspectRatioString否生成图片的宽高比(可选:16:9,9:16,默认:16:9)
pathString是Oss中参考图片地址

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataString请求Id

5.3 图生视频

GET /api/order/detail?id=557899

请求示例

示例
await sdk.imageToVideo({
  forwardPrompt: "人物轻微走动",
  bizId: 1995841869673639938,
  from: "1",
  videoTime: 5,
  path: "/nuwa/xx/ref.jpg"
});
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 图生视频
apiClient.imageToVideoWithForwardPrompt("人物轻微走动",
                                       imageURL: "/nuwa/xx/ref.jpg",
                                       bizId: "1995841869673639938",
                                       from: "1",
                                       videoTime: 5) { taskId, error in
    if let error = error {
        print("图生视频失败: \(error.localizedDescription)")
        return
    }
    
    if let taskId = taskId {
        print("图生视频任务已提交,任务ID: \(taskId)")
        // 可以使用 taskId 查询任务进度
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 图生视频
[apiClient imageToVideoWithForwardPrompt:@"人物轻微走动"
                                imageURL:@"/nuwa/xx/ref.jpg"
                                   bizId:@"1995841869673639938"
                                    from:@"1"
                                videoTime:5
                              completion:^(NSString * _Nullable taskId, NSError * _Nullable error) {
    if (error) {
        NSLog(@"图生视频失败: %@", error.localizedDescription);
        return;
    }
    
    if (taskId) {
        NSLog(@"图生视频任务已提交,任务ID: %@", taskId);
        // 可以使用 taskId 查询任务进度
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;

NuwaAIClient.getInstance().getModelManager().img2Video(
    "人物轻微走动",
    1995841869673639938L,
    "1",
    null,
    null,
    "/nuwa/xx/ref.jpg",
    5,
    new NuwaCallback<String>() {
        @Override
        public void onSuccess(String requestId) { }

        @Override
        public void onFailure(int code, String message) { }
    });
await sdk.submitTask({
  type: 'img2video',
  forwardPrompt: '人物轻微走动',
  bizId: 1995841869673639938,
  from: '1',
  videoTime: 5,
  path: '/nuwa/xx/ref.jpg'
});

返回示例

{
  "code": 0,
  "msg": null,
  "data": "0be340e8bfd4405fab420a02ac3150d1"
}

请求参数说明

参数名参数类型是否必填参数说明
typeString是生成类型(img2img:图生图,text2img:文生图,img2video:图生视频)
forwardPromptString是正向提示词
bizIdLong是形象或才艺Id
fromString是来源(1:形象美化,2:才艺美化,3:创建数字人,4:生成形象动作视频,5:生成才艺动作视频)
videoTimeString是视频时长(单位:秒),可选范围[4,10]
pathString是Oss中参考图片地址

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataString请求Id

5.4 查询生图/生视频结果

POST /web/model/queryTask

请求示例

示例
await sdk.queryModelTask("requestId", 0);
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 查询任务结果
apiClient.queryTaskWithRequestId("requestId", lastReq: 0) { result, error in
    if let error = error {
        print("查询任务失败: \(error.localizedDescription)")
        return
    }
    
    if let result = result {
        print("查询任务成功: \(result)")
        // 处理任务结果
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 查询任务结果
[apiClient queryTaskWithRequestId:@"requestId" lastReq:0 completion:^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        NSLog(@"查询任务失败: %@", error.localizedDescription);
        return;
    }
    
    if (result) {
        NSLog(@"查询任务成功: %@", result);
        // 处理任务结果
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.QueryTaskRequest;
import com.nuwaai.sdk.model.TaskResult;

QueryTaskRequest req = new QueryTaskRequest("requestId", 0);
NuwaAIClient.getInstance().getModelManager().queryTask(req, new NuwaCallback<TaskResult>() {
    @Override
    public void onSuccess(TaskResult data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.queryTask({ requestId: 'requestId', lastReq: 0 });

返回示例

{
  "code": 0,
  "msg": null,
  "data": {
    "status": "done",
    "data": {
      "requestId": "6fa929b620b74dbabe90bade8d967f7a",
      "thumbnailPath": "/pub-nuwa/78/figure/1995841869673639938/a5e9d52675be4a0da036a8093e3ab1d0.jpg",
      "scenePath": "/nuwa/78/figure/1995841869673639938/58eafbb780964614bc5d7b4761211517.jpg",
      "watermarkUrl": "/nuwa/78/figure/1995841869673639938/81ab006fee864635b63b35499216f383.jpg",
      "videoPath": null,
      "userId": "78",
      "from": "1"
    }
  }
}

请求参数说明

参数名参数类型是否必填参数说明
requestIdString是请求Id
lastReqInteger是是否最后一次请求(0:否,1:是)

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
数据对象属性
statusString处理状态(running:处理中,done:处理完成)
dataObject处理结果数据
requestIdString请求Id
userIdLong用户Id
fromString来源(1:形象美化,2:才艺美化,3:创建数字人,4:生成形象动作视频,5:生成才艺动作视频)
videoPathString生成的视频路径
scenePathString生成的图片路径
thumbnailPathString生成的缩略图路径
watermarkUrlString生成的带水印的图片路径

6. 数字人声音创作接口

6.1 创作声音模型

POST /webhp/humanAgent/voiceSet

请求示例

示例
await sdk.voiceSet(file, "音频文案");
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 创作声音模型
let audioURL = URL(fileURLWithPath: "/path/to/audio.wav")
apiClient.createVoiceModel(audioURL, text: "音频文案") { models, error in
    if let error = error {
        print("创作声音模型失败: \(error.localizedDescription)")
        return
    }
    
    if let models = models {
        print("创作声音模型成功: \(models)")
        // 处理声音模型列表
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 创作声音模型
NSURL *audioURL = [NSURL fileURLWithPath:@"/path/to/audio.wav"];
[apiClient createVoiceModel:audioURL text:@"音频文案" completion:^(NSArray * _Nullable models, NSError * _Nullable error) {
    if (error) {
        NSLog(@"创作声音模型失败: %@", error.localizedDescription);
        return;
    }
    
    if (models) {
        NSLog(@"创作声音模型成功: %@", models);
        // 处理声音模型列表
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.VoiceModelResponse;

import java.io.File;

File audio = new File("/path/to/audio.wav");
NuwaAIClient.getInstance().getVoiceManager().createVoiceModel(audio, "音频文案", new NuwaCallback<VoiceModelResponse>() {
    @Override
    public void onSuccess(VoiceModelResponse data) { }

    @Override
    public void onFailure(int code, String message) { }
});
// filePath:本地录音或选择音频的临时路径
await sdk.voiceSet(filePath, '音频文案');

返回示例

{
    "code": 200,
    "model": [
        {
            "version": "1",
            "name": "speech:声音克隆__e4ca50ff",
            "url": "/nuwa-ai/4000170/voice/f2656220c9654cb292ddf6091e56f4b3.wav"
        },
        {
            "version": "3",
            "name": "index:声音克隆__dfb303370fc24d70b328593d4621ae3c",
            "url": "/nuwa-ai/4000170/voice/ba3d776aaf7e4ee1951ee03a47b91f21.wav"
        }
    ]
}

请求参数说明

参数名参数类型是否必填参数说明
fileMultipartFile是音频文件
textString是音频文本内容

响应参数说明

参数名参数类型参数说明
codeInteger200:请求成功,非200 :请求失败
modelArray声音模型列表
model 对象属性
versionString1:支持多国语言,3:仅支持中文
nameString声音模型名称
urlStringoss中声音模型路径

6.2 克隆声音

POST /web/voice/clone

请求示例

示例
await sdk.cloneVoice({ voiceName: "A0012", ... });
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 克隆声音
let voiceModel = ["version": "1", "name": "speech:声音克隆__e4ca50ff", "url": "/nuwa-ai/4000170/voice/f2656220c9654cb292ddf6091e56f4b3.wav"]
apiClient.cloneVoice(voiceName: "A0012", content: "你好,这是一段测试文本", voiceType: "5", sex: "1", age: "1", voiceTime: 5, featureList: ["大气活力"], model: voiceModel) { success, error in
    if let error = error {
        print("克隆声音失败: \(error.localizedDescription)")
        return
    }
    
    if success {
        print("克隆声音成功")
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 克隆声音
NSDictionary *voiceModel = @{@"version": @"1", @"name": @"speech:声音克隆__e4ca50ff", @"url": @"/nuwa-ai/4000170/voice/f2656220c9654cb292ddf6091e56f4b3.wav"};
[apiClient cloneVoiceWithVoiceName:@"A0012" content:@"你好,这是一段测试文本" voiceType:@"5" sex:@"1" age:@"1" voiceTime:5 featureList:@[@"大气活力"] model:voiceModel completion:^(BOOL success, NSError * _Nullable error) {
    if (error) {
        NSLog(@"克隆声音失败: %@", error.localizedDescription);
        return;
    }
    
    if (success) {
        NSLog(@"克隆声音成功");
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.CloneVoiceRequest;

CloneVoiceRequest req = new CloneVoiceRequest();
req.setVoiceName("A0012");
// 按需设置 content、voiceType、sex、age、voiceTime、featureList、model 等字段
NuwaAIClient.getInstance().getVoiceManager().cloneVoice(req, new NuwaCallback<Boolean>() {
    @Override
    public void onSuccess(Boolean data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.voiceClone({ voiceName: 'A0012', /* content、voiceType、model 等 */ });

返回示例

{
    "code": 0,
    "msg": null,
    "data": true
}

请求参数说明

参数名参数类型是否必填参数说明
voiceNameString是声音显示名称
contentString是声音文本内容
voiceTypeString是声音类型(3:豆包,5:复刻)
sexString是性别(1:男,2:女,3:中性)
ageString是年龄(1:青年,2:中年,3:老年,4:儿童)
voiceTimeInteger是声音时长(单位:秒)
featureListArray否声音特征
modelArray是声音模型
model 对象属性
versionString是1:支持多国语言,3:仅支持中文
nameString是声音模型名称
urlString是oss中声音模型路径

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataBooleantrue :成功,false:失败

6.3 删除声音

DELETE /web/voice/delete/{id}

请求示例

示例
await sdk.deleteVoice("1935958397612609538");
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 删除声音
apiClient.deleteVoice("1935958397612609538") { success, error in
    if let error = error {
        print("删除声音失败: \(error.localizedDescription)")
        return
    }
    
    if success {
        print("删除声音成功")
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 删除声音
[apiClient deleteVoice:@"1935958397612609538" completion:^(BOOL success, NSError * _Nullable error) {
    if (error) {
        NSLog(@"删除声音失败: %@", error.localizedDescription);
        return;
    }
    
    if (success) {
        NSLog(@"删除声音成功");
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;

NuwaAIClient.getInstance().getVoiceManager().deleteVoice("1935958397612609538", new NuwaCallback<Boolean>() {
    @Override
    public void onSuccess(Boolean data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.voiceDelete('1935958397612609538');

返回示例

{
  "code": 0,
  "msg": null,
  "data": true
}

请求参数说明

参数名参数类型是否必填参数说明
idLong是声音Id

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataBooleantrue :成功,false:失败

6.4 声音列表

POST /web/voice/voiceList

请求示例

示例
await sdk.voiceList({ type: 1, current: 1, size: 10 });
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 获取声音列表
apiClient.getVoiceList(type: 1, current: 1, size: 10, age: nil, voiceName: nil, feature: nil) { result, error in
    if let error = error {
        print("获取声音列表失败: \(error.localizedDescription)")
        return
    }
    
    if let result = result {
        print("获取声音列表成功: \(result)")
        // 处理声音列表
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 获取声音列表
[apiClient getVoiceListWithType:1 current:1 size:10 age:nil voiceName:nil feature:nil completion:^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        NSLog(@"获取声音列表失败: %@", error.localizedDescription);
        return;
    }
    
    if (result) {
        NSLog(@"获取声音列表成功: %@", result);
        // 处理声音列表
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.PageData;
import com.nuwaai.sdk.model.VoiceListRequest;
import com.nuwaai.sdk.model.VoiceRecord;

VoiceListRequest req = new VoiceListRequest();
req.setType(1);
req.setCurrent(1);
req.setSize(10);
NuwaAIClient.getInstance().getVoiceManager().getVoiceList(req, new NuwaCallback<PageData<VoiceRecord>>() {
    @Override
    public void onSuccess(PageData<VoiceRecord> data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.voiceList({ type: 1, current: 1, size: 10 });

返回示例

{
  "code": 0,
  "msg": null,
  "data": {
    "records": [
      {
        "createTime": "2025-08-12 15:00:50",
        "updateTime": "2025-08-12 15:00:50",
        "voiceId": "1955162543697666049",
        "voiceName": "热血青年",
        "modeName": "index:测试1__06bd8d06",
        "sex": "1",
        "age": "1",
        "voiceType": "5",
        "feature": "大气活力",
        "path": "/pub-nuwa/admin/audio/284ea5be2345470cbffef3aceecde81f.wav",
        "systemFlag": "1",
        "featureList": [
          "大气活力"
        ]
      },
      {
        "createTime": "2025-08-12 14:59:41",
        "updateTime": "2025-08-12 14:59:41",
        "voiceId": "1955162254982750210",
        "voiceName": "少儿故事",
        "modeName": "index:少儿故事__1b7293b3",
        "sex": "1",
        "age": "4",
        "voiceType": "5",
        "feature": "亲和力强",
        "path": "/pub-nuwa/admin/audio/d5077c655c5e4dc3b35eb93e7d74b491.wav",
        "systemFlag": "1",
        "featureList": [
          "亲和力强"
        ]
      }
    ],
    "total": 14,
    "size": 2,
    "current": 2,
    "pages": 7
  }
}

请求参数说明

参数名参数类型是否必填参数说明
sizeLong是每页显示条数
currentLong是当前页(从1开始计数)
typeInteger是查询类型(1:平台声音,2:我克隆的声音)
ageString否年龄(1:青年,2:中年,3:老年,4:儿童)
voiceNameString否声音显示名称
featureString否声音特征

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
recods 属性
createTimeLocalDateTime创建时间
updateTimeLocalDateTime更新时间
voiceIdLong声音id
voiceNameString声音显示名称
modeNameString声音模型名称
sexString性别(1:男,2:女,3:中性)
ageString年龄(1:青年,2:中年,3:老年,4:儿童)
voiceTimeInteger声音时长(单位:秒)
voiceTypeString声音类型(3:豆包,5:复刻)
featureString声音特征
pathString声音路径
systemFlagString声音权限(1:公开可见,2:仅个人可见)
featureListArray声音特征列表
分页参数
totalLong总记录数
sizeLong每页显示条数
currentLong当前页(从1开始计数)
pagesLong总页数

7. 数字人形象创作接口

7.1 创建形象

POST /web/figure/create

请求示例

示例
await sdk.createFigure("A042");
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 创建形象
apiClient.createFigure("A042") { figureDetail, error in
    if let error = error {
        print("创建形象失败: \(error.localizedDescription)")
        return
    }
    
    if let figureDetail = figureDetail {
        print("创建形象成功: \(figureDetail)")
        // 处理形象详情
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 创建形象
[apiClient createFigure:@"A042" completion:^(NSDictionary * _Nullable figureDetail, NSError * _Nullable error) {
    if (error) {
        NSLog(@"创建形象失败: %@", error.localizedDescription);
        return;
    }
    
    if (figureDetail) {
        NSLog(@"创建形象成功: %@", figureDetail);
        // 处理形象详情
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.FigureDetail;

NuwaAIClient.getInstance().getFigureManager().createFigure("A042", new NuwaCallback<FigureDetail>() {
    @Override
    public void onSuccess(FigureDetail data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.figureCreate({ figureName: 'A042' });

返回示例

{
  "code": 0,
  "msg": null,
  "data": {
    "createBy": "18672393036",
    "createTime": "2025-12-02 21:05:57",
    "updateBy": "18672393036",
    "updateTime": "2025-12-02 21:05:57",
    "figureId": "1995841869673639938",
    "figureName": "A042",
    "status": "0",
    "systemFlag": "2",
    "client": "pc",
    "channel": "natural",
    "userId": "78"
  }
}

请求参数说明

参数名参数类型是否必填参数说明
figureNameString是形象名称

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
形象对象属性
figureIdLong形象id
figureNameString形象名称
statusString形象状态(0:待完善资料,1:创建中,2:创建成功,3:创建失败)
systemFlagString形象权限(1:公开可见,2:仅个人可见)
userIdLong用户Id
createByString创建人
updateByString更新人
updateTimeLocalDateTime更新时间
clientString客户端
channelString渠道

7.2 修改形象

PUT /web/figure/edit

请求示例

示例
await sdk.editFigure({ figureId: "199...", ... });
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 修改形象
let actionList = ["actionType": "0", "videoPath": "/nuwa/xx/action.mp4"]
apiClient.editFigure(figureId: "199...", figureName: "A042", videoPath: "/nuwa/xx/video.mp4", voiceType: "5", modeName: "index:测试1__06bd8d06", displayName: "测试声音", voicePath: nil, style: nil, age: "1", sex: "1", actionList: [actionList]) { taskId, error in
    if let error = error {
        print("修改形象失败: \(error.localizedDescription)")
        return
    }
    
    if let taskId = taskId {
        print("修改形象任务已提交,任务ID: \(taskId)")
        // 可以使用 taskId 查询任务进度
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 修改形象
NSDictionary *actionItem = @{@"actionType": @"0", @"videoPath": @"/nuwa/xx/action.mp4"};
NSArray *actionList = @[actionItem];
[apiClient editFigureWithFigureId:@"199..." figureName:@"A042" videoPath:@"/nuwa/xx/video.mp4" voiceType:@"5" modeName:@"index:测试1__06bd8d06" displayName:@"测试声音" voicePath:nil style:nil age:@"1" sex:@"1" actionList:actionList completion:^(NSString * _Nullable taskId, NSError * _Nullable error) {
    if (error) {
        NSLog(@"修改形象失败: %@", error.localizedDescription);
        return;
    }
    
    if (taskId) {
        NSLog(@"修改形象任务已提交,任务ID: %@", taskId);
        // 可以使用 taskId 查询任务进度
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.EditFigureRequest;

EditFigureRequest req = new EditFigureRequest();
req.setFigureId("199...");
// 按需设置 figureName、videoPath、voiceType、modeName、displayName、actionList 等
NuwaAIClient.getInstance().getFigureManager().editFigure(req, new NuwaCallback<String>() {
    @Override
    public void onSuccess(String taskId) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.figureEdit({ figureId: '199...', /* figureName、videoPath 等 */ });

返回示例

{
    "code": 0,
    "msg": null,
    "data": "db5945deccd24ad2bf13687b94c585d8"
}

请求参数说明

参数名参数类型是否必填参数说明
figureIdLong是形象Id
figureNameString是形象名称
videoPathString是oss中的视频路径
voiceTypeString是声音类型(3:豆包,5:复刻)
modeNameString是声音模型名称
displayNameString是声音显示名称
voicePathString否声音文件路径
styleString否风格名称
ageString是年龄(1:青年,2:中年,3:老年,4:儿童)
sexString是性别(1:男,2:女,3:中性)
actionListArray否形象动作视频列表
动作视频对象属性
idLong否动作Id
actionTypeString是动作类型(0:开场白,1:情感表达,2:表演)
videoPathString是Oss中动作视频路径

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataString请求Id,根据这个Id可以查询形象模型的生成状态

7.3 删除形象

DELETE /web/figure/delete/{id}

请求示例

示例
await sdk.deleteFigure("199...");
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 删除形象
apiClient.deleteFigure("199...") { success, error in
    if let error = error {
        print("删除形象失败: \(error.localizedDescription)")
        return
    }
    
    if success {
        print("删除形象成功")
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 删除形象
[apiClient deleteFigure:@"199..." completion:^(BOOL success, NSError * _Nullable error) {
    if (error) {
        NSLog(@"删除形象失败: %@", error.localizedDescription);
        return;
    }
    
    if (success) {
        NSLog(@"删除形象成功");
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;

NuwaAIClient.getInstance().getFigureManager().deleteFigure("199...", new NuwaCallback<Boolean>() {
    @Override
    public void onSuccess(Boolean data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.figureDelete('199...');

返回示例

 {
    "code": 0,
    "msg": null,
    "data": true
}

请求参数说明

参数名参数类型是否必填参数说明
idLong是形象Id

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataBooleantrue: 成功,false:失败

7.4 形象列表

POST /web/figure/figureList

请求示例

示例
await sdk.figureList({ type: 2, current: 1, size: 10 });
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 获取形象列表
apiClient.getFigureList(type: 2, current: 1, size: 10, age: nil, sex: nil, figureName: nil, style: nil) { result, error in
    if let error = error {
        print("获取形象列表失败: \(error.localizedDescription)")
        return
    }
    
    if let result = result {
        print("获取形象列表成功: \(result)")
        // 处理形象列表
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 获取形象列表
[apiClient getFigureListWithType:2 current:1 size:10 age:nil sex:nil figureName:nil style:nil completion:^(NSDictionary * _Nullable result, NSError * _Nullable error) {
    if (error) {
        NSLog(@"获取形象列表失败: %@", error.localizedDescription);
        return;
    }
    
    if (result) {
        NSLog(@"获取形象列表成功: %@", result);
        // 处理形象列表
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.FigureListRequest;
import com.nuwaai.sdk.model.FigureRecord;
import com.nuwaai.sdk.model.PageData;

FigureListRequest req = new FigureListRequest();
req.setType(2);
req.setCurrent(1);
req.setSize(10);
NuwaAIClient.getInstance().getFigureManager().getFigureList(req, new NuwaCallback<PageData<FigureRecord>>() {
    @Override
    public void onSuccess(PageData<FigureRecord> data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.figureList({ type: 2, current: 1, size: 10 });

返回示例

{
  "code": 0,
  "msg": null,
  "data": {
    "records": [
      {
        "createTime": "2025-12-02 21:05:57",
        "updateTime": "2025-12-02 21:05:57",
        "figureId": "1995841869673639938",
        "figureName": "A042",
        "thumbnailPath": /pub-nuwa/47/figure/1996947256201060354/53e2bc648edb4b68918d8936251544da.jpg,
        "status": "0",
        "systemFlag": "2",
        "storage": "0",
        "userId": "78",
        "nickName": "王白玄龟"
      },
      {
       "createTime": "2025-11-28 12:02:40",
       "updateTime": "2025-11-28 12:06:29",
       "figureId": "1994255593560322050",
        "figureName": "星辰ixYb",
        "thumbnailPath": "/pub-nuwa/78/figure/1994255593560322050/262f413c69914f718c30c9fedd53d692.jpg",
        "status": "2",
        "systemFlag": null,
       "storage": "1584116",
       "userId": "78",
        "nickName": "王白玄龟"
       
      }
    ],
    "total": 8,
    "size": 2,
    "current": 1,
    "pages": 4
  }
}

请求参数说明

参数名参数类型是否必填参数说明
currentLong是当前页(从1开始)
sizeLong是每页显示条数
typeInteger是查询类型(1:平台形象,2:我的形象)
ageString否年龄(1:青年,2:中年,3:老年,4:儿童)
sexString否性别(1:男,2:女,3:中性)
figureNameString否形象名称
styleString否形象风格

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataArray接口响应数据
records对象属性
figureIdLong形象Id
figureNameString形象名称
userIdLong用户Id
nickNameString用户昵称
thumbnailPathString形象缩略图路径
storageLong占用存储空间大小(单位:Byte)
statusString形象状态(0:待完善资料,1:创建中,2:创建成功,3:创建失败)
createTimeLocalDateTime创建时间
updateTimeLocalDateTime更新时间

7.5 形象详情

GET /web/figure/detail/{figureId}

请求示例

示例
await sdk.figureDetail("199...");
import NuwaSDK

// 初始化 API 客户端
let apiClient = NuwaAPIClient(accessToken: "your-access-token")

// 获取形象详情
apiClient.getFigureDetail("199...") { figureDetail, error in
    if let error = error {
        print("获取形象详情失败: \(error.localizedDescription)")
        return
    }
    
    if let figureDetail = figureDetail {
        print("获取形象详情成功: \(figureDetail)")
        // 处理形象详情
    }
}
#import <NuwaSDK/NuwaSDK.h>

// 初始化 API 客户端
NuwaAPIClient *apiClient = [[NuwaAPIClient alloc] initWithAccessToken:@"your-access-token"];

// 获取形象详情
[apiClient getFigureDetail:@"199..." completion:^(NSDictionary * _Nullable figureDetail, NSError * _Nullable error) {
    if (error) {
        NSLog(@"获取形象详情失败: %@", error.localizedDescription);
        return;
    }
    
    if (figureDetail) {
        NSLog(@"获取形象详情成功: %@", figureDetail);
        // 处理形象详情
    }
}];
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.FigureDetail;

NuwaAIClient.getInstance().getFigureManager().getFigureDetail("199...", new NuwaCallback<FigureDetail>() {
    @Override
    public void onSuccess(FigureDetail data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.figureDetail('199...');

返回示例

{
  "code": 0,
  "msg": null,
  "data": {
    "createBy": "",
    "createTime": "2025-11-28 12:02:40",
    "updateBy": "",
    "updateTime": "2025-11-28 12:06:29",
    "delFlag": "0",
    "figureId": "1994255593560322050",
    "figureName": "星辰ixYb",
    "age": "1",
    "sex": "2",
    "style": null,
    "startPath": "/nuwa/78/figure/1994255593560322050/13d93328e5c04802b22bb77378f69097.jpg",
    "thumbnailPath": "/pub-nuwa/78/figure/1994255593560322050/262f413c69914f718c30c9fedd53d692.jpg",
    "previewPath": null,
    "figurePath": "/nuwa/78/figure/1994255593560322050/model.mp4",
    "videoPath": "/nuwa/78/figure/1994255593560322050/0cc04aa4c8224a6b86dfd8a48e588665.mp4",
    "voicePath": "",
    "displayName": "中二少女",
    "modeName": "index:飞销__cbbcc4ec",
    "voiceType": "5",
    "generaType": "3",
    "preStatus": "0",
    "status": "2",
    "systemFlag": "2",
    "failReason": "",
    "storage": "1584116",
    "client": "pc",
    "channel": "natural",
    "userId": "78"
  }
}

请求参数说明

参数名参数类型是否必填参数说明
figureIdLong是形象Id

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
形象对象属性
figureIdLong形象id
figureNameString形象名称
ageString年龄(1:青年,2:中年,3:老年,4:儿童)
sexString性别(1:男,2:女,3:中性)
styleString形象风格
thumbnailPathString缩略图路径
previewPathString形象预览路径
figurePathString形象模型路径
videoPathString视频路径
voicePathString声音文件路径
displayNameString声音显示名称
modeNameString声音模型名称
voiceTypeString声音类型(3:豆包,5:复刻)
generaTypeString生成模型的类型(1:根据图片生成,2:根据参考帧生成,3:根据视频生成)
preStatusString形象预览状态(1:创建中,2:创建成功,3:创建失败)
statusString形象状态(0:待完善资料,1:创建中,2:创建成功,3:创建失败)
systemFlagString形象权限(1:公开可见,2:仅个人可见)
failReasonString形象模型创建失败的原因
actionsString动作列表
clientString客户端
channelString渠道
storageLong占用存储空间大小(单位:Byte)
userIdLong用户Id
delFlagString删除标记,1:已删除,0:正常

8. 数字人实时交互

8.1 初始化与连接

请求示例

示例
import NuwaSDK

class ViewController: UIViewController, NuwaClientDelegate {
    
    private var nuwaClient: NuwaClient?
    private var videoContainerView: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 初始化 NuwaClient
        nuwaClient = NuwaClient(avatarId: "your_avatar_id", bizId: "your_biz_id", accessToken: "your_access_token")
        nuwaClient?.delegate = self
        
        // 创建视频容器
        videoContainerView = UIView(frame: CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.width * 9/16))
        videoContainerView.backgroundColor = .black
        view.addSubview(videoContainerView)
    }
    
    // 连接数字人
    func connect() {
        guard let nuwaClient = nuwaClient else { return }
        
        // 获取视频视图并添加到容器
        let videoView = nuwaClient.videoViewWithFrame(videoContainerView.bounds)
        videoContainerView.addSubview(videoView)
        
        // 开始连接
        nuwaClient.connect()
    }
    
    // 断开连接
    func disconnect() {
        nuwaClient?.disconnect()
    }
    
    // 发送文本消息
    func sendTextMessage(_ text: String) {
        nuwaClient?.sendTextMessage(text)
    }
    
    // 发送控制消息
    func sendControlMessage(_ content: String) {
        nuwaClient?.sendControlMessage(content)
    }
    
    // 发送音频数据
    func sendAudioData(_ audioData: Data) {
        nuwaClient?.sendAudioData(audioData)
    }
    
    // 静音本地音频
    func muteLocalAudio(_ mute: Bool) {
        nuwaClient?.muteLocalAudio(mute)
    }
    
    // 关闭本地视频
    func muteLocalVideo(_ mute: Bool) {
        nuwaClient?.muteLocalVideo(mute)
    }
    
    // MARK: - NuwaClientDelegate
    
    func nuwaClientDidChangeState(_ state: NuwaConnectionState) {
        switch state {
        case .disconnected:
            print("状态: 未连接")
        case .connecting:
            print("状态: 连接中...")
        case .connected:
            print("状态: 已连接")
        case .reconnecting:
            print("状态: 重新连接中...")
        }
    }
    
    func nuwaClientDidConnect(_ sessionId: String) {
        print("已连接,会话ID: \(sessionId)")
    }
    
    func nuwaClientDidDisconnect() {
        print("连接已断开")
    }
    
    func nuwaClientDidReceiveMessage(_ message: [AnyHashable : Any]) {
        print("收到消息: \(message)")
        
        if let type = message["type"] as? String {
            switch type {
            case "avator-text":
                if let text = message["data"] as? [String: Any], let content = text["text"] as? String {
                    print("数字人文本: \(content)")
                }
            case "chat":
                if let data = message["data"] as? [String: Any], let content = data["content"] as? String {
                    print("聊天消息: \(content)")
                }
            case "asr-text":
                if let data = message["data"] as? [String: Any], let content = data["content"] as? String {
                    print("语音识别: \(content)")
                }
            default:
                break
            }
        }
    }
    
    func nuwaClientDidReceiveError(_ error: Error) {
        print("错误: \(error.localizedDescription)")
    }
    
    func nuwaClientDidReceiveRemoteVideo(_ videoView: UIView) {
        DispatchQueue.main.async {
            videoView.frame = self.videoContainerView.bounds
            self.videoContainerView.addSubview(videoView)
            self.videoContainerView.bringSubviewToFront(videoView)
        }
    }
    
    func nuwaClientDidReceiveRemoteAudio() {
        print("收到远程音频")
    }
}
#import <NuwaSDK/NuwaSDK.h>

@interface ViewController () <NuwaClientDelegate>

@property (nonatomic, strong) NuwaClient *nuwaClient;
@property (nonatomic, strong) UIView *videoContainerView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 初始化 NuwaClient
    self.nuwaClient = [[NuwaClient alloc] initWithAvatarId:@"your_avatar_id" bizId:@"your_biz_id" accessToken:@"your_access_token"];
    self.nuwaClient.delegate = self;
    
    // 创建视频容器
    self.videoContainerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.width * 9/16)];
    self.videoContainerView.backgroundColor = [UIColor blackColor];
    [self.view addSubview:self.videoContainerView];
}

// 连接数字人
- (void)connect {
    // 获取视频视图并添加到容器
    UIView *videoView = [self.nuwaClient videoViewWithFrame:self.videoContainerView.bounds];
    [self.videoContainerView addSubview:videoView];
    
    // 开始连接
    [self.nuwaClient connect];
}

// 断开连接
- (void)disconnect {
    [self.nuwaClient disconnect];
}

// 发送文本消息
- (void)sendTextMessage:(NSString *)text {
    [self.nuwaClient sendTextMessage:text];
}

// 发送控制消息
- (void)sendControlMessage:(NSString *)content {
    [self.nuwaClient sendControlMessage:content];
}

// 发送音频数据
- (void)sendAudioData:(NSData *)audioData {
    [self.nuwaClient sendAudioData:audioData];
}

// 静音本地音频
- (void)muteLocalAudio:(BOOL)mute {
    [self.nuwaClient muteLocalAudio:mute];
}

// 关闭本地视频
- (void)muteLocalVideo:(BOOL)mute {
    [self.nuwaClient muteLocalVideo:mute];
}

#pragma mark - NuwaClientDelegate

- (void)nuwaClientDidChangeState:(NuwaConnectionState)state {
    switch (state) {
        case NuwaConnectionStateDisconnected:
            NSLog(@"状态: 未连接");
            break;
        case NuwaConnectionStateConnecting:
            NSLog(@"状态: 连接中...");
            break;
        case NuwaConnectionStateConnected:
            NSLog(@"状态: 已连接");
            break;
        case NuwaConnectionStateReconnecting:
            NSLog(@"状态: 重新连接中...");
            break;
    }
}

- (void)nuwaClientDidConnect:(NSString *)sessionId {
    NSLog(@"已连接,会话ID: %@", sessionId);
}

- (void)nuwaClientDidDisconnect {
    NSLog(@"连接已断开");
}

- (void)nuwaClientDidReceiveMessage:(NSDictionary *)message {
    NSLog(@"收到消息: %@", message);
    
    NSString *type = message[@"type"];
    if ([type isEqualToString:@"avator-text"]) {
        NSString *text = message[@"data"][@"text"];
        if (text) {
            NSLog(@"数字人文本: %@", text);
        }
    } else if ([type isEqualToString:@"chat"]) {
        NSString *content = message[@"data"][@"content"];
        if (content) {
            NSLog(@"聊天消息: %@", content);
        }
    } else if ([type isEqualToString:@"asr-text"]) {
        NSString *content = message[@"data"][@"content"];
        if (content) {
            NSLog(@"语音识别: %@", content);
        }
    }
}

- (void)nuwaClientDidReceiveError:(NSError *)error {
    NSLog(@"错误: %@", error.localizedDescription);
}

- (void)nuwaClientDidReceiveRemoteVideo:(UIView *)videoView {
    dispatch_async(dispatch_get_main_queue(), ^{  
        videoView.frame = self.videoContainerView.bounds;
        [self.videoContainerView addSubview:videoView];
        [self.videoContainerView bringSubviewToFront:videoView];
    });
}

- (void)nuwaClientDidReceiveRemoteAudio {
    NSLog(@"收到远程音频");
}

@end

9. 智能体创作接口

9.1 创建智能体

POST /web/digital/user/create

请求示例

示例
await sdk.createDigitalUser("A020");
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.DigitalUserRecord;

NuwaAIClient.getInstance().getDigitalUserManager().create("A020", new NuwaCallback<DigitalUserRecord>() {
    @Override
    public void onSuccess(DigitalUserRecord data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.digitalUserCreate({ name: 'A020' });

返回示例

{
  "code": 0,
  "msg": null,
  "data": {
    "createBy": "18672393036",
    "createTime": "2025-12-04 21:29:59",
    "updateBy": "18672393036",
    "updateTime": "2025-12-04 21:29:59",
    "delFlag": "0",
    "id": "1996572693326966785",
    "name": "A020",
    "status": "0",
    "client": "pc",
    "channel": "natural",
    "userId": "78",
    "systemFlag": "2"
  }
}

请求参数说明

参数名参数类型是否必填参数说明
nameString是智能体名称

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
智能体对象属性
idLong智能体Id
nameString智能体名称
statusString智能体状态(0:待完善资料,1:创建中,2:创建成功,3:创建失败)
clientString客户端(pc,h5)
channelString渠道
userIdLong用户Id
systemFlagString智能体权限(1:公开可见,2:仅个人可见)
createByString创建人
createTimeLocalDateTime创建时间
updateByString更新人
updateTimeLocalDateTime更新时间
delFlagString删除标记,1:已删除,0:正常

8.2 更新智能体

PUT /web/digital/user/edit

请求示例

示例
await sdk.editDigitalUser({ id: "199...", ... });
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.DigitalUserEditRequest;

DigitalUserEditRequest req = new DigitalUserEditRequest();
req.setId("199...");
// 按需设置 name、age、sex、figureId、figurePath、thumbnailPath、roleId、skillList 等
NuwaAIClient.getInstance().getDigitalUserManager().edit(req, new NuwaCallback<String>() {
    @Override
    public void onSuccess(String taskId) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.digitalUserEdit({ id: '199...', /* name、figureId、roleId 等 */ });

返回示例

{
    "code": 0,
    "msg": null,
    "data": "aced3bf3189c4576817fd590a6d397b7"
}

请求参数说明

参数名参数类型是否必填参数说明
idLong是智能体Id
nameString是智能体名称
ageString是智能体年龄
sexString是性别(1:男,2:女,3:中性)
musicNameString否背景音乐显示名称
musicPathString否背景音乐路径
musicVolumeLong否背景音乐音量
keyWordsString否热词
shapeMouthString是嘴型
speedSpeechString是语速
driveModeString是驱动模式(0:反向,1:正向)
detectModeString否检测模式(0:强检测,1:弱检测)
roleIdLong是角色Id
roleNameString是角色名称
applicationScenariosString否应用场景编号
specialtyString否专业背景
personalityString否性格特点
languageStyleString否语言风格
goalString否对话目标
figureIdBigDecimal否形象Id
openTextString否开场白,最多1000字符
detectFlagString否冷场检测标记(0:关闭,1:开启)
silentTimeInteger否冷场时间(单位:秒)
recommend1String否推荐提问1,最多200字符
recommend2String否推荐提问2,最多200字符
recommend3String否推荐提问3,最多200字符
remarkString否指引
skillListArray否技能列表
技能对象属性
skillNameString是技能名称
enabledString是是否启用(1:启用,0:未启用)
cardListArray否桌面卡片列表
卡片对象属性
cardNameString是卡片名称
enabledString是是否启用(1:启用,0:未启用)

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataString创建智能体模型的任务Id,为空时表示不需要床创建智能体模型,更新绑定的形象模型时才会触发创建智能体模型任务

8.3 删除智能体

DELETE /web/digital/user/delete/{id}

请求示例

示例
await sdk.deleteDigitalUser("199...");
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;

NuwaAIClient.getInstance().getDigitalUserManager().delete("199...", new NuwaCallback<Boolean>() {
    @Override
    public void onSuccess(Boolean data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.digitalUserDelete('199...');

返回示例

{
    "code": 0,
    "msg": null,
    "data": true
}

请求参数说明

参数名参数类型是否必填参数说明
idLong是智能体Id

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataBooleantrue:成功,false:失败

8.4 智能体列表

POST /web/digital/user/digitalList

请求示例

示例
await sdk.digitalUserList({ type: 2, current: 1, size: 10 });
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.DigitalUserListRequest;
import com.nuwaai.sdk.model.DigitalUserRecord;
import com.nuwaai.sdk.model.PageData;

DigitalUserListRequest req = new DigitalUserListRequest();
req.setType(2);
req.setCurrent(1);
req.setSize(10);
NuwaAIClient.getInstance().getDigitalUserManager().getList(req, new NuwaCallback<PageData<DigitalUserRecord>>() {
    @Override
    public void onSuccess(PageData<DigitalUserRecord> data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.digitalList({ type: 2, current: 1, size: 10 });

返回示例

{
  "code": 0,
  "msg": null,
  "data": {
    "records": [
      {     
        "createTime": "2025-12-04 21:29:59",
        "updateTime": "2025-12-04 21:29:59",
        "id": "1996572693326966785",
        "name": "A020",
        "status": "0",
        "knowledgeStorage": "0",
        "userId": "78",
        "systemFlag": "2",
        "nickName": "王白玄龟",
      },
      {

        "createTime": "2025-11-27 11:17:02",
        "updateTime": "2025-11-28 11:31:07",
        "id": "1993881722078064641",
        "name": "76d64eac",
        "roleName": "小云",
        "thumbnailPath": "/pub-nuwa/1/figure/1955077707972714497/69c52b2e195444aa973cdf1a94286f69.jpg",
        "status": "2",
        "knowledgeStorage": "0",
        "userId": "78",
        "systemFlag": "2",
        "nickName": "王白玄龟"
      
      }
    ],
    "total": 4,
    "size": 2,
    "current": 1,
    "pages": 2
  }
}

请求参数说明

参数名参数类型是否必填参数说明
typeInteger是查询类型(1:平台数字人,2:我的数字人)
currentLong是当前页(从1开始)
sizeLong是每页记录数
nameString否智能体名称
ageString否年龄(1:青年,2:中年,3:老年,4:儿童)
sexString否性别(1:男,2:女,3:中性)

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
recordsArray智能体列表
currentLong当前页(从1 开始)
sizeLong每页记录数
totalLong总记录数
pagesLong总页数
智能体对象属性
idLong智能体Id
nameString智能体名称
statusString智能体状态(0:待完善资料,1:创建中,2:创建成功,3:创建失败)
systemFlagString智能体权限(1:公开可见,2:仅个人可见)
userIdLong用户Id
nickNameString用户昵称
knowledgeStorageLong占用空间大小(单位:Byte)
roleNameString角色名称
thumbnailPathString缩略图路径
applicationScenariosNameString应用场景名称
createTimeLocalDateTime创建时间
updateTimeLocalDateTime更新时间

8.5 角色列表

GET /web/role/list

请求示例

示例
await sdk.roleList({ roleName: "", current: 1, size: 10 });
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.PageData;
import com.nuwaai.sdk.model.RoleRecord;

// 参数顺序:roleName, size, current
NuwaAIClient.getInstance().getDigitalUserManager().getRoleList("", 10, 1, new NuwaCallback<PageData<RoleRecord>>() {
    @Override
    public void onSuccess(PageData<RoleRecord> data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.roleList({ roleName: '', current: 1, size: 10 });

返回示例

{
  "code": 0,
  "msg": null,
  "data": {
    "records": [
      {      
        "createTime": "2025-11-08 20:12:13",
        "updateTime": "2025-11-08 20:12:13",
        "roleId": "1987131038946664449",
        "roleName": "直播带货11",
        "applicationScenarios": "0",
        "language": "1",
        "specialty": "",
        "personality": "",
        "languageStyle": "",
        "goal": "",
        "workThinking": "",
        "modelName": "",

        "skillList": [
          {       
            "skillName": "PPT演讲",    
            "enabled": "1"
          }
        ],
        "nickName": null
      },
      {
      
        "createTime": "2025-11-03 12:06:25",
        "updateTime": "2025-11-08 20:12:03",
        "roleId": "1985196841234313218",
        "roleName": "直播带货",
        "applicationScenarios": "0",
        "language": "0",
        "specialty": "11",
        "personality": "22",
        "languageStyle": "33",
        "goal": "44",
        "workThinking": "55",
        "modelName": "66",
        "description": "77",
        "skillList": [
          {
            "skillName": "知识问答",
            "enabled": "1"
          },
          {
            "skillName": "PPT演讲",
            "enabled": "1"
          },
          {
            "skillName": "文件发送",
            "enabled": "1"
          },
          {
            "skillName": "福利设定",
            "enabled": "1"
          }
        ],
        "nickName": null
      }
    ],
    "total": 22,
    "size": 2,
    "current": 1,
    "pages": 11
  }
}  

请求参数说明

参数名参数类型是否必填参数说明
currentLong是当前页(从1开始)
sizeLong是每页记录数
roleNameString否角色名称

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
recordsArray角色列表
currentLong当前页(从1 开始)
sizeLong每页记录数
totalLong总记录数
pagesLong总页数
角色对象属性
roleIdLong角色编号
roleNameString角色名称
languageString语种(0:文中,1:英文)
specialtyString专业背景
personalityString性格特征
languageStyleString语言风格
goalString对话目标
nickNameString创建人昵称
applicationScenariosString应用场景编号
workThinkingString工作思维
modelNameString角色模型名称
createTimeLocalDateTime创建时间
updateTimeLocalDateTime更新时间
skillListArray技能列表
技能属性
skillNameString技能名称
enabledString是否启用(1:启用,0:未启用)

9. 知识库增删改查接口

9.1 新增文档信息

POST /web/document/4.0/add

请求示例

示例
await sdk.addDocumentInfo({ fileSize: 27451057, digitalUserId: 199..., originalFilename: "demo.pdf" });
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.AddDocumentRequest;
import com.nuwaai.sdk.model.AddDocumentResult;

AddDocumentRequest req = new AddDocumentRequest();
req.setFileSize(27451057);
req.setDigitalUserId(1996572693326966785L); // 示例:替换为实际智能体 ID
req.setOriginalFilename("demo.pdf");
NuwaAIClient.getInstance().getDocumentManager().addDocument(req, new NuwaCallback<AddDocumentResult>() {
    @Override
    public void onSuccess(AddDocumentResult data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.documentAdd4({
  fileSize: 27451057,
  digitalUserId: 1996572693326966785,
  originalFilename: 'demo.pdf'
});

返回示例

{
    "code": 0,
    "msg": null,
    "data": {
        "documentId": "7131",
        "preUploadUrl": "https://nuwa-ai.oss-cn-shenzhen.aliyuncs.com/54/knowledge/2034192955560034305/f03fccd5e1ef41d3a36ad7c2473222ad.pptx?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260320T014105Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=LTAI5tHbpo83YpipHibjKr4L%2F20260320%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=7ad481ed6e4f0411d1ad8915270e0f2094e813febc358258af9162c649951389"
    }
}

请求参数说明

参数名参数类型是否必填参数说明
fileSizeLong是文件大小(单位:Byte)
digitalUserIdLong是数字人ID
originalFilenameString是原始文件名称
descriptionString否描述

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
documentIdLong文档Id
preUploadUrlString预上传地址

9.2 导入网站

POST /web/document/importWebsite

请求示例

示例
await sdk.importWebsite("www.nuwaai.com", 199...);
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.ImportWebsiteRequest;

ImportWebsiteRequest req = new ImportWebsiteRequest();
req.setUrl("www.nuwaai.com");
req.setDigitalUserId(1996572693326966785L); // 示例:替换为实际智能体 ID
NuwaAIClient.getInstance().getDocumentManager().importWebsite(req, new NuwaCallback<String>() {
    @Override
    public void onSuccess(String documentId) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.documentImportWebsite({
  url: 'www.nuwaai.com',
  digitalUserId: 1996572693326966785
});

返回示例

{
    "code": 0,
    "msg": null,
    "data": "7133"
}

请求参数说明

参数名参数类型是否必填参数说明
urlString是网站地址
digitalUserIdLong是智能体Id

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataLong文档Id

9.3 上传知识文档

PUT {preUploadUrl}

请求示例

示例
const addRes = await sdk.addDocumentInfo({
  fileSize: file.size,
  digitalUserId,
  originalFilename: file.name,
  description: ""
});
await sdk.uploadKnowledgeByPreSignedUrl(addRes.data.preUploadUrl, file);
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.AddDocumentRequest;
import com.nuwaai.sdk.model.AddDocumentResult;

import java.io.File;

File file = new File("/path/to/demo.pdf");
long digitalUserId = 1996572693326966785L;

AddDocumentRequest addReq = new AddDocumentRequest();
addReq.setFileSize(file.length());
addReq.setDigitalUserId(digitalUserId);
addReq.setOriginalFilename(file.getName());
addReq.setDescription("");

NuwaAIClient.getInstance().getDocumentManager().addDocument(addReq, new NuwaCallback<AddDocumentResult>() {
    @Override
    public void onSuccess(AddDocumentResult data) {
        String path = file.getAbsolutePath();
        String uploadUrl = data.getPreUploadUrl();
        NuwaAIClient.getInstance().getDocumentManager().uploadDocumentFile(path, uploadUrl, new NuwaCallback<Void>() {
            @Override
            public void onSuccess(Void unused) { }

            @Override
            public void onFailure(int code, String message) { }
        });
    }

    @Override
    public void onFailure(int code, String message) { }
});
const addRes = await sdk.documentAdd4({
  fileSize,
  digitalUserId,
  originalFilename: fileName,
  description: ''
});
await sdk.uploadKnowledgeFile(addRes.preUploadUrl, tempFilePath);

请求参数说明

参数名参数类型是否必填参数说明
preUploadUrlString是预上传地址,新增文档信息接口返回,前端直接请求预上传地址接口上传文件

9.4 删除知识文档

POST /web/document/removeV2

请求示例

示例
await sdk.removeDocuments({ digitalUserId: 199..., docIds: [7131] });
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.RemoveDocumentRequest;

import java.util.Arrays;

RemoveDocumentRequest req = new RemoveDocumentRequest();
req.setDigitalUserId(1996572693326966785L);
req.setDocIds(Arrays.asList(7131L));
NuwaAIClient.getInstance().getDocumentManager().removeDocument(req, new NuwaCallback<Object>() {
    @Override
    public void onSuccess(Object data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.documentRemoveV2({ digitalUserId: 1996572693326966785, docIds: [7131] });

返回示例

{
    "code": 0,
    "msg": null,
    "data": null
}

请求参数说明

参数名参数类型是否必填参数说明
digitalUserIdLong是智能体Id
docIdsLong[]是文档Id集合

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据

9.5 修改知识文档

POST /web/document/modifyV2

请求示例

示例
await sdk.modifyDocument(7131, 0, file);
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;

import java.io.File;

File file = new File("/path/to/demo.pdf");
NuwaAIClient.getInstance().getDocumentManager().modifyDocument(7131L, 0, file, new NuwaCallback<Object>() {
    @Override
    public void onSuccess(Object data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.documentModifyV2('7131', 0, tempFilePath);

返回示例

{
    "code": 0,
    "msg": null,
    "data": null
}

请求参数说明

参数名参数类型是否必填参数说明
fileMultipartFile是知识文档
docIdLong是文档Id
editTypeInteger是文档类型(0:图片/视频,1:文本文档,2:ppt,3: URL)

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据

9.6 查看知识文档

GET /web/document/getDocumentById

请求示例

示例
await sdk.getDocumentById("7131");
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.DocumentRecord;

NuwaAIClient.getInstance().getDocumentManager().getDocument("7131", new NuwaCallback<DocumentRecord>() {
    @Override
    public void onSuccess(DocumentRecord data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.getDocumentById('7131');

返回示例

{
    "code": 0,
    "msg": null,
    "data": {
        "id": "7131",
        "analysisUrl": "4000170/knowledge/1996852095362637826/b6aa31c01ab843f5bd3e9b309e77a294.md",
        "filePath": "4000170/knowledge/1996852095362637826/f53c7e92d8aa48e58814dfd93e47f79b.pdf",
        "type": "pdf",
        "original": "Nuwaai介绍手册2505-邦彦技术.pdf",
        "sendPermission": "1",
        "playPermission": "1",
        "description": null,
        "category": 1,
        "createTime": "2025-12-06 11:27:11",
        "updateTime": "2025-12-06 16:03:09",
        "status": "1",
        "reason": null
    }
}

请求参数说明

参数名参数类型是否必填参数说明
docIdString是文档Id

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
对象属性
idLong文档Id
analysisUrlString解析后的文件地址
typeString文档类型
originalString原始文件名
sendPermissionString发送权限(0:关闭,1:开启)
playPermissionString播放权限(0:关闭,1:开启)
descriptionString描述
categoryString文档类型(0:图片/视频,1:文本文档,2:ppt,3: URL)
statusString状态(0:解析中,1:解析成功,2:解析失败)
reasonString失败原因
createTimeLocalDateTime上传时间
updateTimeLocalDateTime更新时间

9.7 知识列表

GET /web/document/pageV2

请求示例

示例
await sdk.pageDocuments({ digitalUserId: 199..., current: 1, size: 10 });
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.DocumentRecord;
import com.nuwaai.sdk.model.PageData;

// 参数顺序:digitalUserId, size, current, type, documentName(后两者可选)
NuwaAIClient.getInstance().getDocumentManager().getDocumentPage(
    1996572693326966785L, 10, 1, null, null,
    new NuwaCallback<PageData<DocumentRecord>>() {
        @Override
        public void onSuccess(PageData<DocumentRecord> data) { }

        @Override
        public void onFailure(int code, String message) { }
    });
await sdk.documentPageV2({
  digitalUserId: 1996572693326966785,
  current: 1,
  size: 10
});

返回示例

{
    "code": 0,
    "msg": null,
    "data": {
        "records": [
            {
                "id": "7130",
                "analysisUrl": "4000170/knowledge/1996852095362637826/fb3187e71a5944bba8bd9e4e75b4b65a.md",
                "filePath": "www.nuwaai.com",
                "type": "web",
                "original": "www.nuwaai.com",
                "sendPermission": "1",
                "playPermission": "1",
                "description": null,
                "category": 3,
                "createTime": "2025-12-06 11:17:59",
                "updateTime": "2025-12-06 11:18:42",
                "status": "1",
                "reason": null
            }
        ],
        "total": 1,
        "size": 10,
        "current": 1,
        "pages": 1
    }
}

请求参数说明

参数名参数类型是否必填参数说明
digitalUserIdLong是数字人ID
currentLong是当前页(从1 开始)
sizeLong是每页记录数
typeString否文档类型
documentNameString否文档名称

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
对象属性
idLong文档Id
analysisUrlString解析后的文件地址
filePathString原始文档路径
typeString文档类型
originalString原始文件名
sendPermissionString发送权限(0:关闭,1:开启)
playPermissionString播放权限(0:关闭,1:开启)
descriptionString描述
categoryString文档类型(0:图片/视频,1:文本文档,2:ppt,3: URL)
statusString状态(0:解析中,1:解析成功,2:解析失败)
reasonString失败原因
createTimeLocalDateTime上传时间
updateTimeLocalDateTime更新时间

10. 才艺创作接口

10.1 创建才艺

POST /web/talent/create

请求示例

示例
await sdk.createTalent("1");
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.CreateTalentRequest;
import com.nuwaai.sdk.model.TalentDetail;

CreateTalentRequest req = new CreateTalentRequest();
req.setType("1");
NuwaAIClient.getInstance().getTalentManager().create(req, new NuwaCallback<TalentDetail>() {
    @Override
    public void onSuccess(TalentDetail data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.talentCreate({ type: '1' });

返回示例

{
    "code": 0,
    "msg": null,
    "data": {
        "createBy": "18672393036",
        "createTime": "2025-12-12 09:41:40",
        "updateBy": "18672393036",
        "updateTime": "2025-12-12 09:41:40",
        "delFlag": "0",
        "id": "1999293545418145794",
        "name": "e0bc2e17",
        "type": "1",
        "client": "pc",
        "channel": "natural",
        "userId": "47",
        "systemFlag": "2"
       
    }
}

请求参数说明

参数名参数类型是否必填参数说明
typeString是才艺类型(1:个人演唱,2:个人演讲)

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
才艺对象属性
createByString创建人
createTimeLocalDateTime创建时间
updateByString更新人
updateTimeLocalDateTime更新时间
idLong才艺Id
nameString才艺名称
typeString才艺类型(1:个人演唱,2:个人演讲)
clientString客户端
channelString渠道
userIdLong用户Id
systemFlagString才艺权限(1:公开可见,2:仅个人可见)

10.2 修改才艺

PUT /web/talent/edit

请求示例

示例
await sdk.editTalent({ id: "199...", ... });
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.EditTalentRequest;

EditTalentRequest req = new EditTalentRequest();
req.setId("199...");
// 按需设置 name、type、videoPath、subtitlesStatus 等
NuwaAIClient.getInstance().getTalentManager().edit(req, new NuwaCallback<Boolean>() {
    @Override
    public void onSuccess(Boolean data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.talentEdit({ id: '199...', /* name、type、videoPath 等 */ });

返回示例

{
    "code": 0,
    "msg": null,
    "data": true
}

请求参数说明

参数名参数类型是否必填参数说明
idLong是才艺编号
nameString是才艺名称
typeString是才艺类型(1:个人演唱,2:个人演讲)
videoPathString是场景视频路径
styleString否风格
songIdLong否音乐Id
songPathString否音乐路径
songNameString否音乐名称
songFromString否音乐来源(1:平台,2:我创作的,3:本地上传)
lyricString否歌词文件路径
subtitlesStatusString是字幕状态(0:不开启,1:开启)
acappellaString否分离的人声音路径

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataBooleantrue:成功,false:失败

10.3 删除才艺

DELETE /web/talent/delete/{id}

请求示例

示例
await sdk.deleteTalent("199...");
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;

NuwaAIClient.getInstance().getTalentManager().delete("199...", new NuwaCallback<Boolean>() {
    @Override
    public void onSuccess(Boolean data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.talentDelete('199...');

返回示例

{
    "code": 0,
    "msg": null,
    "data": true
}

请求参数说明

参数名参数类型是否必填参数说明
idLong是才艺Id

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataBooelantrue:成功,false:失败

10.4 生成才艺视频

POST /web/talent/preview

请求示例

示例
await sdk.previewTalent({ id: "199...", ... });
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.PreviewTalentRequest;

PreviewTalentRequest req = new PreviewTalentRequest();
req.setId("199...");
// 按需设置 name、type、videoPath、speechText、voiceType、modeName 等
NuwaAIClient.getInstance().getTalentManager().preview(req, new NuwaCallback<String>() {
    @Override
    public void onSuccess(String requestId) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.talentPreview({ id: '199...', /* name、type、videoPath、speechText 等 */ });

返回示例

{
    "code": 0,
    "msg": null,
    "data": "a516fb5714484f14bfb4723bbaa9dc0d"
}

请求参数说明

参数名参数类型是否必填参数说明
idLong是才艺编号
nameString是才艺名称
typeString是才艺类型(1:个人演唱,2:个人演讲)
videoPathString是场景视频路径
styleString否风格
songIdLong否音乐Id
songPathString否音乐路径,个人演唱必填,个人演讲非必填
songNameString否音乐名称
songFromString否音乐来源(1:平台,2:我创作的,3:本地上传)
lyricString否歌词文件路径,个人演唱必填,个人演讲非必填
subtitlesStatusString是字幕状态(0:不开启,1:开启)
acappellaString是分离的人声音路径,个人演唱必填,个人演讲非必填
voiceTypeString否声音类型(3:豆包,5:复刻),个人演讲必填,个人演唱非必填
modeNameString否声音模型名称,个人演讲必填,个人演唱非必填
speechTextString否演讲文案,个人演讲必填,个人演唱非必填

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataString请求Id,用于查询才艺是视频生成结果

10.5 才艺列表

POST /web/talent/talentList

请求示例

示例
await sdk.talentList({ current: 1, size: 10, systemFlag: "2" });
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.PageData;
import com.nuwaai.sdk.model.TalentListRequest;
import com.nuwaai.sdk.model.TalentRecord;

TalentListRequest req = new TalentListRequest();
req.setCurrent(1);
req.setSize(10);
req.setSystemFlag("2");
NuwaAIClient.getInstance().getTalentManager().getList(req, new NuwaCallback<PageData<TalentRecord>>() {
    @Override
    public void onSuccess(PageData<TalentRecord> data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.talentList({ current: 1, size: 10, systemFlag: '2' });

返回示例

{
    "code": 0,
    "msg": null,
    "data": {
        "records": [
          
{  
    "createTime": "2025-12-01 16:02:11",
    "updateTime": "2025-12-01 18:01:55",
    "id": "1995403034264707074",
    "name": "b3baac21",
    "type": "1",
    "thumbnailPath": "/pub-nuwa/4000170/talent/1995403034264707074/0f5bf4fd6e934ab7b3fbdef049505b6c.jpg",
    "preStatus": "0",
    "storage": "4906412",
    "userId": "4000170",
    "nickName": "林墨麟" 
},
{  
    "createTime": "2025-12-01 09:16:14",
    "updateTime": "2025-12-01 09:20:44",
    "id": "1995300872645877762",
    "name": "青春旋律",
    "type": "1",
    "thumbnailPath": "/pub-nuwa/4000170/talent/1995300872645877762/df380a72f7ef4b4bb513ced80e7c544c.jpg",
    "preStatus": "2",
    "storage": "41966629", 
    "userId": "4000170",
    "nickName": "林墨麟"
}
        ],
        "total": 22,
        "size": 2,
        "current": 1,
        "pages": 11
    }
}

请求参数说明

参数名参数类型是否必填参数说明
currentLong是当前页
sizeLong是每页记录数
systemFlagString是权限(1:公开可见,2:仅个人可见)
nameString否才艺名称
typeString否才艺类型(1:个人演唱,2:个人演讲)

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
recordsArray才艺列表
currentLong当前页(从1 开始)
sizeLong每页记录数
totalLong总记录数
pagesLong总页数
才艺对象属性
idLong才艺Id
nameString才艺名称
typeString才艺类型(1:个人演唱,2:个人演讲)
thumbnailPathString视频缩略图路径
storageLong占用存储空间大小(单位:Byte)
userIdLong用户Id
nickNameString用户昵称
createTimeLocalDateTime创建时间
updateTimeLocalDateTime更新时间

10.6 才艺详情

GET /web/talent/detail/{id}

请求示例

示例
await sdk.talentDetail("199...");
import com.nuwaai.sdk.NuwaAIClient;
import com.nuwaai.sdk.NuwaCallback;
import com.nuwaai.sdk.model.TalentDetail;

NuwaAIClient.getInstance().getTalentManager().getDetail("199...", new NuwaCallback<TalentDetail>() {
    @Override
    public void onSuccess(TalentDetail data) { }

    @Override
    public void onFailure(int code, String message) { }
});
await sdk.talentDetail('199...');

返回示例

{
    "code": 0,
    "msg": null,
    "data": {
      
        "createTime": "2025-11-25 14:29:56",
        "updateTime": "2025-11-25 21:18:30",
        "id": "1993205490860269569",
        "name": "A0012",
        "type": "2",
        "previewPath": "/nuwa-ai/talent/1993205490860269569/video-3f6bacb0400b403d98e1a6b70df7821b.mp4",
        "videoPath": "/nuwa-ai/4000170/talent/1993205490860269569/d6056ccbea144ffaaa2e1cbb6f25b7b7.mp4",
        "thumbnailPath": "/pub-nuwa/4000170/talent/1993205490860269569/14b459fe4ca344f7ba05ef1c68d137bb.jpg",
        "style": "现代",
        "songId": "74",
        "songPath": "/pub-nuwa/admin/music/8c95aa1cee1d4c89b328478b3b50e269.mp3",
        "songFrom": "1",
        "songName": "假如给我三天光明",
        "songVolume": 0.5,
        "subtitlesStatus": "0",
        "labiate": 1.5,
        "acappella": null,
        "lyric": null,
        "soundPath": "/pub-nuwa/admin/audio/571901a4f8974cedafc081c9ce5c9006.wav",
        "soundName": "新闻女主播",
        "speedSpeech": 1,
        "speechText": ""
        "voiceType": "5",
        "modeName": "index:新闻女主播__d67c8ff2",
        "preStatus": "2",
        "storage": "60905886",
        "client": "pc",
        "channel": "natural",
        "userId": "4000170",
        "systemFlag": "2"
    }
}


请求参数说明

参数名参数类型是否必填参数说明
idLong是才艺Id

响应参数说明

参数名参数类型参数说明
codeInteger0:请求成功,非0 :请求失败
msgString响应码 描述
dataObject接口响应数据
idLong才艺Id
nameString才艺名称
typeString才艺类型(1:个人演唱,2:个人演讲)
previewPathString生成的才艺视频路径
videoPathString场景视频路径
thumbnailPathString视频缩略图路径
styleString风格
songIdLong音乐Id
songPathString音乐路径
songFromString音乐来源(1:平台,2:我创作的,3:本地上传)
songNameString音乐显示名称
songVolumeBigDecimal音乐音量
subtitlesStatusString字幕状态(0:不开启,1:开启)
labiateBigDecimal唇形
acappellaString分离的人声音路径
lyricString歌词文件路径
soundPathString演讲声音路径
soundNameString演讲声音显示名称
speedSpeechBigDecimal语速
speechTextString演讲文案
voiceTypeString声音类型(3:豆包,5:复刻)
modeNameString声音模型名称
preStatusString才艺预览地址状态(1:创建中,2:创建成功,3:创建失败)
actionsString动作列表
storageLong占用存储空间大小(单位:Byte)
clientString客户端
channelString渠道
userIdLong用户Id
systemFlagString权限(1:公开可见,2:仅个人可见)

最近更新:: 2026/4/1 19:49
Contributors: 005609, 邹丹晔, chen1581703976, 李伟尧, chenming