Skip to content

feat: support SDK#122

Open
FliPPeDround wants to merge 2 commits intoMiniMax-AI:mainfrom
FliPPeDround:feat/sdk
Open

feat: support SDK#122
FliPPeDround wants to merge 2 commits intoMiniMax-AI:mainfrom
FliPPeDround:feat/sdk

Conversation

@FliPPeDround
Copy link
Copy Markdown

@FliPPeDround FliPPeDround commented May 2, 2026

关联issue #83


1. PR简介

  • 影响: 🔴 - 新增完整的 TypeScript SDK,支持 8 大 AI 能力模块
  • 核心变更:
    • ✨ 新增 MiniMaxSDK 主类,提供文本、图像、视频、语音、音乐、搜索、视觉、配额 8 大功能模块
    • 🏗️ 新增统一的 Client 基类,封装配置加载和 HTTP 请求逻辑
    • 📦 更新构建配置,支持 SDK 独立打包和 TypeScript 类型声明生成
    • 📚 完善中英文文档,提供详细的 SDK 使用示例
    • 🧪 为各模块添加单元测试覆盖

2. 可视化架构图

SDK 整体架构

graph TD
    subgraph "SDK 入口层"
        A["MiniMaxSDK<br/>src/sdk/index.ts"]
    end
    
    subgraph "核心基础设施"
        B["Client<br/>src/sdk/client.ts"]
        C["MiniMaxSDKOptions<br/>src/sdk/types.ts"]
    end
    
    subgraph "AI 能力模块"
        D["TextSDK<br/>文本对话"]
        E["SpeechSDK<br/>语音合成"]
        F["ImageSDK<br/>图像生成"]
        G["VideoSDK<br/>视频生成"]
        H["MusicSDK<br/>音乐生成"]
        I["SearchSDK<br/>网络搜索"]
        J["VisionSDK<br/>图像理解"]
        K["QuotaSDK<br/>配额查询"]
    end
    
    subgraph "底层服务"
        L["loadConfig<br/>配置加载"]
        M["request/requestJson<br/>HTTP 客户端"]
        N["parseSSE<br/>流式解析"]
        O["poll<br/>任务轮询"]
    end
    
    A -->|继承| B
    A -->|使用| C
    B -->|调用| L
    B -->|调用| M
    B -->|调用| N
    B -->|调用| O
    
    A -->|聚合| D
    A -->|聚合| E
    A -->|聚合| F
    A -->|聚合| G
    A -->|聚合| H
    A -->|聚合| I
    A -->|聚合| J
    A -->|聚合| K
    
    D -->|继承| B
    E -->|继承| B
    F -->|继承| B
    G -->|继承| B
    H -->|继承| B
    I -->|继承| B
    J -->|继承| B
    K -->|继承| B
    
    style A fill:#bbdefb,color:#0d47a1
    style B fill:#c8e6c9,color:#1a5e20
    style D fill:#fff3e0,color:#e65100
    style E fill:#fff3e0,color:#e65100
    style F fill:#fff3e0,color:#e65100
    style G fill:#fff3e0,color:#e65100
    style H fill:#fff3e0,color:#e65100
    style I fill:#fff3e0,color:#e65100
    style J fill:#fff3e0,color:#e65100
    style K fill:#fff3e0,color:#e65100
Loading

3. 详细变更分析

3.1 核心基础设施

Client 基类 (src/sdk/client.ts)

  • 变更内容: 新增统一的 HTTP 客户端基类
  • 核心功能:
    • 构造函数接收 MiniMaxSDKOptions,调用 loadConfig 加载配置
    • 复用 request() 方法处理流式请求
    • 复用 requestJson<T>() 方法处理 JSON 响应

类型定义 (src/sdk/types.ts)

  • 变更内容: 新增 SDK 核心类型定义
  • 主要接口:
    interface MiniMaxSDKOptions {
      apiKey?: string;
      baseUrl?: string;
      region?: Region;
    }
  • 工具类型: ModelPartial<T> - 可选化 model 字段的工具类型

主 SDK 类 (src/sdk/index.ts)

  • 变更内容: 新增 MiniMaxSDK 主入口类
  • 核心特性:
    • 继承自 Client 基类
    • 聚合 8 个功能模块作为 readonly 属性
    • 构造函数中初始化所有子模块

3.2 构建配置

构建脚本 (build.ts)

构建目标 入口文件 输出文件 特性
CLI src/main.ts dist/mmx.mjs 添加 shebang
SDK src/sdk/index.ts dist/sdk.mjs 生成 .d.ts
  • 新增插件: bun-plugin-dts - 生成 TypeScript 类型声明文件

包配置 (package.json)

