跳转到主要内容
PRODUCT DOCUMENTS

快速找到所需文档,高效完成接入与排障

浏览产品文档与友盟 Skill,展开目录并阅读正文。

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);