Node.js
依赖:Node.js 18+ 内置 fetch,无需安装;或可选 npm install axios。
1) 非流式聊天(原生 fetch)
const BASE_URL = 'https://ai.umeng.com';
const API_KEY = process.env.UMENG_AI_KEY ?? 'YOUR_API_KEY';
async function chat(prompt, options = {}) {
const { model = 'auto', sessionId, enableThinking = false } = options;
const res = await fetch(`${BASE_URL}/api/llm/chat`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
model, sessionId, enableThinking,
loadHistory: !!sessionId,
messages: [{ role: 'user', content: prompt }],
}),
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
const data = await res.json();
if (!data.success) throw new Error(data.msg ?? '接口返回失败');
const { content, meta, usage } = data.data;
console.log(`[路由] ${meta?.actual_model} [算力点] ${usage?.credits}`);
return { content, sessionId: meta?.session_id };
}
const { content } = await chat('用一句话介绍牛顿第一定律');
console.log('回答:', content);2) 流式聊天(SSE)
const BASE_URL = 'https://ai.umeng.com';
const API_KEY = process.env.UMENG_AI_KEY ?? 'YOUR_API_KEY';
async function chatStream(prompt, onDelta, options = {}) {
const { model = 'auto', sessionId, enableThinking = false } = options;
const res = await fetch(`${BASE_URL}/api/llm/chat/stream`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
'Accept': 'text/event-stream',
},
body: JSON.stringify({
model, sessionId, enableThinking,
loadHistory: !!sessionId,
messages: [{ role: 'user', content: prompt }],
}),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const reader = res.body.getReader();
const decoder = new TextDecoder();
let buf = '', eventType = null;
while (true) {
const { done, value } = await reader.read();
if (done) break;
buf += decoder.decode(value, { stream: true });
const lines = buf.split('\n');
buf = lines.pop();
for (const line of lines) {
const trimmed = line.trim();
if (!trimmed) { eventType = null; continue; }
if (trimmed.startsWith('event:')) {
eventType = trimmed.slice(6).trim();
} else if (trimmed.startsWith('data:')) {
const payload = JSON.parse(trimmed.slice(5).trim());
if (eventType === 'delta' && payload.type === 'content') {
onDelta(payload.delta ?? '');
} else if (eventType === 'done') {
console.log(`\n[完成] tokens=${payload.total_tokens} credits=${payload.credits}`);
}
}
}
}
}
await chatStream('请用 JavaScript 写一个防抖函数', (d) => process.stdout.write(d));3)图像生成
const res = await fetch(`${BASE_URL}/api/llm/chat`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
model: 'doubao-seedream-5-0-pro-260628',
messages: [{ role: 'user', content: '一只在弹钢琴的企鹅' }],
imageParams: { size: '1024x1024', quality: 'low', n: 1 },
}),
});
const data = await res.json();
const markdown = data.data.content;
const imageUrl = markdown.match(/\((https?:[^)]+)\)/)?.[1];
console.log('图片地址:', imageUrl);4)视频生成(提交 + 轮询)
const BASE_URL = 'https://ai.umeng.com';
const API_KEY = process.env.UMENG_AI_KEY ?? 'YOUR_API_KEY';
const headers = { 'Authorization': `Bearer ${API_KEY}`, 'Content-Type': 'application/json' };
// ① 提交任务
async function submitVideo(prompt) {
const res = await fetch(`${BASE_URL}/api/llm/chat`, {
method: 'POST', headers,
body: JSON.stringify({
model: 'wan2.5-t2v-preview',
messages: [{ role: 'user', content: prompt }],
videoParams: { resolution: '480P', ratio: '16:9', duration: 5 },
}),
});
const { data } = await res.json();
return data.request_id;
}
// ② 轮询结果
async function waitVideo(requestId, { intervalMs = 15000, maxTries = 40 } = {}) {
for (let i = 1; i <= maxTries; i++) {
const res = await fetch(`${BASE_URL}/api/llm/chat/video/result`, {
method: 'POST', headers,
body: JSON.stringify({ requestId }),
});
const { data } = await res.json();
console.log(`第 ${i} 次轮询,状态:${data.status}`);
if (data.status === 'SUCCEEDED') return data;
if (data.status === 'FAILED') throw new Error('视频生成失败');
await new Promise((r) => setTimeout(r, intervalMs));
}
throw new Error('轮询超时');
}
const rid = await submitVideo('一只橘猫在窗台上晒太阳');
console.log('任务已提交:', rid);
const result = await waitVideo(rid);
console.log('视频地址:', result.video_url);