跳转到正文Skip to content

DeepSeek、Kimi、MiniMax 与智谱 GLM ​

用同一套平台凭据和 Credits 接入中国大模型与国际模型。先确认模型是否公开、当前凭据是否有权调用,再选择接口。系列接入不代表所有型号、参数或套餐均已开放。

协议支持范围 ​

模型系列Chat CompletionsMessagesResponses
DeepSeek已实现兼容路径已实现兼容路径已实现兼容路径
Kimi已实现兼容路径已实现兼容路径已实现兼容路径
MiniMax已实现兼容路径已实现兼容路径已实现兼容路径
智谱 GLM已实现兼容路径已实现兼容路径当前未实现

这张表描述集成范围;具体模型以公开目录的 protocols、流式标记和账户权益为准。Chat 对应 openai_chat_completions,Messages 对应 anthropic_messages,Responses 对应 openai_responses。不要对 GLM 调用 Responses,也不要从系列名称推断向量、图片、视频、Gemini 原生或 Token 计数能力。

凭据、地址与选模 ​

  1. 在可信后端使用平台 API Key;终端应用通过 Embedded 使用短期令牌。第三方服务密钥、Coding Plan 或订阅授权不能直接作为平台 API Key 使用;订阅授权接入尚未公开提供。
  2. GET /api/v1/public/models 返回 { code: 0, data: ... },包含协议、能力和费率,无需鉴权。SDK 0.3.0 的 listPublicModels() 解包并返回类型化目录,不读取或发送令牌。
  3. GET /v1/models 或 listModels() 使用当前凭据返回可用模型 ID;这个结果不返回协议详情。将两份目录按精确 ID 取交集,再检查所需协议。
  4. 官方 SDK 的 baseUrl 是 API 根地址,不带 /v1。OpenAI SDK 则使用带 /v1 的 Base URL。将目录返回的完整 ID(包括别名)原样放进 model,不要根据品牌自行拼接。

目录和权益会变化;最终调用仍可能因权限、限额或模型状态失败。

可运行的 HTTP 示例 ​

使用 Node.js 20+,设置 API_BASE_URL(API 根地址)、AICREDITS_API_KEY 和从目录选出的 MODEL。此示例先校验模型与协议,再发送非流式 Chat 请求;没有硬编码任何生产型号。

js
// Run on a trusted Node.js 20+ server.
const baseUrl = process.env.API_BASE_URL?.replace(/\/+$/, '')
const apiKey = process.env.AICREDITS_API_KEY
const model = process.env.MODEL
if (!baseUrl || !apiKey || !model) throw new Error('Set API_BASE_URL, AICREDITS_API_KEY and MODEL')

async function request(path, authenticated = false, body) {
  const response = await fetch(baseUrl + path, {
    method: body ? 'POST' : 'GET',
    credentials: 'omit',
    signal: AbortSignal.timeout(60_000),
    headers: {
      accept: 'application/json',
      ...(authenticated ? { authorization: `Bearer ${apiKey}` } : {}),
      ...(body ? { 'content-type': 'application/json' } : {}),
    },
    ...(body ? { body: JSON.stringify(body) } : {}),
  })
  if (!response.ok) throw new Error(`HTTP ${response.status}`)
  return response.json()
}

const envelope = await request('/api/v1/public/models')
if (envelope.code !== 0 || !Array.isArray(envelope.data?.items)) {
  throw new Error('Invalid public catalog')
}
const allowed = await request('/v1/models', true)
const published = envelope.data.items.find(item => item.id === model)
if (!allowed.data?.some(item => item.id === model) ||
    !published?.protocols?.includes('openai_chat_completions')) {
  throw new Error('Choose an authorized model with Chat support')
}
const messages = [{ role: 'user', content: 'Hello' }]
const result = await request('/v1/chat/completions', true, { model, messages })
const assistant = result.choices?.[0]?.message
if (!assistant) throw new Error('Missing assistant message')
messages.push(assistant) // Retain reasoning_content, tool_calls and unknown fields.
// Render assistant.content in your application; do not log the full response.

