library-picturebook-activity/lesingle-aicreate-client/demo/example-usage.js
2026-04-03 20:55:51 +08:00

198 lines
7.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 乐读派 AI 创作系统 — C 端接入完整示例
*
* 依赖安装:
* npm install crypto-js sockjs-client @stomp/stompjs
*
* 本示例演示完整的创作流程:
* 1. 校验额度
* 2. 获取画风列表
* 3. 发起 A1/A3 创作
* 4. WebSocket + HTTP 轮询双通道追踪进度
* 5. 获取创作结果
*/
import CreationApi from './CreationApi.js'
import CreationProgressTracker from './CreationProgressTracker.js'
// ═══════════════════════════════════════════════════════════════════
// 配置(替换为实际值)
// ═══════════════════════════════════════════════════════════════════
const CONFIG = {
serverUrl: 'https://your-server.com', // 替换为实际服务器地址
appKey: 'ORG001', // 机构 App Key
appSecret: 'your-app-secret', // 机构密钥(联系管理员获取)
phone: '13800138000' // 用户手机号
}
const api = new CreationApi(CONFIG.serverUrl, CONFIG.appKey, CONFIG.appSecret)
// ═══════════════════════════════════════════════════════════════════
// 示例 1: A1 一句话创作(最简单的接入方式)
// ═══════════════════════════════════════════════════════════════════
async function exampleA1Creation() {
console.log('=== A1 一句话创作 ===')
// Step 1: 校验额度
const validation = await api.validate(CONFIG.appKey, CONFIG.phone)
if (!validation.valid) {
console.error('额度不足:', validation.reason)
return
}
console.log('额度校验通过,剩余:', validation.remainQuota)
// Step 2: 获取画风列表
const styles = await api.getStyles()
console.log('可用画风:', styles.map(s => s.styleName).join(', '))
// Step 3: 发起创作
const result = await api.createBySentence({
orgId: CONFIG.appKey,
phone: CONFIG.phone,
sentence: '小恐龙学游泳',
style: 'style_cartoon',
enableVoice: false,
author: '小朋友',
age: 5
})
console.log('创作已提交workId:', result.workId)
// Step 4: 追踪进度WebSocket + HTTP 双通道)
const tracker = new CreationProgressTracker({
serverUrl: CONFIG.serverUrl,
orgId: CONFIG.appKey,
appKey: CONFIG.appKey,
appSecret: CONFIG.appSecret,
workId: result.workId,
onProgress: (progress, message) => {
// 更新 UI 进度条
console.log(`[${progress}%] ${message}`)
// updateProgressBar(progress)
// updateStatusText(message)
},
onComplete: (data) => {
if (data.status === 'COMPLETED') {
console.log('创作完成!')
console.log('标题:', data.title)
console.log('页数:', data.pageList.length)
console.log('耗时:', Math.round(data.durationMs / 1000), '秒')
// 展示绘本
data.pageList.forEach(page => {
console.log(` P${page.pageNum}: ${page.text}`)
console.log(` 图片: ${page.imageUrl}`)
if (page.audioUrl) console.log(` 音频: ${page.audioUrl}`)
})
} else {
console.error('创作失败:', data.failReason)
if (data.retryCount > 0) {
console.log(`(已自动重试 ${data.retryCount} 次)`)
}
}
},
onError: (err) => {
console.error('追踪异常:', err.message)
}
})
tracker.start()
}
// ═══════════════════════════════════════════════════════════════════
// 示例 2: A3 图片故事创作(带角色引用)
// ═══════════════════════════════════════════════════════════════════
async function exampleA3Creation() {
console.log('=== A3 图片故事创作 ===')
const result = await api.createByImage({
orgId: CONFIG.appKey,
phone: CONFIG.phone,
imageUrl: 'https://your-oss.com/upload/child-drawing.png',
storyHint: '小兔子去森林冒险',
style: 'style_watercolor',
enableVoice: true,
// 可选: 从 A5/A6 提取的角色引用
// heroCharId: 'char_123',
// characterRefs: [{ charId: 'char_123', imageUrl: 'https://...', name: '小兔子' }]
})
console.log('A3 创作已提交workId:', result.workId)
// 使用 tracker 追踪进度同示例1
const tracker = new CreationProgressTracker({
serverUrl: CONFIG.serverUrl,
orgId: CONFIG.appKey,
appKey: CONFIG.appKey,
appSecret: CONFIG.appSecret,
workId: result.workId,
onProgress: (p, m) => console.log(`[${p}%] ${m}`),
onComplete: (data) => console.log('完成:', data.status, data.title)
})
tracker.start()
}
// ═══════════════════════════════════════════════════════════════════
// 示例 3: 纯 B2 轮询(不使用 WebSocket最简单接入
// ═══════════════════════════════════════════════════════════════════
async function exampleSimplePolling(workId) {
console.log('=== 纯 HTTP 轮询模式 ===')
const poll = async () => {
const data = await api.getWork(workId)
console.log(`[${data.progress}%] ${data.progressMessage}`)
if (data.status === 'COMPLETED') {
console.log('完成! 标题:', data.title, '页数:', data.pageList.length)
return
}
if (data.status === 'FAILED') {
console.error('失败:', data.failReason)
return
}
// 继续轮询
setTimeout(poll, 5000)
}
poll()
}
// ═══════════════════════════════════════════════════════════════════
// 示例 4: A4 视频合成(基于已完成的作品)
// ═══════════════════════════════════════════════════════════════════
async function exampleVideoCreation(workId) {
console.log('=== A4 视频合成 ===')
const result = await api.createVideo({
orgId: CONFIG.appKey,
phone: CONFIG.phone,
workId: workId
})
console.log('视频合成已提交,轮询视频状态...')
const poll = async () => {
const data = await api.getWork(workId)
if (data.videoStatus === 'VIDEO_COMPLETED') {
console.log('视频完成:', data.videoUrl)
return
}
if (data.videoStatus === 'VIDEO_FAILED') {
console.error('视频失败:', data.failReason)
return
}
setTimeout(poll, 5000)
}
poll()
}
// 运行示例
// exampleA1Creation()
// exampleA3Creation()
// exampleSimplePolling('your-work-id')
// exampleVideoCreation('your-work-id')