Files
NianAIGC/README.zh-CN.md

310 lines
9.9 KiB
Markdown
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.

# 智念AIGC平台中文说明
智念AIGC平台是一个面向图片与视频创作的 Web 工作台。当前版本聚焦核心生产链路:提示词创作、素材上传、图片生成、视频生成、局部重绘、智能超清、历史资产管理和接口配置。
## 运维与对接文档
- [部署说明](./docs/DEPLOYMENT.md)
- [开放 API 对接说明](./docs/API.md)
- OpenAPI JSON`GET /api/v1/openapi.json`
## 功能概览
- 统一创作入口:`/create`
- 结果资产管理:`/assets`
- 服务与引擎配置:`/settings`
- 后台日志管理:`/logs`
- 图片生成:即梦图片生成 4.6 或 EvoLink GPT Image 2
- 图片编辑:局部重绘、智能超清
- 视频生成Seedance 2.0
- 素材引用:上传后可在提示词中使用 `@图片1``@视频1``@音频1`
- 本地开发兜底:未配置真实接口时,可使用 mock 流程完成产品验收
## 技术栈
- Next.js 15
- React 19
- TypeScript
- GSAP
- Supabase/Postgres 可选
- Aliyun OSS 可选
- Vitest
## 快速启动
开发环境:
```bash
npm install
cp .env.example .env.local
npm run dev -- --hostname 127.0.0.1 --port 3000
```
访问地址:
```text
http://127.0.0.1:3000
```
生产模式:
```bash
npm start
```
`npm start` 会先执行 `next build`,再启动 `127.0.0.1:3000`
## 服务器一键部署
服务器推荐使用 Docker Compose
```bash
git clone <你的仓库地址>
cd NianAIGC
bash scripts/deploy.sh
```
脚本会自动完成:
- 创建 `.env.local`
- 创建 `.runtime/data``.runtime/uploads``.runtime/generated-results`
- 创建 `.runtime/logs`
- 构建 Docker 镜像
- 使用 `docker compose up -d --build` 后台启动 Web 服务和 Worker 服务
默认访问:
```text
http://服务器IP:3000
```
如果要换端口,可以编辑 `.env.local`
```env
APP_PORT=8080
NEXT_PUBLIC_APP_URL=http://你的服务器IP:8080
```
然后重新执行:
```bash
bash scripts/deploy.sh
```
常用 Docker 命令:
```bash
docker compose ps
docker compose logs -f zhinian-aigc
docker compose logs -f zhinian-worker
docker compose restart
docker compose down
```
如果服务器不用 Docker也可以用 Node 直接部署:
```bash
npm ci
npm run build
npm run start:server
```
另开一个进程运行任务 Worker
```bash
npm run worker
```
生产环境建议把 `NEXT_PUBLIC_APP_URL` 设置成真实域名或公网地址,配置 `ZHINIAN_INTERNAL_WORKER_TOKEN`,并把 `.runtime/` 做定期备份。
部署后如果页面或接口报错,登录后台访问 `/logs` 查看最近错误、请求路径、状态码和错误栈。日志文件默认在 `.runtime/logs/server-events.jsonl`
## 常用命令
```bash
npm run dev -- --hostname 127.0.0.1 --port 3000
npm test
npm run build
npm run health
npm run worker:once
npm run info
```
## 页面路由
| 路由 | 用途 |
|------|------|
| `/` | 自动跳转到 `/create` |
| `/create` | 统一创作入口 |
| `/create?mode=video` | 视频生成模式 |
| `/create?mode=inpaint` | 局部重绘模式 |
| `/create?mode=upscale` | 智能超清模式 |
| `/assets` | 历史任务与资产 |
| `/logs` | 后台日志管理 |
| `/settings` | 接口、引擎和服务配置 |
## 账户登录 / SSO
发布环境默认启用账户登录保护。Web 端支持 OAuth2 Authorization Code 和账号密码验证码两种登录方式:授权码模式会跳转认证中心,平台后端在 `/api/auth/callback` 用授权码换 token账号密码方式会在本项目登录页提交账号、密码和图形验证码由后端调用 `${AUTH_BASE}/oauth2/token` 的 password grant。两种方式都会通过 JWKS 本地验签 JWT然后写入 HttpOnly 会话 cookie。
认证中心客户端需要配置回调地址:
```text
https://你的域名/api/auth/callback
```
核心配置:
| 变量 | 说明 |
|------|------|
| `ZHINIAN_AUTH_REQUIRED` | `auto` 默认策略;生产启用,本地可信开发可设 `0` |
| `ZHINIAN_AUTH_BASE_URL` | 认证服务网关地址,例如 `https://<gateway-domain>/auth` |
| `ZHINIAN_AUTH_CLIENT_ID` | OAuth2 客户端 ID默认 `customPC` |
| `ZHINIAN_AUTH_CLIENT_SECRET` | OAuth2 客户端密钥,只能保存在服务端 |
| `ZHINIAN_AUTH_SCOPE` | 默认 `server` |
| `ZHINIAN_AUTH_ISSUER` | JWT issuer默认 `https://pig4cloud.com` |
| `ZHINIAN_AUTH_PASSWORD_ENC_KEY` | 按 AgentBus 方式对 password grant 的密码做 AES-CFB 加密;留空则透传明文 |
| `ZHINIAN_AUTH_SESSION_SECRET` | 本地会话签名密钥,使用长随机字符串 |
受保护范围包括 `/create``/assets``/settings`、第一方生成/资产 API以及本地 `/uploads/*``/generated-results/*` 文件。开放 `/api/v1/*` 仍使用 API KeyWorker 仍使用内部 token不走浏览器 SSO。
如果认证中心客户端没有加入 `security.ignore-clients`,账号密码登录会要求图形验证码;验证码图片由 `/api/auth/captcha` 代理 `${AUTH_BASE}/code/image` 获取。
## 引擎说明
### 图片生成
图片生成可在设置页按能力切换:
- `jimeng`:火山 Visual 即梦能力
- `evolink`EvoLink GPT Image 2 中转接口
### 图片编辑
- 局部重绘:即梦 inpainting 或 EvoLink inpaint
- 智能超清:即梦超清能力
### 视频生成
视频生成使用 Seedance 2.0。
当前参数限制已按官方接口收口:
- `duration``4``15` 的整数秒
- `duration=-1`:允许在环境变量或服务端归一化中表示模型自动选择
- `ratio``16:9``4:3``1:1``3:4``9:16``21:9``adaptive`
- `resolution``480p``720p``1080p`
- Seedance 2.0 fast 不支持 `1080p`
## 任务管理与开放 API
平台现在支持服务端任务管理:页面和开放 API 提交任务后只写入 `queued`,由 Worker 统一提交供应商、轮询状态、导入资产、重试和触发 Webhook。这个实现不是 Redis/BullMQ 消息队列,而是基于 `generation_jobs` 的任务状态机、锁和调度字段。
开放 API 使用 API Key
```env
ZHINIAN_API_KEYS=demo-agent:change-me-public-api-key
ZHINIAN_INTERNAL_WORKER_TOKEN=change-me-worker-token
```
调用示例:
```bash
curl -X POST http://127.0.0.1:3000/api/v1/jobs \
-H 'Authorization: Bearer change-me-public-api-key' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: demo-job-001' \
-d '{"capability":"image.generate","prompt":"生成一张专业产品主图"}'
```
主要接口:
| 接口 | 说明 |
|------|------|
| `GET /api/v1/capabilities` | 查询图片、修图、超清、视频能力 |
| `POST /api/v1/assets` | 上传文件或注册外部素材 URL |
| `GET /api/v1/assets` | 查询素材 |
| `POST /api/v1/jobs` | 创建生成任务 |
| `GET /api/v1/jobs` | 按状态、能力、时间分页查询任务 |
| `GET /api/v1/jobs/:id` | 查询单个任务 |
| `POST /api/v1/jobs/:id/cancel` | 取消未完成任务 |
| `GET /api/v1/openapi.json` | OpenAPI 描述 |
幂等规则:同一 API Client 使用同一个 `Idempotency-Key` 重复提交相同请求时返回已有任务;请求内容不同会返回 `409`
Webhook创建任务时传 `webhookUrl`,任务进入 `succeeded``failed``cancelled``expired` 后会回调。配置 `ZHINIAN_WEBHOOK_SECRET` 后,请求头会带 `X-Zhinian-Signature: sha256=...`
## 环境变量
复制 `.env.example` 后按需配置:
```bash
cp .env.example .env.local
```
核心变量:
| 变量 | 说明 |
|------|------|
| `APP_PORT` | Docker Compose 对外暴露端口,默认 `3000` |
| `NEXT_PUBLIC_APP_URL` | 对外访问地址,用于生成回调/本地文件 URL |
| `ZHINIAN_AUTH_REQUIRED` | 账户登录保护策略 |
| `ZHINIAN_AUTH_BASE_URL` | 统一认证中心地址 |
| `ZHINIAN_AUTH_CLIENT_ID` | OAuth2 客户端 ID |
| `ZHINIAN_AUTH_CLIENT_SECRET` | OAuth2 客户端密钥 |
| `ZHINIAN_AUTH_SESSION_SECRET` | 本地登录态签名密钥 |
| `ZHINIAN_API_KEYS` | 开放 API Key格式 `clientId:key,clientId2:key2` |
| `ZHINIAN_INTERNAL_WORKER_TOKEN` | 内部 Worker tick 接口令牌 |
| `ZHINIAN_WEBHOOK_SECRET` | Webhook 签名密钥,可选 |
| `ZHINIAN_WORKER_*` | Worker 间隔、批量、锁超时、重试配置 |
| `IMAGE_GENERATE_ENGINE` | 图片生成引擎:`jimeng``evolink` |
| `IMAGE_INPAINT_ENGINE` | 局部重绘引擎:`jimeng``evolink` |
| `VOLCENGINE_ACCESS_KEY_ID` | 火山引擎 Access Key |
| `VOLCENGINE_SECRET_ACCESS_KEY` | 火山引擎 Secret Key |
| `EVOLINK_API_KEY` | EvoLink API Key |
| `SEEDANCE_API_KEY` | 火山方舟 Seedance API Key |
| `SEEDANCE_MODEL` | Seedance 模型 ID |
| `SEEDANCE_RATIO` | 默认视频比例 |
| `SEEDANCE_DURATION` | 默认视频秒数 |
| `SEEDANCE_RESOLUTION` | 默认视频分辨率 |
| `ALI_OSS_*` | 上传素材和生成结果转存配置 |
| `NEXT_PUBLIC_SUPABASE_URL` | Supabase URL |
| `NEXT_PUBLIC_SUPABASE_ANON_KEY` | Supabase 匿名 Key |
| `SUPABASE_SERVICE_ROLE_KEY` | Supabase 服务端 Key |
未配置 Supabase 时,应用会使用 `.runtime/data/web-app-state.json` 作为本地开发数据层。未配置 OSS 时,上传和生成结果会写入 `.runtime/uploads``.runtime/generated-results`
## 项目结构
```text
app/ Next.js App Router 页面与 API
components/ 前端组件
lib/ 业务逻辑、服务端适配器、接口客户端
lib/ui/motion.ts GSAP 动效工具层
public/logo/ 品牌 Logo
scripts/ 启动、健康检查与信息脚本
supabase/schema.sql 数据库结构
tests/ Vitest 测试
Dockerfile Docker 镜像构建
docker-compose.yml 服务器部署编排
```
## 验证
推荐提交前执行:
```bash
npm test
npm run build
npm run health
npm run worker:once
```
如果本地 dev server 正在运行,建议先停止后再执行生产构建,避免 Next.js dev 缓存与生产构建互相影响。
## 注意事项
- `.env.local` 不应提交到仓库。
- `.next/``.runtime/``node_modules/` 不应提交到仓库。
- 当前主产品名为 `智念AIGC平台`
- 顶部 Logo 使用 `public/logo/zhinian-logo.png`