feat: 新增角色功能与独立视频模型时长。fix: 修复非流测试输出的问题

closes #1
This commit is contained in:
TheSmallHanCat
2025-11-16 11:04:16 +08:00
parent b6cedb0ece
commit 42b8311450
14 changed files with 1301 additions and 400 deletions

312
README.md
View File

@@ -18,7 +18,11 @@
- [功能特性](#功能特性)
- [快速开始](#快速开始)
- [使用指南](#使用指南)
- [架构设计](#架构设计)
- [快速参考](#快速参考)
- [管理后台](#管理后台)
- [API 调用](#api-调用)
- [视频角色功能](#视频角色功能)
- [常见问题](#常见问题)
- [许可证](#许可证)
---
@@ -31,6 +35,8 @@
- 🎬 **文生视频** - 根据文本描述生成视频
- 🎥 **图生视频** - 基于图片生成相关视频
- 📊 **多尺寸支持** - 横屏、竖屏等多种规格
- 🎭 **视频角色功能** - 创建角色,生成角色视频
- 🎬 **Remix 功能** - 基于已有视频继续创作
### 高级特性
- 🔐 **Token 管理** - 支持多 Token 管理和轮询负载均衡
@@ -42,12 +48,6 @@
- 🛡️ **安全认证** - API Key 验证和权限管理
- 📱 **Web 管理界面** - 直观的管理后台
### 可靠性
-**自动重试** - 智能重试机制
- 🔒 **错误处理** - 完善的错误处理和恢复
- 📊 **性能监控** - Token 使用统计和监控
- 🚫 **速率限制** - 防止滥用的限流机制
---
## 🚀 快速开始
@@ -118,36 +118,23 @@ python main.py
---
## 📖 使用指南
### 快速参考
### 管理后台
| 功能 | 模型 | 说明 |
|------|------|------|
| 文生图 | `sora-image*` | 使用 `content` 为字符串 |
| 图生图 | `sora-image*` | 使用 `content` 数组 + `image_url` |
| 文生视频 | `sora-video*` | 使用 `content` 为字符串 |
| 图生视频 | `sora-video*` | 使用 `content` 数组 + `image_url` |
| 创建角色 | `sora-video*` | 使用 `content` 数组 + `input_video` |
| 角色生成视频 | `sora-video*` | 使用 `content` 数组 + `input_video` + 文本 |
| Remix | `sora-video*` | 在 `content` 中包含 Remix ID |
访问 http://localhost:8000或你的服务器 IP/域名)
#### 主要功能
1. **Token 管理**
- 添加/删除 Sora Token
- 查看 Token 状态和使用统计
- 设置 Token 过期时间
- 编辑 Token 备注信息
2. **代理配置**
- 启用/禁用代理
- 配置代理地址(支持 HTTP 和 SOCKS5
3. **调试模式**
- 启用详细日志记录
- 查看 API 请求/响应详情
4. **系统配置**
- 修改管理员密码
- 修改 API Key
- 配置冷却阈值和错误限制
---
### API 调用
#### 基本信息(使用OpenAI标准格式
#### 基本信息OpenAI标准格式,需要使用流式
- **端点**: `http://localhost:8000/v1/chat/completions`
- **认证**: 在请求头中添加 `Authorization: Bearer YOUR_API_KEY`
@@ -155,14 +142,24 @@ python main.py
#### 支持的模型
| 模型 | 说明 | 输入 | 输出 |
**图片模型**
| 模型 | 说明 | 尺寸 |
|------|------|------|
| `sora-image` | 文生图(默认) | 360×360 |
| `sora-image-landscape` | 文生图(横屏) | 540×360 |
| `sora-image-portrait` | 文生图(竖屏) | 360×540 |
**视频模型**
| 模型 | 时长 | 方向 | 说明 |
|------|------|------|------|
| `sora-image` | 文生图(默认横屏 | 文本/图片 | 图片 |
| `sora-image-landscape` | 文生图(横屏 | 文本/图片 | 图片 |
| `sora-image-portrait` | 文生图(竖屏) | 文本/图片 | 图片 |
| `sora-video` | 文生视频(默认横屏 | 文本/图片 | 视频 |
| `sora-video-landscape` | 文生视频(横屏) | 文本/图片 | 视频 |
| `sora-video-portrait` | 文生视频(竖屏 | 文本/图片 | 视频 |
| `sora-video-10s` | 10秒 | 横屏 | 文生视频/图生视频 |
| `sora-video-15s` | 15秒 | 横屏 | 文生视频/图生视频 |
| `sora-video-landscape-10s` | 10秒 | 横屏 | 文生视频/图生视频 |
| `sora-video-landscape-15s` | 15秒 | 横屏 | 文生视频/图生视频 |
| `sora-video-portrait-10s` | 10秒 | 竖屏 | 文生视频/图生视频 |
| `sora-video-portrait-15s` | 15秒 | 竖屏 | 文生视频/图生视频 |
#### 请求示例
@@ -194,10 +191,21 @@ curl -X POST "http://localhost:8000/v1/chat/completions" \
"messages": [
{
"role": "user",
"content": "将这张图片变成油画风格"
"content": [
{
"type": "text",
"text": "将这张图片变成油画风格"
},
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,<base64_encoded_image_data>"
}
}
]
}
],
"image": "base64_encoded_image_data"
"stream": true
}'
```
@@ -208,85 +216,177 @@ curl -X POST "http://localhost:8000/v1/chat/completions" \
-H "Authorization: Bearer han1234" \
-H "Content-Type: application/json" \
-d '{
"model": "sora-video",
"model": "sora-video-landscape-10s",
"messages": [
{
"role": "user",
"content": "一只小猫在草地上奔跑"
}
],
"stream": true
}'
```
**图生视频**
```bash
curl -X POST "http://localhost:8000/v1/chat/completions" \
-H "Authorization: Bearer han1234" \
-H "Content-Type: application/json" \
-d '{
"model": "sora-video-landscape-10s",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "这只猫在跳舞"
},
{
"type": "image_url",
"image_url": {
"url": "data:image/png;base64,<base64_encoded_image_data>"
}
}
]
}
],
"stream": true
}'
```
**视频Remix基于已有视频继续创作**
```bash
curl -X POST "http://localhost:8000/v1/chat/completions" \
-H "Authorization: Bearer han1234" \
-H "Content-Type: application/json" \
-d '{
"model": "sora-video-landscape-10s",
"messages": [
{
"role": "user",
"content": "https://sora.chatgpt.com/p/s_68e3a06dcd888191b150971da152c1f5改成水墨画风格"
}
]
}'
```
#### 响应示例
### 视频角色功能
```json
{
"id": "chatcmpl-8p8fk9x",
"object": "text_completion",
"created": 1699564800,
"model": "sora-image",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "<img src=\"https://example.com/image.jpg\" />"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 10,
"completion_tokens": 0,
"total_tokens": 10
}
}
Sora2API 支持**视频角色生成**功能。
#### 功能说明
- **角色创建**: 如果只有视频无prompt则生成角色自动提取角色信息输出角色名
- **角色生成**: 有视频、prompt则上传视频创建角色使用角色和prompt进行生成输出视频
#### API调用OpenAI标准格式需要使用流式
**场景 1: 仅创建角色(不生成视频)**
上传视频提取角色信息,获取角色名称和头像。
```bash
curl -X POST "http://localhost:8000/v1/chat/completions" \
-H "Authorization: Bearer han1234" \
-H "Content-Type: application/json" \
-d '{
"model": "sora-video-landscape-10s",
"messages": [
{
"role": "user",
"content": [
{
"type": "input_video",
"videoUrl": {
"url": "data:video/mp4;base64,<base64_encoded_video_data>"
}
}
]
}
],
"stream": true
}'
```
**场景 2: 创建角色并生成视频**
上传视频创建角色,然后使用该角色生成新视频。
```bash
curl -X POST "http://localhost:8000/v1/chat/completions" \
-H "Authorization: Bearer han1234" \
-H "Content-Type: application/json" \
-d '{
"model": "sora-video-landscape-10s",
"messages": [
{
"role": "user",
"content": [
{
"type": "input_video",
"videoUrl": {
"url": "data:video/mp4;base64,<base64_encoded_video_data>"
}
},
{
"type": "text",
"text": "角色做一个跳舞的动作"
}
]
}
],
"stream": true
}'
```
#### Python 代码示例
```python
import requests
import base64
# 读取视频文件并编码为 Base64
with open("video.mp4", "rb") as f:
video_data = base64.b64encode(f.read()).decode("utf-8")
# 仅创建角色
response = requests.post(
"http://localhost:8000/v1/chat/completions",
headers={
"Authorization": "Bearer han1234",
"Content-Type": "application/json"
},
json={
"model": "sora-video-landscape-10s",
"messages": [
{
"role": "user",
"content": [
{
"type": "input_video",
"videoUrl": {
"url": f"data:video/mp4;base64,{video_data}"
}
}
]
}
],
"stream": True
},
stream=True
)
# 处理流式响应
for line in response.iter_lines():
if line:
print(line.decode("utf-8"))
```
---
## 🏗️ 架构设计
### 系统架构
```
┌─────────────────────────────────────────┐
│ 前端 (Web UI) │
│ • Vue3 管理界面 │
│ • Token 管理 │
│ • 配置管理 │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ API 层 (FastAPI) │
│ • OpenAI 兼容接口 │
│ • 管理接口 │
│ • 认证授权 │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ 业务层 (Services) │
│ • Token 管理 │
│ • 负载均衡 │
│ • 生成处理 │
│ • 日志记录 │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ 数据层 (SQLite) │
│ • Token 存储 │
│ • 任务记录 │
│ • 日志存储 │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ Sora API (上游) │
│ • 图片生成 │
│ • 视频生成 │
└─────────────────────────────────────────┘
```
## 📄 许可证
本项目采用 MIT 许可证。详见 [LICENSE](LICENSE) 文件。