mirror of
https://github.com/TheSmallHanCat/sora2api.git
synced 2026-02-20 23:41:22 +08:00
312
README.md
312
README.md
@@ -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) 文件。
|
||||
|
||||
Reference in New Issue
Block a user