jimeng-free-api-all/CLAUDE.md

327 lines
16 KiB
Markdown
Raw 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.

# CLAUDE.md
本文件为 Claude Code (claude.ai/claude-code) 在此代码仓库中工作时提供指导。
## 项目概述
即梦 AI 免费 API 服务 - 逆向工程的 API 服务器,提供 OpenAI 兼容接口,封装即梦 AI 的图像和视频生成能力。
**版本:** v0.8.6
**核心功能:**
- 文生图:支持 jimeng-5.0、jimeng-4.6、jimeng-4.5 等多款模型,最高 4K 分辨率
- 图生图:多图合成,支持 1-10 张输入图片
- 视频生成jimeng-video-3.5-pro 等模型,支持首帧/尾帧控制
- Seedance 2.0:多模态智能视频生成,模型名 `jimeng-video-seedance-2.0`(兼容 `seedance-2.0`),支持图片/视频/音频混合上传,@1、@2 占位符引用素材4-15 秒时长
- OpenAI 兼容:完全兼容 OpenAI API 格式,无缝对接现有客户端
- 多账号支持:支持多个 sessionid 轮询使用
## 构建和开发命令
```bash
# 安装依赖
npm install
# 安装 Chromium 浏览器Seedance 模型需要)
npx playwright-core install chromium --with-deps
# 开发模式(热重载)
npm run dev
# 生产环境构建
npm run build
# 启动生产服务
npm start
```
## Docker 命令
```bash
# 构建 Docker 镜像
docker build -t jimeng-free-api-all:latest .
# 运行容器
docker run -it -d --init --name jimeng-free-api-all -p 8000:8000 -e TZ=Asia/Shanghai jimeng-free-api-all:latest
# 使用 Docker Hub 预构建镜像
docker pull wwwzhouhui569/jimeng-free-api-all:latest
docker run -it -d --init --name jimeng-free-api-all -p 8000:8000 -e TZ=Asia/Shanghai wwwzhouhui569/jimeng-free-api-all:latest
```
## 项目架构
```
src/
├── index.ts # 应用入口
├── daemon.ts # 守护进程管理
├── api/
│ ├── controllers/ # 业务逻辑控制器
│ │ ├── core.ts # 核心工具Token处理、积分管理、请求封装
│ │ ├── images.ts # 图像生成逻辑(文生图、图生图)
│ │ ├── videos.ts # 视频生成逻辑(含 Seedance 2.0
│ │ └── chat.ts # 对话补全逻辑
│ ├── routes/ # API 路由定义
│ │ ├── index.ts # 路由聚合器
│ │ ├── images.ts # /v1/images/* 端点
│ │ ├── videos.ts # /v1/videos/* 端点
│ │ ├── video.ts # /v1/video/* 端点videos 的包装路由)
│ │ ├── chat.ts # /v1/chat/* 端点
│ │ ├── models.ts # /v1/models 端点
│ │ ├── ping.ts # /ping 健康检查端点
│ │ └── token.ts # /token/* Token管理端点
│ └── consts/
│ └── exceptions.ts # API 异常定义
└── lib/
├── server.ts # Koa 服务器配置(含中间件栈)
├── browser-service.ts # 浏览器代理服务Seedance shark 反爬绕过)
├── config.ts # 配置管理
├── logger.ts # 日志工具
├── util.ts # 辅助工具函数
├── environment.ts # 环境变量
├── initialize.ts # 初始化逻辑
├── http-status-codes.ts # HTTP 状态码
├── request/
│ └── Request.ts # 请求解析与验证(含文件上传规范化)
├── response/
│ ├── Response.ts # 响应包装器
│ ├── Body.ts # 响应体
│ └── FailureBody.ts # 错误响应体
├── exceptions/
│ ├── Exception.ts # 基础异常类
│ └── APIException.ts # API 异常类
├── interfaces/
│ └── ICompletionMessage.ts # 对话消息接口
└── configs/ # 配置模式
├── model-config.ts # 模型配置(模型参数、分辨率映射等)
├── service-config.ts # 服务配置
└── system-config.ts # 系统配置
```
## API 端点
| 端点 | 方法 | 说明 |
|------|------|------|
| `/v1/chat/completions` | POST | OpenAI 兼容的对话接口(用于图像/视频生成) |
| `/v1/images/generations` | POST | 文生图/图生图接口(支持 images 可选参数) |
| `/v1/images/compositions` | POST | 图生图接口(支持文件上传,向后兼容) |
| `/v1/videos/generations` | POST | 视频生成接口(含 Seedance 2.0 / 2.0-fast |
| `/v1/video/generations` | POST | 视频生成接口(别名路由) |
| `/v1/models` | GET | 获取可用模型列表 |
| `/token/check` | POST | 检查 Token 有效性 |
| `/token/points` | POST | 查询账户积分 |
| `/ping` | GET | 健康检查端点 |
## 关键技术细节
### 认证方式
- 使用即梦网站的 `sessionid` Cookie 作为 Bearer Token
- 多账号支持:逗号分隔多个 sessionid`Authorization: Bearer sessionid1,sessionid2`
- 每次请求随机选择一个 sessionid 使用
### 模型映射
#### 图像模型
| 用户模型名 | 内部模型名 | Draft 版本 | 说明 |
|-----------|-----------|-----------|------|
| `jimeng-5.0` | `high_aes_general_v50` | 3.3.9 | 5.0 正式版(原 jimeng-5.0-preview最新模型 |
| `jimeng-4.6` | `high_aes_general_v42` | 3.3.9 | 推荐使用 |
| `jimeng-4.5` | `high_aes_general_v40l` | 3.3.4 | 高质量模型 |
| `jimeng-4.1` | `high_aes_general_v41` | 3.3.4 | 高质量模型 |
| `jimeng-4.0` | `high_aes_general_v40` | 3.3.4 | 稳定版本 |
| `jimeng-3.1` | `high_aes_general_v30l_art_fangzhou` | - | 艺术风格 |
| `jimeng-3.0` | `high_aes_general_v30l` | - | 通用模型 |
| `jimeng-2.1` | - | - | 旧版模型 |
| `jimeng-2.0-pro` | - | - | 旧版专业模型 |
| `jimeng-2.0` | - | - | 旧版模型 |
| `jimeng-1.4` | - | - | 早期模型 |
| `jimeng-xl-pro` | - | - | XL 专业模型 |
#### 视频模型
| 用户模型名 | 内部模型名 | 说明 |
|-----------|-----------|------|
| `jimeng-video-3.5-pro` | `dreamina_ic_generate_video_model_vgfm_3.5_pro` | 最新视频模型 |
| `jimeng-video-3.0` | - | 视频生成 3.0 |
| `jimeng-video-3.0-pro` | - | 视频生成 3.0 专业版 |
| `jimeng-video-2.0` | - | 视频生成 2.0 |
| `jimeng-video-2.0-pro` | - | 视频生成 2.0 专业版 |
| `jimeng-video-seedance-2.0` | `dreamina_seedance_40_pro` | Seedance 2.0(上游标准名称,推荐) |
| `seedance-2.0` | `dreamina_seedance_40_pro` | 多图智能视频生成(向后兼容别名) |
| `seedance-2.0-pro` | `dreamina_seedance_40_pro` | 多图智能视频生成专业版(向后兼容别名) |
| `jimeng-video-seedance-2.0-fast` | `dreamina_seedance_40` | Seedance 2.0-fast 快速版(上游标准名称) |
| `seedance-2.0-fast` | `dreamina_seedance_40` | Seedance 2.0-fast 快速版(向后兼容别名) |
### 请求参数
#### 图像生成参数 (`/v1/images/generations`)
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| model | string | 否 | jimeng-4.5 | 模型名称 |
| prompt | string | 是 | - | 提示词jimeng-4.x/5.x 支持多图生成 |
| images | array | 否 | - | 图片URL数组1-10张提供则走图生图模式不提供则走文生图模式 |
| negative_prompt | string | 否 | "" | 反向提示词 |
| ratio | string | 否 | 1:1 | 宽高比1:1, 4:3, 3:4, 16:9, 9:16, 3:2, 2:3, 21:9 |
| resolution | string | 否 | 2k | 分辨率1k, 2k, 4k |
| sample_strength | float | 否 | 0.5 | 精细度 0.0-1.0 |
| response_format | string | 否 | url | url 或 b64_json |
**说明:**
-`images` 参数为空或不提供时,接口执行文生图功能
-`images` 参数提供1-10张图片接口执行图生图功能
- 支持 `application/json`images 为 URL 数组)和 `multipart/form-data`(通过 images 字段上传文件)两种请求格式
- 图生图模式下,响应会额外包含 `input_images``composition_type` 字段
#### 图生图参数 (`/v1/images/compositions`) - 向后兼容
-`/v1/images/generations` 相同的参数
- `images` 字段为必填1-10张图片
- 额外支持 multipart/form-data 文件上传
#### 视频生成参数 (`/v1/videos/generations`)
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| model | string | 否 | jimeng-video-3.0 | 模型名称 |
| prompt | string | 否 | - | 视频描述(图生视频时可选) |
| ratio | string | 否 | 1:1 | 宽高比1:1, 4:3, 3:4, 16:9, 9:16 |
| resolution | string | 否 | 720p | 分辨率480p, 720p, 1080p |
| duration | number | 否 | 5 | 时长4-15秒Seedance、5 或 10 秒(普通) |
| file_paths / filePaths | array | 否 | [] | 首帧/尾帧图片 URL |
| files | file[] | 否 | - | 上传的素材文件(图片/视频/音频multipart |
#### Seedance 2.0 / 2.0-fast 专用参数
- 使用 `unified_edit_input` 结构,包含 `material_list``meta_list`
- 支持多模态素材混合上传图片ImageX、视频/音频VOD
- 素材类型自动检测:通过 MIME 类型或文件扩展名判断image/video/audio
- 上游标准模型名:`jimeng-video-seedance-2.0`(兼容 `seedance-2.0`、`seedance-2.0-pro`
- 快速版模型名:`jimeng-video-seedance-2.0-fast`(兼容 `seedance-2.0-fast`
- 内部模型(标准版):`dreamina_seedance_40_pro`benefit_type`dreamina_video_seedance_20_pro`
- 内部模型(快速版):`dreamina_seedance_40`benefit_type`dreamina_seedance_20_fast`(注意:无 `video_` 前缀)
- Draft 版本3.3.9
- 时长范围4-15 秒(连续范围,与上游 iptag/jimeng-api 一致)
- 提示词占位符:`@1`、`@2`、`@图1`、`@图2`、`@image1`、`@image2` 引用上传的素材
- 支持的素材格式图片jpg/png/webp/gif/bmp、视频mp4/mov/m4v、音频mp3/wav
### Shark 反爬与浏览器代理v0.8.4
- 即梦对 Seedance 的 `/mweb/v1/aigc_draft/generate` 接口启用了 shark 安全中间件,要求请求携带 `a_bogus` 签名
- `a_bogus` 由字节跳动 `bdms` SDK 在浏览器中生成依赖真实浏览器环境Canvas, WebGL, DOMNode.js 无法直接运行
- 解决方案:通过 `BrowserService``src/lib/browser-service.ts`)使用 Playwright 启动 headless Chromium`bdms` SDK 自动拦截 `fetch` 并注入 `a_bogus`
- 仅 Seedance 的 generate 请求走浏览器代理,其他请求继续用 Node.js `axios`
- 浏览器懒启动,首次 Seedance 请求时创建;每个 sessionId 独立会话10 分钟空闲自动清理
- 资源拦截:屏蔽图片/字体/CSS仅允许 bdms SDK 相关脚本(白名单域名:`vlabstatic.com`、`bytescm.com`、`jianying.com`、`byteimg.com`
### 文件上传
- 支持 multipart/form-data 文件上传
- koa-body 配置最大文件大小 100MB
- files 字段可以是对象或数组格式(在 Request.ts 中自动规范化)
- 支持 formLimit/jsonLimit/textLimit100mb
### 上传通道v0.8.5
- **ImageX 通道**(图片上传):`get_upload_token(scene=2)` → `imagex.bytedanceapi.com``ApplyImageUpload` / `CommitImageUpload`,返回 URI 格式 `tos-cn-i-{service_id}/{uuid}`service_id 为 `tb4s082cfz`
- **VOD 通道**(视频/音频上传):`get_upload_token(scene=1)` → `vod.bytedanceapi.com``ApplyUploadInner` / `CommitUploadInner`,返回 vid 格式 `v028xxx`SpaceName 为 `dreamina`
- AWS Signature V4 签名ImageX 使用 service=`imagex`VOD 使用 service=`vod`region 均为 `cn-north-1`
- VOD 上传自动返回媒体元数据Duration、Width、Height、Fps 等),音频时长 fallback 使用本地 WAV 头解析
### 分辨率支持
#### 图片分辨率
| 分辨率 | 1:1 | 4:3 | 3:4 | 16:9 | 9:16 | 3:2 | 2:3 | 21:9 |
|--------|-----|-----|-----|------|------|-----|-----|------|
| 1k | 1024×1024 | 768×1024 | 1024×768 | 1024×576 | 576×1024 | 1024×682 | 682×1024 | 1195×512 |
| 2k | 2048×2048 | 2304×1728 | 1728×2304 | 2560×1440 | 1440×2560 | 2496×1664 | 1664×2496 | 3024×1296 |
| 4k | 4096×4096 | 4608×3456 | 3456×4608 | 5120×2880 | 2880×5120 | 4992×3328 | 3328×4992 | 6048×2592 |
#### 视频分辨率
| 分辨率 | 1:1 | 4:3 | 3:4 | 16:9 | 9:16 |
|--------|-----|-----|-----|------|------|
| 480p | 480×480 | 640×480 | 480×640 | 854×480 | 480×854 |
| 720p | 720×720 | 960×720 | 720×960 | 1280×720 | 720×1280 |
| 1080p | 1080×1080 | 1440×1080 | 1080×1440 | 1920×1080 | 1080×1920 |
### 服务器中间件栈
1. **CORS 跨域支持**`koa2-cors()`
2. **Range 请求**`koaRange`(支持分段内容传输)
3. **自定义异常处理器**:捕获错误并返回 FailureBody 响应
4. **自定义 JSON 解析器**:处理 POST/PUT/PATCH 请求的 JSON清理问题 Unicode 字符,跳过 multipart 请求)
5. **Body 解析器**`koa-body`multipart: truemaxFileSize: 100MB
## 开发规范
1. **TypeScript**:项目使用 TypeScript + ESM 模块
2. **路径别名**:使用 `@/` 别名指向 `src/` 目录
3. **日志**:使用 `@/lib/logger.ts` 中的 logger 保持输出一致
4. **配置**:环境配置在 `configs/` 目录,通过 `@/lib/config.ts` 加载
5. **API 兼容性**:维护 OpenAI API 兼容性,确保客户端集成正常
6. **Node.js 版本**≥16.0.0
## 测试 API 调用
```bash
# 文生图(使用最新模型)
curl -X POST http://localhost:8000/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_sessionid" \
-d '{"model": "jimeng-5.0", "prompt": "美丽的日落风景", "ratio": "16:9", "resolution": "2k"}'
# 图生图(通过 images 参数)
curl -X POST http://localhost:8000/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_sessionid" \
-d '{"model": "jimeng-4.5", "prompt": "将两张图融合成梦幻风格", "images": ["https://example.com/img1.jpg", "https://example.com/img2.jpg"], "ratio": "1:1", "resolution": "2k", "sample_strength": 0.5}'
# 图生图multipart 文件上传)
curl -X POST http://localhost:8000/v1/images/generations \
-H "Authorization: Bearer your_sessionid" \
-F "model=jimeng-4.5" \
-F "prompt=将图片转换为油画风格" \
-F "images=@/path/to/image1.jpg" \
-F "ratio=1:1" \
-F "resolution=2k"
# 视频生成
curl -X POST http://localhost:8000/v1/videos/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer your_sessionid" \
-d '{"model": "jimeng-video-3.5-pro", "prompt": "一只小猫在草地上玩耍", "ratio": "16:9", "resolution": "720p"}'
# Seedance 2.0 多图视频(文件上传)
curl -X POST http://localhost:8000/v1/videos/generations \
-H "Authorization: Bearer your_sessionid" \
-F "model=jimeng-video-seedance-2.0" \
-F "prompt=@1 和 @2 两人开始跳舞" \
-F "ratio=4:3" \
-F "duration=4" \
-F "files=@/path/to/image1.jpg" \
-F "files=@/path/to/image2.jpg"
# Seedance 2.0-fast 快速多图视频
curl -X POST http://localhost:8000/v1/videos/generations \
-H "Authorization: Bearer your_sessionid" \
-F "model=jimeng-video-seedance-2.0-fast" \
-F "prompt=@1 图片中的人物开始微笑" \
-F "ratio=4:3" \
-F "duration=5" \
-F "files=@/path/to/image1.jpg"
# Seedance 图片+音频混合视频
curl -X POST http://localhost:8000/v1/videos/generations \
-H "Authorization: Bearer your_sessionid" \
-F "model=jimeng-video-seedance-2.0-fast" \
-F "prompt=@1 图片中的人物随着音乐 @2 开始跳舞" \
-F "ratio=9:16" \
-F "duration=5" \
-F "files=@/path/to/image.png" \
-F "files=@/path/to/audio.wav"
# 健康检查
curl http://localhost:8000/ping
# Token 检查
curl -X POST http://localhost:8000/token/check \
-H "Content-Type: application/json" \
-d '{"token": "your_sessionid"}'
```
## 配置
默认端口8000
配置文件在 `configs/` 目录,使用 YAML 格式。