配置项 旧值 新值 说明
files dist/mmx.mjs dist/mmx.mjs, dist/sdk.mjs, dist/index.d.ts 添加 SDK 输出
exports ./sdk 路径导出 支持 SDK 模块导入
dependencies —— + bun-plugin-dts, es-toolkit 新增构建和工具依赖

3.3 文档更新

README.md & README_CN.md

  • 新增章节: "SDK Usage" / "SDK 使用"
  • 覆盖内容:
    • 安装说明
    • 基础用法
    • 8 大模块的完整示例代码
    • 流式与非流式调用对比
    • 自定义配置说明

3.4 测试覆盖

新增测试文件

测试文件 覆盖模块 测试场景
test/sdk/text.test.ts TextSDK 基础对话
test/sdk/speech.test.ts SpeechSDK 语音合成、获取音色
test/sdk/music.test.ts MusicSDK 音乐生成
test/sdk/video.test.ts VideoSDK 异步生成、任务查询
test/sdk/image.test.ts ImageSDK 图像生成
test/sdk/vision.test.ts VisionSDK 图像描述
test/sdk/search.test.ts SearchSDK 网络搜索
test/sdk/quota.test.ts QuotaSDK 配额查询
  • 测试工具: 使用 createMockServer 创建模拟服务器
  • 断言: 验证响应结构和数据正确性

4. 影响与风险评估

⚠️ 破坏性变更

  • 无破坏性变更 - 新增功能,不影响现有 CLI 工具

✅ 兼容性

  • 向后兼容: CLI 工具保持不变
  • 新增导出: 通过 exports 字段支持 import { MiniMaxSDK } from 'mmx-cli/sdk'

🧪 测试建议

  1. 单元测试: 验证各模块的参数验证逻辑
  2. 集成测试: 测试真实 API 调用
  3. 流式测试: 验证 SSE 流式解析的正确性
  4. 错误处理: 测试网络错误、超时、无效参数等场景
  5. 类型检查: 确保 TypeScript 类型声明准确无误

📦 依赖项变更

包名 版本 用途
bun-plugin-dts ^0.4.0 生成 TypeScript 类型声明
es-toolkit ^1.46.1 对象合并工具 (toMerged)

5. 使用示例

快速开始

import { MiniMaxSDK } from 'mmx-cli/sdk';

const sdk = new MiniMaxSDK({
  apiKey: 'sk-xxxxx',
  region: 'global',
});

// 文本对话
const response = await sdk.text.chat({
  messages: [{ role: 'user', content: 'Hello!' }],
});

// 图像生成
const image = await sdk.image.generate({
  prompt: 'A cat in a spacesuit',
  width: 1024,
  height: 1024,
});

// 流式音乐生成
const stream = await sdk.music.generate({
  prompt: 'Upbeat pop',
  lyrics: '[verse] Hello world',
  stream: true,
});

for await (const chunk of stream) {
  // 处理音频块
}

6. 总结

  • 🌊 统一的 API 接口 - AI 能力模块,一致的调用方式
  • 🛡️ 参数验证 - 完善的输入验证和错误处理
  • 📚 完善的文档 - 中英文文档和丰富的示例代码
  • 🧪 测试覆盖 - 单元测试确保代码质量

7. 问题&解决方向

参数校验

  • 问题:CLI 的参数校验逻辑目前内聚在 defineCommand 内部,迁移成本较高,因此本次实现的参数校验功能并未与 CLI 复用。这会增加后续的维护负担。
  • 方案:需要明确未来的解耦方向,将校验逻辑抽象为可共享的模块。

分包

  • 问题:为遵循最小改动原则,仓库未进行 monorepo 改造。当前 SDK 通过 import { MiniMaxSDK } from 'mmx-cli/sdk' 的方式引用,导致安装时附带了 CLI 相关功能,引入了非必要的依赖,增加了安装体积。当前构建产物大小如下:

    File Size
    dist/mmx.mjs 132 KB
    dist/sdk.mjs 77 KB
    dist/index.d.ts 10 KB
  • 方案(建议):monorepo 改造,抽离核心公共代码为 mmx ,分别对外提供能力的代码采用 mmx-sdk, mmx-cli, mmx-mcp,架构如下(改动较大)

monorepo/
├── packages/
│   ├── mmx/          # 核心库,提供共享类型与工具函数
│   ├── mmx-cli/      # 命令行工具
│   ├── mmx-sdk/      # SDK 封装
│   ├── mmx-mcp/      # MCP 服务实现
│   └── mmx-xxx/      # 未来预留扩展包(示例)
├── package.json      # 根 package.json,定义工作空间与公共依赖
└── README.md         # 项目根说明文档

视频生成SDK

  • 问题:我个人的 token-plan 不支持视频生成能力,因此未对视频处理能力的完善度进行校验。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant