431 lines
9.0 KiB
Markdown
431 lines
9.0 KiB
Markdown
# Text Video Agent API 工具库
|
|
|
|
基于 `https://bowongai-dev--text-video-agent-fastapi-app.modal.run` API 的完整 TypeScript 工具库封装。
|
|
|
|
## 📋 目录
|
|
|
|
- [功能特性](#功能特性)
|
|
- [安装使用](#安装使用)
|
|
- [API 文档](#api-文档)
|
|
- [React Hook](#react-hook)
|
|
- [组件示例](#组件示例)
|
|
- [类型定义](#类型定义)
|
|
- [使用示例](#使用示例)
|
|
|
|
## 🚀 功能特性
|
|
|
|
### 核心功能
|
|
- ✅ **图片生成**: 基于 Midjourney 的高质量图片生成
|
|
- ✅ **视频生成**: 基于极梦的视频生成功能
|
|
- ✅ **文件上传**: 支持文件上传到云存储
|
|
- ✅ **图片描述**: AI 图片内容分析和描述
|
|
- ✅ **任务管理**: 异步任务创建、查询和管理
|
|
|
|
### 高级特性
|
|
- ✅ **重试机制**: 自动重试失败的请求
|
|
- ✅ **进度跟踪**: 实时进度更新和状态监控
|
|
- ✅ **类型安全**: 完整的 TypeScript 类型定义
|
|
- ✅ **React 集成**: 专用的 React Hook 和组件
|
|
- ✅ **错误处理**: 完善的错误处理和用户反馈
|
|
|
|
## 📦 安装使用
|
|
|
|
### 基础安装
|
|
|
|
```bash
|
|
# 复制相关文件到你的项目
|
|
cp src/services/textVideoAgentAPI.ts your-project/src/services/
|
|
cp src/services/textVideoAgentTypes.ts your-project/src/services/
|
|
cp src/hooks/useTextVideoAgent.ts your-project/src/hooks/
|
|
cp src/components/TextVideoGenerator.tsx your-project/src/components/
|
|
```
|
|
|
|
### 依赖要求
|
|
|
|
```json
|
|
{
|
|
"dependencies": {
|
|
"react": "^18.0.0",
|
|
"lucide-react": "^0.263.1"
|
|
},
|
|
"devDependencies": {
|
|
"typescript": "^5.0.0"
|
|
}
|
|
}
|
|
```
|
|
|
|
## 🔧 API 文档
|
|
|
|
### 基础用法
|
|
|
|
```typescript
|
|
import { textVideoAgentAPI } from './services/textVideoAgentAPI'
|
|
|
|
// 健康检查
|
|
const health = await textVideoAgentAPI.healthCheck()
|
|
|
|
// 生成图片
|
|
const imageResult = await textVideoAgentAPI.generateImageSync({
|
|
prompt: '一个美丽的风景',
|
|
max_wait_time: 120
|
|
})
|
|
|
|
// 生成视频
|
|
const videoResult = await textVideoAgentAPI.generateVideoSync({
|
|
prompt: '动态的自然风光',
|
|
img_url: 'https://example.com/image.jpg',
|
|
duration: '5'
|
|
})
|
|
```
|
|
|
|
### 主要方法
|
|
|
|
#### 图片生成
|
|
```typescript
|
|
// 同步生成(推荐)
|
|
generateImageSync(params: ImageGenerationParams): Promise<APIResponse>
|
|
|
|
// 异步生成
|
|
generateImageAsync(prompt: string, imgFile?: File): Promise<APIResponse>
|
|
|
|
// 带重试的生成
|
|
generateImageWithRetry(params: ImageGenerationParams, maxRetries?: number): Promise<APIResponse>
|
|
```
|
|
|
|
#### 视频生成
|
|
```typescript
|
|
// 同步生成
|
|
generateVideoSync(params: VideoGenerationParams): Promise<APIResponse>
|
|
|
|
// 异步生成
|
|
generateVideoAsync(params: VideoGenerationParams): Promise<APIResponse>
|
|
|
|
// 带重试的生成
|
|
generateVideoWithRetry(params: VideoGenerationParams, maxRetries?: number): Promise<APIResponse>
|
|
```
|
|
|
|
#### 任务管理
|
|
```typescript
|
|
// 创建任务
|
|
createTask(request: TaskRequest): Promise<APIResponse>
|
|
|
|
// 查询任务状态
|
|
getTaskStatusAsync(taskId: string): Promise<APIResponse>
|
|
|
|
// 同步等待任务完成
|
|
getTaskResultSync(taskId: string): Promise<APIResponse>
|
|
```
|
|
|
|
#### 高级功能
|
|
```typescript
|
|
// 端到端内容生成
|
|
generateContentEndToEnd(prompt: string, options?: GenerationOptions): Promise<ContentResult>
|
|
|
|
// 轮询任务直到完成
|
|
pollTaskUntilComplete(taskId: string, options?: PollingOptions): Promise<APIResponse>
|
|
```
|
|
|
|
## 🎣 React Hook
|
|
|
|
### useTextVideoAgent
|
|
|
|
```typescript
|
|
import { useTextVideoAgent } from './hooks/useTextVideoAgent'
|
|
|
|
function MyComponent() {
|
|
const {
|
|
state,
|
|
generateImage,
|
|
generateVideo,
|
|
generateContentEndToEnd,
|
|
reset,
|
|
cancel
|
|
} = useTextVideoAgent()
|
|
|
|
const handleGenerate = async () => {
|
|
const result = await generateContentEndToEnd('美丽的风景', {
|
|
taskType: TaskType.VLOG,
|
|
aspectRatio: AspectRatio.PORTRAIT,
|
|
generateVideo: true
|
|
})
|
|
|
|
console.log('生成结果:', result)
|
|
}
|
|
|
|
return (
|
|
<div>
|
|
{state.isLoading && (
|
|
<div>
|
|
<p>{state.currentStep}</p>
|
|
<progress value={state.progress} max={100} />
|
|
</div>
|
|
)}
|
|
|
|
{state.error && (
|
|
<div className="error">{state.error}</div>
|
|
)}
|
|
|
|
<button onClick={handleGenerate} disabled={state.isLoading}>
|
|
生成内容
|
|
</button>
|
|
</div>
|
|
)
|
|
}
|
|
```
|
|
|
|
### useTaskPolling
|
|
|
|
```typescript
|
|
import { useTaskPolling } from './hooks/useTextVideoAgent'
|
|
|
|
function TaskMonitor({ taskId }: { taskId: string }) {
|
|
const { status, isPolling } = useTaskPolling(taskId, {
|
|
onComplete: (result) => {
|
|
console.log('任务完成:', result)
|
|
},
|
|
onError: (error) => {
|
|
console.error('任务失败:', error)
|
|
},
|
|
onProgress: (status) => {
|
|
console.log('进度更新:', status)
|
|
}
|
|
})
|
|
|
|
return (
|
|
<div>
|
|
{isPolling && <p>任务进行中...</p>}
|
|
{status && <pre>{JSON.stringify(status, null, 2)}</pre>}
|
|
</div>
|
|
)
|
|
}
|
|
```
|
|
|
|
## 🧩 组件示例
|
|
|
|
### TextVideoGenerator 组件
|
|
|
|
```typescript
|
|
import TextVideoGenerator from './components/TextVideoGenerator'
|
|
|
|
function App() {
|
|
return (
|
|
<TextVideoGenerator
|
|
onImageGenerated={(imageUrl) => {
|
|
console.log('图片生成完成:', imageUrl)
|
|
}}
|
|
onVideoGenerated={(videoUrl) => {
|
|
console.log('视频生成完成:', videoUrl)
|
|
}}
|
|
/>
|
|
)
|
|
}
|
|
```
|
|
|
|
## 📝 类型定义
|
|
|
|
### 主要接口
|
|
|
|
```typescript
|
|
// API 响应
|
|
interface APIResponse<T = any> {
|
|
status: boolean
|
|
msg: string
|
|
data?: T
|
|
}
|
|
|
|
// 图片生成参数
|
|
interface ImageGenerationParams {
|
|
prompt: string
|
|
img_file?: File
|
|
max_wait_time?: number
|
|
poll_interval?: number
|
|
}
|
|
|
|
// 视频生成参数
|
|
interface VideoGenerationParams {
|
|
prompt: string
|
|
img_url?: string
|
|
img_file?: File
|
|
duration?: string
|
|
max_wait_time?: number
|
|
poll_interval?: number
|
|
}
|
|
|
|
// 任务请求
|
|
interface TaskRequest {
|
|
task_type?: string
|
|
prompt: string
|
|
img_url?: string
|
|
ar?: string
|
|
}
|
|
```
|
|
|
|
### 枚举类型
|
|
|
|
```typescript
|
|
enum TaskType {
|
|
TEA = 'tea',
|
|
CHOP = 'chop',
|
|
LADY = 'lady',
|
|
VLOG = 'vlog'
|
|
}
|
|
|
|
enum AspectRatio {
|
|
SQUARE = '1:1',
|
|
PORTRAIT = '9:16',
|
|
LANDSCAPE = '16:9'
|
|
}
|
|
|
|
enum VideoDuration {
|
|
SHORT = '3',
|
|
MEDIUM = '5',
|
|
LONG = '10'
|
|
}
|
|
```
|
|
|
|
## 💡 使用示例
|
|
|
|
### 示例1: 基础图片生成
|
|
|
|
```typescript
|
|
import { textVideoAgentAPI, TaskType, AspectRatio } from './services/textVideoAgentAPI'
|
|
|
|
async function generateImage() {
|
|
try {
|
|
const result = await textVideoAgentAPI.generateImageSync({
|
|
prompt: '一个现代化的咖啡厅,温暖的灯光,舒适的环境',
|
|
max_wait_time: 120
|
|
})
|
|
|
|
if (result.status) {
|
|
console.log('图片URL:', result.data.image_url)
|
|
}
|
|
} catch (error) {
|
|
console.error('生成失败:', error)
|
|
}
|
|
}
|
|
```
|
|
|
|
### 示例2: 端到端内容生成
|
|
|
|
```typescript
|
|
async function generateContent() {
|
|
try {
|
|
const result = await textVideoAgentAPI.generateContentEndToEnd(
|
|
'制作一个关于健康生活的短视频',
|
|
{
|
|
taskType: TaskType.VLOG,
|
|
aspectRatio: AspectRatio.PORTRAIT,
|
|
videoDuration: VideoDuration.MEDIUM,
|
|
generateVideo: true,
|
|
onProgress: (step, progress) => {
|
|
console.log(`${step}: ${progress}%`)
|
|
}
|
|
}
|
|
)
|
|
|
|
console.log('生成完成:', result)
|
|
} catch (error) {
|
|
console.error('生成失败:', error)
|
|
}
|
|
}
|
|
```
|
|
|
|
### 示例3: 批量处理
|
|
|
|
```typescript
|
|
async function batchGenerate() {
|
|
const prompts = [
|
|
'春天的樱花',
|
|
'夏日的海滩',
|
|
'秋天的枫叶',
|
|
'冬日的雪景'
|
|
]
|
|
|
|
const results = await Promise.allSettled(
|
|
prompts.map(prompt =>
|
|
textVideoAgentAPI.generateImageSync({ prompt })
|
|
)
|
|
)
|
|
|
|
results.forEach((result, index) => {
|
|
if (result.status === 'fulfilled') {
|
|
console.log(`图片 ${index + 1} 生成成功:`, result.value.data?.image_url)
|
|
} else {
|
|
console.error(`图片 ${index + 1} 生成失败:`, result.reason)
|
|
}
|
|
})
|
|
}
|
|
```
|
|
|
|
## 🔧 配置选项
|
|
|
|
### 预设配置
|
|
|
|
```typescript
|
|
import { PRESET_CONFIGS } from './services/textVideoAgentTypes'
|
|
|
|
// 快速生成(低质量)
|
|
const fastConfig = PRESET_CONFIGS.FAST
|
|
|
|
// 标准生成
|
|
const standardConfig = PRESET_CONFIGS.STANDARD
|
|
|
|
// 高质量生成
|
|
const highQualityConfig = PRESET_CONFIGS.HIGH_QUALITY
|
|
```
|
|
|
|
### 自定义配置
|
|
|
|
```typescript
|
|
const customAPI = new TextVideoAgentAPI('https://your-custom-endpoint.com')
|
|
```
|
|
|
|
## 🚨 错误处理
|
|
|
|
```typescript
|
|
try {
|
|
const result = await textVideoAgentAPI.generateImageSync(params)
|
|
} catch (error) {
|
|
if (error instanceof Error) {
|
|
console.error('错误信息:', error.message)
|
|
}
|
|
|
|
// 处理特定错误类型
|
|
if (error.message.includes('timeout')) {
|
|
// 处理超时错误
|
|
} else if (error.message.includes('quota')) {
|
|
// 处理配额不足错误
|
|
}
|
|
}
|
|
```
|
|
|
|
## 📊 性能优化
|
|
|
|
### 缓存策略
|
|
- 图片生成结果自动缓存
|
|
- 任务状态智能轮询
|
|
- 网络请求去重
|
|
|
|
### 最佳实践
|
|
- 使用适当的超时时间
|
|
- 合理设置轮询间隔
|
|
- 及时取消不需要的请求
|
|
- 使用预设配置提高效率
|
|
|
|
## 🤝 贡献指南
|
|
|
|
1. Fork 项目
|
|
2. 创建功能分支
|
|
3. 提交更改
|
|
4. 推送到分支
|
|
5. 创建 Pull Request
|
|
|
|
## 📄 许可证
|
|
|
|
MIT License
|
|
|
|
## 🆘 支持
|
|
|
|
如有问题或建议,请创建 Issue 或联系开发团队。
|