官方 SDK 0.3.0 ​

TypeScript 示例运行在可信 Node.js 后端;包按源码集成,尚未发布到公共包仓库。

ts
import { GatewayClient, type ChatMessage } from '@ai-credits/platform-sdk'

const gateway = new GatewayClient({
  baseUrl: process.env.API_BASE_URL!,
  tokenProvider: { getToken: () => process.env.AICREDITS_API_KEY! },
})
const catalog = await gateway.listPublicModels()
const allowed = await gateway.listModels()
const model = process.env.MODEL!
if (!allowed.data.some(item => item.id === model) ||
    !catalog.items.some(item => item.id === model &&
      item.protocols.includes('openai_chat_completions'))) {
  throw new Error('Select an authorized Chat model from the catalog')
}
const messages: ChatMessage[] = [{ role: 'user', content: '介绍一下你的能力' }]
const result = await gateway.createChatCompletion({ model, messages })
const assistant = result.choices[0]?.message
if (assistant) messages.push(assistant) // 保留 reasoning_content、tool_calls 与扩展字段

Swift / Kotlin 使用相同的目录方法;modelID 应由上述两份目录校验后选出。keychainTokenStore / tokenStore 由调用方提供,终端仅保存短期令牌。

swift
let gateway = CreditPlatformGatewayClient(baseURL: baseURL, tokenStore: keychainTokenStore)
let catalog = try await gateway.listPublicModels()
let models = try await gateway.listModels()
let request = try JSONSerialization.data(withJSONObject: [
    "model": modelID,
    "messages": [["role": "user", "content": "你好"]]
])
let result = try await gateway.createChatCompletion(request: request)
// result 为原始 Data;解析后保留完整 assistant 消息再构造下一轮请求。
kotlin
val gateway = CreditPlatformGatewayClient(baseUrl, tokenStore)
val catalog = gateway.listPublicModels()
val models = gateway.listModels()
val request = mapper.valueToTree<com.fasterxml.jackson.databind.JsonNode>(
    mapOf("model" to modelID, "messages" to listOf(
        mapOf("role" to "user", "content" to "你好")
    ))
)
val result = gateway.createChatCompletion(request)
// result 为 JsonNode;保留完整 assistant 消息用于下一轮。

三个 SDK 都不重命名模型 ID,不剥离推理或工具字段;目录费率保持十进制字符串。

推理与多轮工具调用 ​

不同模型对 thinking、reasoning_effort 的支持与取值不同;不要把一家的开关无条件复制给其他模型。先用默认参数验证调用,再按所选型号的能力启用推理。

Chat 返回的 reasoning_content 与最终 content 是不同字段。工具调用时 content 可能为 null。保存完整 assistant 消息,包括推理内容、tool_calls 和未知扩展字段;工具结果使用对应的 tool_call_id,随后携带完整上下文发起下一轮。业务程序自行执行并校验工具,SDK 不执行工具代码。Responses 多轮也要显式传入上下文,不支持 previous_response_id。

流式与错误排查 ​

TypeScript 的 streamChatCompletion 保留原始 SSE 数据。将 delta.reasoning_content 和 delta.content 分开累加;按工具索引合并 tool_calls 的 ID、名称与参数片段,参数 JSON 收齐后再解析。处理流内错误与 [DONE],不能把网络断开当作成功。Swift / Kotlin 当前仅提供非流式调用,详见流式指南。

  • 模型不可用:重新核对公开目录、/v1/models 和当前权益,不要猜测或自动切换别名。
  • 协议或参数错误:检查 protocols;GLM 选 Chat 或 Messages,并移除该型号不支持的推理参数。
  • 429:按限速指南降低速率与并发。
  • 提交支持请求时只提供状态、安全错误码和请求 ID,不附完整请求、响应或凭据。

继续阅读:协议说明 · OpenAI SDK 迁移 · 官方 SDK