DeepSeek、Kimi、MiniMax 与智谱 GLM
用同一套平台凭据和 Credits 接入中国大模型与国际模型。先确认模型是否公开、当前凭据是否有权调用,再选择接口。系列接入不代表所有型号、参数或套餐均已开放。
协议支持范围
| 模型系列 | Chat Completions | Messages | Responses |
|---|---|---|---|
| DeepSeek | 已实现兼容路径 | 已实现兼容路径 | 已实现兼容路径 |
| Kimi | 已实现兼容路径 | 已实现兼容路径 | 已实现兼容路径 |
| MiniMax | 已实现兼容路径 | 已实现兼容路径 | 已实现兼容路径 |
| 智谱 GLM | 已实现兼容路径 | 已实现兼容路径 | 当前未实现 |
这张表描述集成范围;具体模型以公开目录的 protocols、流式标记和账户权益为准。Chat 对应 openai_chat_completions,Messages 对应 anthropic_messages,Responses 对应 openai_responses。不要对 GLM 调用 Responses,也不要从系列名称推断向量、图片、视频、Gemini 原生或 Token 计数能力。
凭据、地址与选模
- 在可信后端使用平台 API Key;终端应用通过 Embedded 使用短期令牌。第三方服务密钥、Coding Plan 或订阅授权不能直接作为平台 API Key 使用;订阅授权接入尚未公开提供。
GET /api/v1/public/models返回{ code: 0, data: ... },包含协议、能力和费率,无需鉴权。SDK 0.3.0 的listPublicModels()解包并返回类型化目录,不读取或发送令牌。GET /v1/models或listModels()使用当前凭据返回可用模型 ID;这个结果不返回协议详情。将两份目录按精确 ID 取交集,再检查所需协议。- 官方 SDK 的
baseUrl是 API 根地址,不带/v1。OpenAI SDK 则使用带/v1的 Base URL。将目录返回的完整 ID(包括别名)原样放进model,不要根据品牌自行拼接。
目录和权益会变化;最终调用仍可能因权限、限额或模型状态失败。
可运行的 HTTP 示例
使用 Node.js 20+,设置 API_BASE_URL(API 根地址)、AICREDITS_API_KEY 和从目录选出的 MODEL。此示例先校验模型与协议,再发送非流式 Chat 请求;没有硬编码任何生产型号。
// 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 后端;包按源码集成,尚未发布到公共包仓库。
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 由调用方提供,终端仅保存短期令牌。
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 消息再构造下一轮请求。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