feat: auto-authorize policies when adding projects to sub-accounts
Project-level authorization: - Adding a project to a sub-account now auto-calls AttachPolicyInProject to grant default policies (ArkFullAccess, TOSFullAccess) in that project scope - Removing a project auto-calls DetachPolicyInProject to revoke those policies - Each project records which policies were attached (attached_policies field) so removal knows exactly what to revoke Configuration: - GlobalConfig.default_project_policies: configurable list of policies to auto-attach (editable in Settings page, defaults to ArkFullAccess + TOSFullAccess) IAM Service: - Added attach_policy_in_project() and detach_policy_in_project() methods using standard AttachUserPolicy/DetachUserPolicy with ProjectName parameter Frontend: - Projects dialog now shows "已授权策略" column with policy tags - Settings page has "项目默认授权策略" config field Alert logging: - Project add/remove operations are logged with attached/detached policy details Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
1e94241587
commit
5edf247a7f
692
Seedance 2.0 & 2.0 fast API文档(邀测用户版).md
Normal file
692
Seedance 2.0 & 2.0 fast API文档(邀测用户版).md
Normal file
@ -0,0 +1,692 @@
|
|||||||
|
# 【申请权限填客户名称】Seedance 2.0 & 2.0 fast API文档(邀测用户版)
|
||||||
|
|
||||||
|
该文档目前仅限开白客户使用,发送前请和销管确认客户是否在开白名单内
|
||||||
|
|
||||||
|
***【❗️❗️❗️】该文档限制客户申请权限,只有返回了服务协议的客户方可申请***
|
||||||
|
|
||||||
|
本文介绍 Seedance 2.0 & 2.0 fast 模型相较于存量模型 **新增/配置有区别 **的 API 参数介绍,存量 API 参数的完整介绍参见 [视频生成 API](https://www.volcengine.com/docs/82379/1520758?lang=zh)。
|
||||||
|
|
||||||
|
> 本文档仅限预览及邀测用户使用:
|
||||||
|
>
|
||||||
|
> * 不承诺正式API上线100%一致。
|
||||||
|
>
|
||||||
|
> * 仅限邀测用户阅读,请勿截图/分享给其他人员。
|
||||||
|
>
|
||||||
|
> * 您上传的内容请确保由您原创或已取得授权。
|
||||||
|
|
||||||
|
# 模型能力
|
||||||
|
|
||||||
|
> **Seedance 2.0 和 Seedance 2.0 fast 提供的模型能力一致,**追求最高生成品质,推荐使用 **Seedance 2.0**;更注重成本与生成速度,不要求极限品质,推荐使用 **Seedance 2.0 fast**。
|
||||||
|
|
||||||
|
**Seedance 2.0 & 2.0 fast (有声视频/无声视频)**
|
||||||
|
|
||||||
|
* **多模态参考生视频**:输入参考图片(0\~9)+参考视频(0\~3)+ 参考音频(0\~3)+ 文本提示词(可选)生成 1 个目标视频。支持生成全新视频、编辑视频、延长视频。
|
||||||
|
|
||||||
|
> **注意:不可单独输入音频,应至少包含 1 个参考视频或图片。**
|
||||||
|
|
||||||
|
* **图生视频-首尾帧**:输入首帧图片+尾帧图片+文本提示词(可选)生成 1 个目标视频。
|
||||||
|
|
||||||
|
* **图生视频-首帧**:输入首帧图片+文本提示词(可选)生成 1 个目标视频。
|
||||||
|
|
||||||
|
* **文生视频**:输入文本提示词生成 1 个目标视频。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
**模型能力对比表:**
|
||||||
|
|
||||||
|
| 模型名称 | | [Seedance 2.0](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-2-0) | [Seedance 2.0 fast](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-2-0-fast\&projectName=default) | [Seedance 1.5 pro](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-5-pro\&projectName=default) | [Seedance 1.0 pro ](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-0-pro\&projectName=default) | [Seedance 1.0 pro fast ](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-0-pro-fast\&projectName=default) | [Seedance 1.0 lite i2v](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-0-lite-i2v\&projectName=default) | [Seedance-1.0 lite t2v ](https://console.volcengine.com/ark/region:ark+cn-beijing/model/detail?Id=doubao-seedance-1-0-lite-t2v) |
|
||||||
|
| ------------ | -------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
|
| Model ID | | doubao-seedance-2-0-260128 | doubao-seedance-2-0-fast-260128 | doubao-seedance-1-5-pro-251215 | doubao-seedance-1-0-pro-250528 | doubao-seedance-1-0-pro-fast-251015 | doubao-seedance-1-0-lite-i2v-250428 | doubao-seedance-1-0-lite-t2v-250428 |
|
||||||
|
| 文生视频 | | ✅ | | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||||
|
| 图生视频-首帧 | | ✅ | | ✅ | ✅ | ✅ | ✅ | ❌ |
|
||||||
|
| 图生视频-首尾帧 | | ✅ | | ✅ | ✅ | ❌ | ✅ | ❌ |
|
||||||
|
| 多模态参考【New】 | 图片参考 | ✅ | | ❌ | ❌ | ❌ | ✅ | ❌ |
|
||||||
|
| | 视频参考 | ✅ | | ❌ | ❌ | ❌ | ❌ | ❌ |
|
||||||
|
| | 组合参考 | ✅ | | ❌ | ❌ | ❌ | ❌ | ❌ |
|
||||||
|
| 编辑视频【New】 | | ✅ | | ❌ | ❌ | ❌ | ❌ | ❌ |
|
||||||
|
| 延长视频【New】 | | ✅ | | ❌ | ❌ | ❌ | ❌ | ❌ |
|
||||||
|
| 生成有声视频 | | ✅ | | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||||
|
| 联网搜索增强【New】 | | ✅ | | ❌ | [❌](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc) | ❌ | ❌ | ❌ |
|
||||||
|
| 样片模式 | | ❌ | | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||||
|
| 返回视频尾帧 | | ✅ | | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||||
|
| 输出视频规格 | 输出分辨率 | 480p, 720p | | 480p, 720p, 1080p | 480p, 720p, 1080p | 480p, 720p, 1080p | 480p, 720p, 1080p | 480p, 720p, 1080p |
|
||||||
|
| | 输出宽高比 | 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | | | | | | |
|
||||||
|
| | 输出时长 | 4\~15 秒 | | 4\~12 秒 | 2\~12 秒 | 2\~12 秒 | 2\~12 秒 | 2\~12 秒 |
|
||||||
|
| | 输出视频格式 | mp4 | | mp4 | mp4 | mp4 | mp4 | mp4 |
|
||||||
|
| 离线推理 | | [❌](https://p9-arcosite.byteimg.com/obj/tos-cn-i-goo7wpa0wc/f359753773c94d97885008ca1223c9bc) | | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||||
|
| 在线推理限流 | RPM | 600 | | 600 | 600 | 600 | 300 | 300 |
|
||||||
|
| | 并发数 | 10 | | 10 | 10 | 10 | 5 | 5 |
|
||||||
|
| 离线推理限流 | TPD | - | | 5000亿 | 5000亿 | 5000亿 | 2500亿 | 2500亿 |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Creat-创建视频生成任务
|
||||||
|
|
||||||
|
> POST https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks
|
||||||
|
|
||||||
|
## 请求参数
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### **content** `object[]` `必选`
|
||||||
|
|
||||||
|
输入给模型,生成视频的信息,支持文本、图片、音频、视频、样片任务 ID。支持以下几种组合:
|
||||||
|
|
||||||
|
* **文本**
|
||||||
|
|
||||||
|
* **文本(可选)+ 图片**
|
||||||
|
|
||||||
|
* **文本(可选)+ 视频**
|
||||||
|
|
||||||
|
* **文本(可选)+ 图片 + 音频**
|
||||||
|
|
||||||
|
* **文本(可选)+ 图片 + 视频**
|
||||||
|
|
||||||
|
* **文本(可选)+ 视频 + 音频**
|
||||||
|
|
||||||
|
* **文本(可选)+ 图片 + 视频 + 音频**
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
**信息类型:**
|
||||||
|
|
||||||
|
* **文本信息**`object`
|
||||||
|
|
||||||
|
输入给模型的提示词信息。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.**type **`string` `必选`
|
||||||
|
|
||||||
|
输入内容的类型,此处应为 **text**。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.**text **`string` `必选`
|
||||||
|
|
||||||
|
输入给模型的文本提示词,描述期望生成的视频。
|
||||||
|
|
||||||
|
支持中英文。建议中文不超过500字,英文不超过1000词。字数过多信息容易分散,模型可能因此忽略细节,只关注重点,造成视频缺失部分元素。提示词的更多使用技巧请参见 [Seedance 提示词指南](https://www.volcengine.com/docs/82379/1587797)。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
* **图片信息** `object`
|
||||||
|
|
||||||
|
输入给模型的图片信息。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.**type **`string` `必选`
|
||||||
|
|
||||||
|
输入内容的类型,此处应为 **image\_url**。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.**image\_url **`object` `必选`
|
||||||
|
|
||||||
|
输入给模型的图片对象。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.image\_url.**url **`string` `必选`
|
||||||
|
|
||||||
|
图片 URL 、图片 Base64 编码、素材 ID。
|
||||||
|
|
||||||
|
* 图片 URL:填入图片的公网 URL。
|
||||||
|
|
||||||
|
* Base64 编码:将本地文件转换为 Base64 编码字符串,然后提交给大模型。遵循格式:data:image/<图片格式>;base64,\<Base64编码>,注意 <图片格式> 需小写,如 data:image/png;base64,{base64\_image}。
|
||||||
|
|
||||||
|
* 素材 ID:用于视频生成的预置素材及虚拟人像的 ID,遵循格式:asset://\<ASSET\_ID>,可从 [素材&虚拟人像库](https://console.volcengine.com/ark-stg/region:ark-stg+cn-beijing/experience/vision?modelId=doubao-seedance-2-0-260128) 获取,详细使用请参见[文档](https://www.volcengine.com/docs/82379/2223965?lang=zh)。
|
||||||
|
|
||||||
|
> **传入单张图片要求**
|
||||||
|
>
|
||||||
|
> * 格式:jpeg、png、webp、bmp、tiff、gif
|
||||||
|
>
|
||||||
|
> * 宽高比(宽/高): (0.4, 2.5) 
|
||||||
|
>
|
||||||
|
> * 宽高长度(px):(300, 6000)
|
||||||
|
>
|
||||||
|
> * 大小:单张图片小于 30 MB。请求体大小不超过 64 MB。大文件请勿使用Base64编码。
|
||||||
|
>
|
||||||
|
> * 图片数量:
|
||||||
|
>
|
||||||
|
> * 图生视频-首帧:1 张
|
||||||
|
>
|
||||||
|
> * 图生视频-首尾帧:2 张
|
||||||
|
>
|
||||||
|
> * Seedance 2.0 & 2.0 fast 多模态参考生视频:1\~9 张
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.**role **`string` `条件必填`
|
||||||
|
|
||||||
|
图片的位置或用途。
|
||||||
|
|
||||||
|
> **注意**
|
||||||
|
>
|
||||||
|
> * **图生视频-首帧**、**图生视频-首尾帧**、**多模态参考生视频**(包括参考图、视频、音频)为 3 种互斥场景,**不可混用**。
|
||||||
|
>
|
||||||
|
> * **多模态参考生视频**可通过提示词指定参考图片作为首帧/尾帧,间接实现“首尾帧+多模态参考”效果。若需严格保障首尾帧和指定图片一致,**优先使用图生视频-首尾帧**(配置 role 为 **first\_frame / last\_frame**)。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
**图生视频-首帧**
|
||||||
|
|
||||||
|
> 需要传入1个 image\_url 对象
|
||||||
|
|
||||||
|
* **字段role取值:**
|
||||||
|
|
||||||
|
* **first\_frame 或不填**
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
**图生视频-首尾帧**
|
||||||
|
|
||||||
|
> 需要传入2个 image\_url 对象
|
||||||
|
|
||||||
|
* **字段role取值:**
|
||||||
|
|
||||||
|
* 首帧图片对应的字段 role 为:**first\_frame**,必填
|
||||||
|
|
||||||
|
* 尾帧图片对应的字段 role 为:**last\_frame**,必填
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
**图生视频-参考图 **
|
||||||
|
|
||||||
|
> 可传入 1\~9 个 image\_url 对象
|
||||||
|
|
||||||
|
* **字段role取值**:
|
||||||
|
|
||||||
|
* 每张参考图对应的字段 role 均为:**reference\_image**,必填
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
* **视频信息** `object` 
|
||||||
|
|
||||||
|
输入给模型的视频信息。仅 Seedance 2.0 & 2.0 fast 支持输入视频。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.**type **`string` `必选`
|
||||||
|
|
||||||
|
输入内容的类型,此处应为 **video\_url**。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.**video\_url **`object` `必选`
|
||||||
|
|
||||||
|
输入给模型的视频对象。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.video\_url.**url **`string` `必选`
|
||||||
|
|
||||||
|
视频URL、素材 ID。
|
||||||
|
|
||||||
|
* 视频 URL:填入视频的公网 URL。
|
||||||
|
|
||||||
|
* 素材 ID:用于视频生成的预置素材及虚拟人像视频的 ID,遵循格式:asset://\<ASSET\_ID>。可从[素材&虚拟人像库](https://console.volcengine.com/ark-stg/region:ark-stg+cn-beijing/experience/vision?modelId=doubao-seedance-2-0-260128)获取。
|
||||||
|
|
||||||
|
> **传入单个视频要求**
|
||||||
|
>
|
||||||
|
> * 视频格式:mp4、mov。
|
||||||
|
>
|
||||||
|
> * 分辨率:480p、720p
|
||||||
|
>
|
||||||
|
> * 时长:单个视频时长 \[2, 15] s,最多传入 3 个参考视频,所有视频总时长不超过 15s。
|
||||||
|
>
|
||||||
|
> * 尺寸:
|
||||||
|
>
|
||||||
|
> * 宽高比(宽/高):\[0.4, 2.5]
|
||||||
|
>
|
||||||
|
> * 宽高长度(px):\[300, 6000]
|
||||||
|
>
|
||||||
|
> * 画面像素(宽 × 高):\[409600, 927408] ,示例:
|
||||||
|
>
|
||||||
|
> * 画面尺寸 640×640=409600 满足最小值 ;
|
||||||
|
>
|
||||||
|
> * 画面尺寸 834×1112=927408 满足最大值。
|
||||||
|
>
|
||||||
|
> * 大小:单个视频不超过 50 MB。
|
||||||
|
>
|
||||||
|
> * 帧率 (FPS):\[24, 60] 
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.**role **`string` `条件必填`
|
||||||
|
|
||||||
|
视频的位置或用途。当前仅支持 **reference\_video**。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
* **音频信息 **`object` 
|
||||||
|
|
||||||
|
输入给模型的音频信息。仅 Seedance 2.0 & 2.0 fast 支持输入音频。注意不可单独输入音频,应至少包含 1 个参考视频或图片。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.**type **`string` `必选`
|
||||||
|
|
||||||
|
输入内容的类型,此处应为 **audio\_url**。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.**audio\_url **`object` `必选`
|
||||||
|
|
||||||
|
输入给模型的音频对象。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.audio\_url.**url **`string` `必选`
|
||||||
|
|
||||||
|
音频 URL 、音频 Base64 编码、素材 ID。
|
||||||
|
|
||||||
|
* 音频 URL:填入音频的公网 URL。
|
||||||
|
|
||||||
|
* Base64 编码:将本地文件转换为 Base64 编码字符串,然后提交给大模型。遵循格式:data:audio/<音频格式>;base64,\<Base64编码>,注意 <音频格式> 需小写,如 data:audio/wav;base64,{base64\_audio}。
|
||||||
|
|
||||||
|
* 素材 ID:用于视频生成的虚拟人的音频素材 ID,遵循格式:asset://\<ASSET\_ID>。可从[素材&虚拟人像库](https://console.volcengine.com/ark-stg/region:ark-stg+cn-beijing/experience/vision?modelId=doubao-seedance-2-0-260128)获取。
|
||||||
|
|
||||||
|
> **传入单个音频要求**
|
||||||
|
>
|
||||||
|
> * 格式:wav、mp3
|
||||||
|
>
|
||||||
|
> * 时长:单个音频时长 \[2, 15] s,最多传入 3 段参考音频,所有音频总时长不超过 15 s。
|
||||||
|
>
|
||||||
|
> * 大小:单个音频不超过 15 MB,请求体大小不超过 64 MB。大文件请勿使用Base64编码。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
content.**role **`string` `条件必填`
|
||||||
|
|
||||||
|
音频的位置或用途。当前仅支持 **reference\_audio** 。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### **service\_tier** `string`
|
||||||
|
|
||||||
|
 Seedance 2.0 & 2.0 fast 暂不支持
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### **generate\_audio **`boolean` 
|
||||||
|
|
||||||
|
> Seedance 2.0 & 2.0 fast 默认值: true
|
||||||
|
|
||||||
|
控制生成的视频是否包含与画面同步的声音。
|
||||||
|
|
||||||
|
* true:模型输出的视频包含同步音频。模型会基于文本提示词与视觉内容,自动生成与之匹配的人声、音效及背景音乐。建议将对话部分置于双引号内,以优化音频生成效果。例如:男人叫住女人说:“你记住,以后不可以用手指指月亮。”
|
||||||
|
|
||||||
|
* false:模型输出的视频为无声视频。
|
||||||
|
|
||||||
|
> **说明**
|
||||||
|
>
|
||||||
|
> 生成的有声视频均为单声道,和传入的音频声道数无关。
|
||||||
|
|
||||||
|
####
|
||||||
|
|
||||||
|
#### **draft **`boolean`
|
||||||
|
|
||||||
|
 Seedance 2.0 & 2.0 fast 暂不支持
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### **tools **`object[]`
|
||||||
|
|
||||||
|
> 仅 Seedance 2.0 & 2.0 fast 支持
|
||||||
|
|
||||||
|
配置模型要调用的工具。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
tools.**type **`string`
|
||||||
|
|
||||||
|
指定使用的工具类型。
|
||||||
|
|
||||||
|
* web\_search:联网搜索工具。
|
||||||
|
|
||||||
|
> **说明**
|
||||||
|
>
|
||||||
|
> * 开启联网搜索后,模型会根据用户的提示词自主判断是否搜索互联网内容(如商品、天气等)。可提升生成视频的时效性,但也会增加一定的时延。
|
||||||
|
>
|
||||||
|
> * 实际搜索次数可通过 [查询视频生成任务 API](https://www.volcengine.com/docs/82379/1521309?lang=zh) 返回的 usage.tool\_usage.**web\_search** 字段获取,如果为 0 表示未搜索。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### **resolution ** `string`
|
||||||
|
|
||||||
|
> Seedance 2.0 & 2.0 fast 默认值:720p
|
||||||
|
|
||||||
|
视频分辨率,取值范围:
|
||||||
|
|
||||||
|
* 480p
|
||||||
|
|
||||||
|
* 720p
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### **ratio **`string` 
|
||||||
|
|
||||||
|
> Seedance 2.0 & 2.0 fast 默认值: adaptive
|
||||||
|
|
||||||
|
生成视频的宽高比例。不同宽高比对应的宽高像素值见下方表格。
|
||||||
|
|
||||||
|
* 16:9 
|
||||||
|
|
||||||
|
* 4:3
|
||||||
|
|
||||||
|
* 1:1
|
||||||
|
|
||||||
|
* 3:4
|
||||||
|
|
||||||
|
* 9:16
|
||||||
|
|
||||||
|
* 21:9
|
||||||
|
|
||||||
|
* adaptive:根据输入自动选择最合适的宽高比
|
||||||
|
|
||||||
|
> **adaptive 适配规则**
|
||||||
|
>
|
||||||
|
> 当配置 **ratio** 为 adaptive 时,模型会根据生成场景自动适配宽高比;实际生成的视频宽高比可通过 [查询视频生成任务 API](https://www.volcengine.com/docs/82379/1521309?lang=zh) 返回的 **ratio** 字段获取。
|
||||||
|
>
|
||||||
|
> * 文生视频:根据输入的提示词,智能选择最合适的宽高比。
|
||||||
|
>
|
||||||
|
> * 首帧 / 首尾帧生视频:根据上传的首帧图片比例,自动选择最接近的宽高比。
|
||||||
|
>
|
||||||
|
> * 多模态参考生视频:根据用户提示词意图判断,如果是首帧生视频/编辑视频/延长视频,以该图片/视频为准选择最接近的宽高比;否则,以传入的第一个媒体文件为准(优先级:视频>图片)选择最接近的宽高比。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
**不同宽高比对应的宽高像素值:**
|
||||||
|
|
||||||
|
| 分辨率 | 宽高比 | 宽高像素值 |
|
||||||
|
| ---- | ---- | -------- |
|
||||||
|
| 480p | 16:9 | 864×496 |
|
||||||
|
| | 4:3 | 752×560 |
|
||||||
|
| | 1:1 | 640×640 |
|
||||||
|
| | 3:4 | 560×752 |
|
||||||
|
| | 9:16 | 496×864 |
|
||||||
|
| | 21:9 | 992×432 |
|
||||||
|
| 720p | 16:9 | 1280×720 |
|
||||||
|
| | 4:3 | 1112×834 |
|
||||||
|
| | 1:1 | 960×960 |
|
||||||
|
| | 3:4 | 834×1112 |
|
||||||
|
| | 9:16 | 720×1280 |
|
||||||
|
| | 21:9 | 1470×630 |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### **duration** `integer` 
|
||||||
|
|
||||||
|
> Seedance 2.0 & 2.0 fast 默认值:5
|
||||||
|
|
||||||
|
生成视频时长,仅支持整数,单位:秒。
|
||||||
|
|
||||||
|
取值范围:
|
||||||
|
|
||||||
|
* \[4,15] 或设置为-1
|
||||||
|
|
||||||
|
> **配置方法**
|
||||||
|
>
|
||||||
|
> * 指定具体时长:支持有效范围内的任一整数。
|
||||||
|
>
|
||||||
|
> * 智能指定:设置为 -1,表示由模型在有效范围内自主选择合适的视频长度(整数秒)。实际生成视频的时长可通过 [查询视频生成任务 API](https://www.volcengine.com/docs/82379/1521309?lang=zh) 返回的 **duration** 字段获取。注意视频时长与计费相关,请谨慎设置。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### **frames** `integer` 
|
||||||
|
|
||||||
|
Seedance 2.0 & 2.0 fast 暂不支持
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### **camera\_fixed** `boolean`
|
||||||
|
|
||||||
|
 Seedance 2.0 & 2.0 fast 暂不支持
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Get/List-查询视频生成任务/列表
|
||||||
|
|
||||||
|
> 查询视频生成任务:GET https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks/{id}
|
||||||
|
>
|
||||||
|
> 查询视频生成任务列表:GET https://ark.cn-beijing.volces.com/api/v3/contents/generations/tasks?page\_num={page\_num}\&page\_size={page\_size}\&filter.status={filter.status}\&filter.task\_ids={filter.task\_ids}\&filter.model={filter.model}
|
||||||
|
|
||||||
|
## 响应参数
|
||||||
|
|
||||||
|
#### **tools **`object[]` 
|
||||||
|
|
||||||
|
> 仅 Seedance 2.0 & 2.0 fast 支持
|
||||||
|
|
||||||
|
配置模型要调用的工具。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
tools.**type **`string`
|
||||||
|
|
||||||
|
指定使用的工具类型。
|
||||||
|
|
||||||
|
* web\_search:联网搜索工具。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#### **usage** `object`
|
||||||
|
|
||||||
|
本次请求的 token 用量。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
usage.**completion\_tokens** `integer`
|
||||||
|
|
||||||
|
模型输出视频花费的 token 数量。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
usage.**total\_tokens** `integer`
|
||||||
|
|
||||||
|
本次请求消耗的总 token 数量。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
usage.**tool\_usage **`object` 
|
||||||
|
|
||||||
|
> 仅 Seedance 2.0 & 2.0 fast 支持
|
||||||
|
|
||||||
|
使用工具的用量信息。
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
usage.tool\_usage.**web\_search **`integer` 
|
||||||
|
|
||||||
|
实际调用联网搜索工具的次数,仅开启联网搜索时返回。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 调用简介及示例
|
||||||
|
|
||||||
|
## 流程简介
|
||||||
|
|
||||||
|
任务接口是异步接口,视频生成任务流程
|
||||||
|
|
||||||
|
1. 创建视频生成任务接口创建视频生成任务
|
||||||
|
|
||||||
|
2. 定时使用查询接口查询视频生成任务状态
|
||||||
|
|
||||||
|
1. 任务 running,过段时间再查询任务状态
|
||||||
|
|
||||||
|
2. 任务完成,返回视频链接,在24小时内下载生成的视频文件
|
||||||
|
|
||||||
|
## 1. 创建视频生成任务
|
||||||
|
|
||||||
|
> 以下示例仅展示 Seedance 2.0 & 2.0 fast 新增能力,更多视频生成示例详见 [创建视频生成任务 API](https://www.volcengine.com/docs/82379/1520757)。
|
||||||
|
|
||||||
|
### 多模态参考
|
||||||
|
|
||||||
|
### 编辑视频
|
||||||
|
|
||||||
|
### 延长视频
|
||||||
|
|
||||||
|
### 使用联网搜索
|
||||||
|
|
||||||
|
仅支持文本生视频
|
||||||
|
|
||||||
|
## 2. 查询视频生成任务
|
||||||
|
|
||||||
|
# 最佳实践-使用公共虚拟人像生成视频
|
||||||
|
|
||||||
|
平台提供公共虚拟人像素材库,目前您可以使用其中的图像素材来创建一个统一、完备的视频主角。帮助您更好地控制主角,并确保其形象在多段视频中保持一致,避免因为真人人脸限制导致角色无法统一的问题。
|
||||||
|
|
||||||
|
素材模态目前包含图片,并提供人物背景描述。每个素材对应一个独立素材 ID (asset ID),在体验中心的视频生成任务中,指定角色人脸生成视频。
|
||||||
|
|
||||||
|
1. 在浏览器中打开[体验中心](https://console.volcengine.com/ark/region:ark+cn-beijing/experience/vision?modelId=doubao-seedance-2-0-260128\&tab=GenVideo),点击输入框下方的 **虚拟人像库** 页签。
|
||||||
|
|
||||||
|
2. 检索需要使用的人像,支持使用自然语言检索及筛选框组合筛选。
|
||||||
|
|
||||||
|
| 输入:文本 | 输入:虚拟人像、图片 | 输出 |
|
||||||
|
| ---------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -- |
|
||||||
|
| **图片1**中美妆博主用中文进行介绍,妆容改为明艳大气,去掉脸部反光,笑容甜美,近景镜头,手持**图片2**的面霜面向镜头展示,清新简约背景,元气甜美风格。博主台词:挖到本命面霜了!质地像云朵一样软糯,一抹就吸收,熬夜急救、补水保湿全搞定,素颜都自带柔光感。 |  | |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
在 [Video Generation API](https://www.volcengine.com/docs/82379/1520758) 的 **content.<模态>\_url.url** 字段中使用 素材 URI 生成视频。
|
||||||
|
|
||||||
|
> 输入的参考内容,包括人像素材,需符合视频生成限制,具体信息请查看使用限制。
|
||||||
|
>
|
||||||
|
> **注意**:
|
||||||
|
>
|
||||||
|
> * 首次在 API 中使用虚拟人像素材 Asset URI 前,需先在[方舟体验中心](https://console.volcengine.com/ark/region:ark+cn-beijing/experience/vision?modelId=doubao-seedance-2-0-260128\&tab=GenVideo)提交一次视频生成任务,阅读并同意弹出的 **虚拟人像库使用协议**。
|
||||||
|
>
|
||||||
|
> * 体验中心支持体验视频生成能力。默认单次生成 4 段视频,为节约成本,建议设置为每次生成 1 条,具体方式可参考[虚拟人像库](https://www.volcengine.com/docs/82379/2223965?lang=zh)。
|
||||||
|
|
||||||
|
同意协议的操作方式如下:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
示例代码:
|
||||||
|
|
||||||
|
# 使用自有虚拟人像素材生成视频(线下提交)
|
||||||
|
|
||||||
|
方舟提供私域人像素材库,您可在视频生成中使用自有虚拟人物或真人(仅限素人)素材,生成短剧等更定制化的视频内容。平台将对您提供的素材进行审核,规避可能产生的法律风险。
|
||||||
|
|
||||||
|
* 自有素材需入库后使用,您可将虚拟人像或真人素材发送给销售代表,同时完成合规承诺函及其他证明材料的准备。
|
||||||
|
|
||||||
|
* 入库后,您可使用素材的 Asset ID,在视频生成 API 中使用自有素材。
|
||||||
|
|
||||||
|
> **重要**:
|
||||||
|
>
|
||||||
|
> * 对虚拟人像素材,您需签署虚拟人像素材合规承诺函,并提供签署承诺函所需的材料。
|
||||||
|
>
|
||||||
|
> * 对真实人物素材,除承诺函外,您还需额外提供真人授权材料。
|
||||||
|
>
|
||||||
|
> * 具体流程及所需材料,请和您的销售代表确认。
|
||||||
|
|
||||||
|
提交自有人像素材时,需按人物将素材分组:
|
||||||
|
|
||||||
|
* 每个人物为一个素材组。
|
||||||
|
|
||||||
|
* 每组可包含多个素材文件,素材文件对应唯一 ID (asset ID)。
|
||||||
|
|
||||||
|
## 入库流程
|
||||||
|
|
||||||
|
提交自有虚拟人像素材方式大致如下,请联系您的销售代表了解详情。
|
||||||
|
|
||||||
|
1. 准备素材文件,完成承诺函签署,并准备其他证明材料。
|
||||||
|
|
||||||
|
2. 准备素材文件,完成承诺函签署,并准备其他证明材料。
|
||||||
|
|
||||||
|
* 每个人物素材需至少提供一张正面图片文件。此外,您可按需提供该人物的其他图片、视频素材。
|
||||||
|
|
||||||
|
* 需确保每个人物组中的素材与该正面图片为同一人物。
|
||||||
|
|
||||||
|
* 每个人物创建一个文件夹(命名:“*虚拟人像 1-<人像名>*”)
|
||||||
|
|
||||||
|
提交素材文件夹示例:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> **注意**:
|
||||||
|
>
|
||||||
|
> * 以上示例仅供参考,您可根据视频创作需求,提交虚拟人物素材。
|
||||||
|
>
|
||||||
|
> * 您仅需上传视频生成任务中需要使用的素材。
|
||||||
|
|
||||||
|
* 素材文件需满足视频生成 API 对输入文件的要求:
|
||||||
|
|
||||||
|
> **传入单张图片要求**
|
||||||
|
>
|
||||||
|
> * 格式:jpeg、png、webp、bmp、tiff、gif
|
||||||
|
>
|
||||||
|
> * 宽高比(宽/高): (0.4, 2.5) 
|
||||||
|
>
|
||||||
|
> * 宽高长度(px):(300, 6000)
|
||||||
|
>
|
||||||
|
> * 大小:单张图片小于 30 MB。请求体大小不超过 64 MB。大文件请勿使用Base64编码。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
> **传入单个视频要求**
|
||||||
|
>
|
||||||
|
> * 视频格式:mp4、mov。
|
||||||
|
>
|
||||||
|
> * 分辨率:480p、720p
|
||||||
|
>
|
||||||
|
> * 时长:单个视频时长 \[2, 15] s,最多传入 3 个参考视频,所有视频总时长不超过 15s。
|
||||||
|
>
|
||||||
|
> * 尺寸:
|
||||||
|
>
|
||||||
|
> * 宽高比(宽/高):\[0.4, 2.5]
|
||||||
|
>
|
||||||
|
> * 宽高长度(px):\[300, 6000]
|
||||||
|
>
|
||||||
|
> * 画面像素(宽 × 高):\[409600, 927408] ,示例:
|
||||||
|
>
|
||||||
|
> * 画面尺寸 640×640=409600 满足最小值 ;
|
||||||
|
>
|
||||||
|
> * 画面尺寸 834×1112=927408 满足最大值。
|
||||||
|
>
|
||||||
|
> * 大小:单个视频不超过 50 MB。
|
||||||
|
>
|
||||||
|
> * 帧率 (FPS):\[24, 60] 
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
> **注意**:
|
||||||
|
>
|
||||||
|
> 有关提交流程、承诺函签署所需材料的具体信息,请联系您的销售代表了解详情。
|
||||||
|
|
||||||
|
3. 方舟将对您提供的素材进行审核,通过审核的素材将被上传至虚拟人像库。
|
||||||
|
|
||||||
|
4. 入库后,每个人物组素材将通过以下示例中的形式返回,您可解压后查看:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
示例中:
|
||||||
|
|
||||||
|
* Andy 为您提交的人物名称
|
||||||
|
|
||||||
|
* group-20260310035119-9mzqn 为该人物组的 ID
|
||||||
|
|
||||||
|
* 解压后,可查看每张素材的 Asset ID,如:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* 您可按 `asset: //<asset_id>` 规则拼接 URI,在 API 中使用对应素材生成视频:
|
||||||
|
|
||||||
|
具体调用方式请参考 [最佳实践-使用虚拟人像生成视频](https://bytedance.larkoffice.com/wiki/SANpwJ9bgiKgrykLaMTcAB0InWc#share-YurKdrLfAocLErxsTWDcKidPnGd)。
|
||||||
|
|
||||||
|
## **注意事项**
|
||||||
|
|
||||||
|
1. 首次在 API 中使用虚拟人像素材 Asset URI 前,需先在[方舟体验中心](https://console.volcengine.com/ark/region:ark+cn-beijing/experience/vision?modelId=doubao-seedance-2-0-260128\&tab=GenVideo)提交一次视频生成任务,阅读并同意弹出的 **虚拟人像库使用协议**,操作方式如下:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* 仅支持使用已入库素材生成视频。
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
# Generated by Django 4.2.21 on 2026-03-19 15:23
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('monitor', '0004_alter_spendingrecord_unique_together_and_more'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='globalconfig',
|
||||||
|
name='default_project_policies',
|
||||||
|
field=models.JSONField(blank=True, default=list, help_text='如 ["ArkFullAccess", "TOSFullAccess"]', verbose_name='添加项目时自动授权的策略'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='iamuserproject',
|
||||||
|
name='attached_policies',
|
||||||
|
field=models.JSONField(blank=True, default=list, help_text='添加项目时自动附加的策略名列表,移除时自动回收', verbose_name='已授权的策略列表'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@ -96,6 +96,8 @@ class IAMUserProject(models.Model):
|
|||||||
monitor_enabled = models.BooleanField('启用监测', default=True)
|
monitor_enabled = models.BooleanField('启用监测', default=True)
|
||||||
current_spending = models.DecimalField('当前消费(元)', max_digits=12, decimal_places=2, default=0,
|
current_spending = models.DecimalField('当前消费(元)', max_digits=12, decimal_places=2, default=0,
|
||||||
help_text='此项目的累计消费,由定时任务更新')
|
help_text='此项目的累计消费,由定时任务更新')
|
||||||
|
attached_policies = models.JSONField('已授权的策略列表', default=list, blank=True,
|
||||||
|
help_text='添加项目时自动附加的策略名列表,移除时自动回收')
|
||||||
created_at = models.DateTimeField(auto_now_add=True)
|
created_at = models.DateTimeField(auto_now_add=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
@ -133,6 +135,8 @@ class GlobalConfig(models.Model):
|
|||||||
"""全局配置(单例)"""
|
"""全局配置(单例)"""
|
||||||
default_alert_thresholds = models.JSONField('默认告警阈值(百分比列表)', default=list, blank=True,
|
default_alert_thresholds = models.JSONField('默认告警阈值(百分比列表)', default=list, blank=True,
|
||||||
help_text='如 [50, 80, 90]')
|
help_text='如 [50, 80, 90]')
|
||||||
|
default_project_policies = models.JSONField('添加项目时自动授权的策略', default=list, blank=True,
|
||||||
|
help_text='如 ["ArkFullAccess", "TOSFullAccess"]')
|
||||||
monitor_interval_seconds = models.IntegerField('监控间隔(秒)', default=3600)
|
monitor_interval_seconds = models.IntegerField('监控间隔(秒)', default=3600)
|
||||||
feishu_webhook_url = models.URLField('飞书 Webhook URL', max_length=500, blank=True)
|
feishu_webhook_url = models.URLField('飞书 Webhook URL', max_length=500, blank=True)
|
||||||
feishu_alert_mobiles = models.CharField('飞书通知手机号(逗号分隔)', max_length=500, blank=True)
|
feishu_alert_mobiles = models.CharField('飞书通知手机号(逗号分隔)', max_length=500, blank=True)
|
||||||
|
|||||||
@ -19,8 +19,8 @@ class IAMUserProjectSerializer(serializers.ModelSerializer):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = IAMUserProject
|
model = IAMUserProject
|
||||||
fields = ['id', 'project_name', 'display_name', 'monitor_enabled',
|
fields = ['id', 'project_name', 'display_name', 'monitor_enabled',
|
||||||
'current_spending', 'created_at']
|
'current_spending', 'attached_policies', 'created_at']
|
||||||
read_only_fields = ['current_spending', 'created_at']
|
read_only_fields = ['current_spending', 'attached_policies', 'created_at']
|
||||||
|
|
||||||
|
|
||||||
class IAMUserSerializer(serializers.ModelSerializer):
|
class IAMUserSerializer(serializers.ModelSerializer):
|
||||||
@ -111,6 +111,7 @@ class GlobalConfigSerializer(serializers.ModelSerializer):
|
|||||||
model = GlobalConfig
|
model = GlobalConfig
|
||||||
fields = [
|
fields = [
|
||||||
'default_alert_thresholds',
|
'default_alert_thresholds',
|
||||||
|
'default_project_policies',
|
||||||
'monitor_interval_seconds',
|
'monitor_interval_seconds',
|
||||||
'feishu_webhook_url', 'feishu_alert_mobiles',
|
'feishu_webhook_url', 'feishu_alert_mobiles',
|
||||||
'updated_at',
|
'updated_at',
|
||||||
|
|||||||
@ -524,7 +524,7 @@ def iam_user_project_list_view(request, pk):
|
|||||||
|
|
||||||
@api_view(['POST'])
|
@api_view(['POST'])
|
||||||
def iam_user_project_add_view(request, pk):
|
def iam_user_project_add_view(request, pk):
|
||||||
"""给子账号添加关联项目"""
|
"""给子账号添加关联项目:加入监测 + 自动在项目范围内授权"""
|
||||||
try:
|
try:
|
||||||
user = IAMUser.objects.get(pk=pk)
|
user = IAMUser.objects.get(pk=pk)
|
||||||
except IAMUser.DoesNotExist:
|
except IAMUser.DoesNotExist:
|
||||||
@ -546,10 +546,41 @@ def iam_user_project_add_view(request, pk):
|
|||||||
return Response({'error': 'duplicate', 'message': f'项目 {d["project_name"]} 已关联'},
|
return Response({'error': 'duplicate', 'message': f'项目 {d["project_name"]} 已关联'},
|
||||||
status=status.HTTP_409_CONFLICT)
|
status=status.HTTP_409_CONFLICT)
|
||||||
|
|
||||||
return Response({
|
# 自动在项目范围内授权默认策略
|
||||||
|
account, ak, sk = _get_volc_account(user.volc_account_id)
|
||||||
|
attached = []
|
||||||
|
auth_errors = []
|
||||||
|
if ak:
|
||||||
|
svc = IAMService(ak, sk)
|
||||||
|
config = GlobalConfig.get_solo()
|
||||||
|
policies = config.default_project_policies or ['ArkFullAccess', 'TOSFullAccess']
|
||||||
|
for policy_name in policies:
|
||||||
|
try:
|
||||||
|
svc.attach_policy_in_project(user.username, policy_name,
|
||||||
|
d['project_name'])
|
||||||
|
attached.append(policy_name)
|
||||||
|
except VolcengineAPIError as e:
|
||||||
|
auth_errors.append(f"{policy_name}: {e}")
|
||||||
|
|
||||||
|
obj.attached_policies = attached
|
||||||
|
obj.save(update_fields=['attached_policies'])
|
||||||
|
|
||||||
|
AlertRecord.objects.create(
|
||||||
|
iam_user=user,
|
||||||
|
alert_type=AlertRecord.AlertType.MANUAL,
|
||||||
|
title=f"添加项目 {d['project_name']} → {user.username}",
|
||||||
|
content=f"操作人: {request.user.username},已授权策略: {attached}"
|
||||||
|
+ (f",授权失败: {auth_errors}" if auth_errors else ""),
|
||||||
|
)
|
||||||
|
|
||||||
|
result = {
|
||||||
'message': f'已关联项目 {d["project_name"]}',
|
'message': f'已关联项目 {d["project_name"]}',
|
||||||
'project': IAMUserProjectSerializer(obj).data,
|
'project': IAMUserProjectSerializer(obj).data,
|
||||||
}, status=status.HTTP_201_CREATED)
|
'attached_policies': attached,
|
||||||
|
}
|
||||||
|
if auth_errors:
|
||||||
|
result['auth_errors'] = auth_errors
|
||||||
|
return Response(result, status=status.HTTP_201_CREATED)
|
||||||
|
|
||||||
|
|
||||||
@api_view(['PUT'])
|
@api_view(['PUT'])
|
||||||
@ -569,15 +600,42 @@ def iam_user_project_update_view(request, pk, pid):
|
|||||||
|
|
||||||
@api_view(['DELETE'])
|
@api_view(['DELETE'])
|
||||||
def iam_user_project_delete_view(request, pk, pid):
|
def iam_user_project_delete_view(request, pk, pid):
|
||||||
"""移除关联项目"""
|
"""移除关联项目:回收权限 + 移出监测"""
|
||||||
try:
|
try:
|
||||||
project = IAMUserProject.objects.get(pk=pid, iam_user_id=pk)
|
project = IAMUserProject.objects.get(pk=pid, iam_user_id=pk)
|
||||||
|
user = project.iam_user
|
||||||
except IAMUserProject.DoesNotExist:
|
except IAMUserProject.DoesNotExist:
|
||||||
return Response({'error': 'not_found'}, status=status.HTTP_404_NOT_FOUND)
|
return Response({'error': 'not_found'}, status=status.HTTP_404_NOT_FOUND)
|
||||||
|
|
||||||
name = project.project_name
|
name = project.project_name
|
||||||
|
detached = []
|
||||||
|
detach_errors = []
|
||||||
|
|
||||||
|
# 回收之前自动授权的策略
|
||||||
|
account, ak, sk = _get_volc_account(user.volc_account_id)
|
||||||
|
if ak and project.attached_policies:
|
||||||
|
svc = IAMService(ak, sk)
|
||||||
|
for policy_name in project.attached_policies:
|
||||||
|
try:
|
||||||
|
svc.detach_policy_in_project(user.username, policy_name, name)
|
||||||
|
detached.append(policy_name)
|
||||||
|
except VolcengineAPIError as e:
|
||||||
|
detach_errors.append(f"{policy_name}: {e}")
|
||||||
|
|
||||||
|
AlertRecord.objects.create(
|
||||||
|
iam_user=user,
|
||||||
|
alert_type=AlertRecord.AlertType.MANUAL,
|
||||||
|
title=f"移除项目 {name} ← {user.username}",
|
||||||
|
content=f"操作人: {request.user.username},已回收策略: {detached}"
|
||||||
|
+ (f",回收失败: {detach_errors}" if detach_errors else ""),
|
||||||
|
)
|
||||||
|
|
||||||
project.delete()
|
project.delete()
|
||||||
return Response({'message': f'已移除项目 {name}'})
|
|
||||||
|
result = {'message': f'已移除项目 {name},已回收权限: {detached}'}
|
||||||
|
if detach_errors:
|
||||||
|
result['detach_errors'] = detach_errors
|
||||||
|
return Response(result)
|
||||||
|
|
||||||
|
|
||||||
@api_view(['POST'])
|
@api_view(['POST'])
|
||||||
|
|||||||
@ -79,6 +79,26 @@ class IAMService:
|
|||||||
def list_attached_user_policies(self, username: str) -> dict:
|
def list_attached_user_policies(self, username: str) -> dict:
|
||||||
return self.client.call("ListAttachedUserPolicies", {"UserName": username})
|
return self.client.call("ListAttachedUserPolicies", {"UserName": username})
|
||||||
|
|
||||||
|
def attach_policy_in_project(self, username: str, policy_name: str,
|
||||||
|
project_name: str, policy_type: str = "System") -> dict:
|
||||||
|
"""在项目范围内授权"""
|
||||||
|
return self.client.call("AttachUserPolicy", {
|
||||||
|
"UserName": username,
|
||||||
|
"PolicyName": policy_name,
|
||||||
|
"PolicyType": policy_type,
|
||||||
|
"ProjectName": project_name,
|
||||||
|
})
|
||||||
|
|
||||||
|
def detach_policy_in_project(self, username: str, policy_name: str,
|
||||||
|
project_name: str, policy_type: str = "System") -> dict:
|
||||||
|
"""在项目范围内回收权限"""
|
||||||
|
return self.client.call("DetachUserPolicy", {
|
||||||
|
"UserName": username,
|
||||||
|
"PolicyName": policy_name,
|
||||||
|
"PolicyType": policy_type,
|
||||||
|
"ProjectName": project_name,
|
||||||
|
})
|
||||||
|
|
||||||
def disable_user(self, username: str):
|
def disable_user(self, username: str):
|
||||||
"""完全停用用户:停控制台 + 停所有 AccessKey"""
|
"""完全停用用户:停控制台 + 停所有 AccessKey"""
|
||||||
errors = []
|
errors = []
|
||||||
|
|||||||
@ -182,7 +182,14 @@
|
|||||||
<span style="color:#e6a23c;">¥{{ Number(row.current_spending).toLocaleString() }}</span>
|
<span style="color:#e6a23c;">¥{{ Number(row.current_spending).toLocaleString() }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="监测" min-width="80" align="center">
|
<el-table-column label="已授权策略" min-width="180">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-tag v-for="p in (row.attached_policies || [])" :key="p" size="small"
|
||||||
|
style="margin:1px 2px;">{{ p }}</el-tag>
|
||||||
|
<span v-if="!(row.attached_policies || []).length" style="color:#999;font-size:12px;">无</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="监测" min-width="70" align="center">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-switch :model-value="row.monitor_enabled" @change="val => handleToggleProject(row, val)" />
|
<el-switch :model-value="row.monitor_enabled" @change="val => handleToggleProject(row, val)" />
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@ -14,6 +14,12 @@
|
|||||||
逗号分隔的百分比,如 50,80,90 表示消费达到已划拨额度的 50%/80%/90% 时告警
|
逗号分隔的百分比,如 50,80,90 表示消费达到已划拨额度的 50%/80%/90% 时告警
|
||||||
</div>
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="项目默认授权策略">
|
||||||
|
<el-input v-model="projectPoliciesStr" placeholder="ArkFullAccess,TOSFullAccess" />
|
||||||
|
<div style="font-size:12px;color:#999;margin-top:4px;">
|
||||||
|
逗号分隔。添加项目时自动在项目范围内授权这些策略,移除项目时自动回收
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
<el-form-item label="监控间隔(秒)">
|
<el-form-item label="监控间隔(秒)">
|
||||||
<el-input-number v-model="config.monitor_interval_seconds" :min="60" :step="60" />
|
<el-input-number v-model="config.monitor_interval_seconds" :min="60" :step="60" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -88,6 +94,16 @@ const config = ref({})
|
|||||||
const loadingConfig = ref(false)
|
const loadingConfig = ref(false)
|
||||||
const savingConfig = ref(false)
|
const savingConfig = ref(false)
|
||||||
|
|
||||||
|
const projectPoliciesStr = computed({
|
||||||
|
get: () => (config.value.default_project_policies || []).join(','),
|
||||||
|
set: (val) => {
|
||||||
|
config.value.default_project_policies = val
|
||||||
|
.split(',')
|
||||||
|
.map(s => s.trim())
|
||||||
|
.filter(Boolean)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
const alertThresholdsStr = computed({
|
const alertThresholdsStr = computed({
|
||||||
get: () => (config.value.default_alert_thresholds || []).join(','),
|
get: () => (config.value.default_alert_thresholds || []).join(','),
|
||||||
set: (val) => {
|
set: (val) => {
|
||||||
|
|||||||
@ -624,6 +624,7 @@ balance = billing_client.call("QueryBalanceAcct")
|
|||||||
|
|
||||||
**关键设计:**
|
**关键设计:**
|
||||||
- **多项目聚合**:一个子账号可关联多个火山项目,每个项目有独立监测开关。消费 = 所有开启监测的项目消费之和
|
- **多项目聚合**:一个子账号可关联多个火山项目,每个项目有独立监测开关。消费 = 所有开启监测的项目消费之和
|
||||||
|
- **项目即权限**:添加项目时自动调用 `AttachPolicyInProject` 在项目范围内授权(默认 ArkFullAccess + TOSFullAccess,可在系统设置中配置),移除项目时自动回收权限。子账号只能操作被授权的项目,碰不到其他人的资源
|
||||||
- **项目明细可查**:前端可展开查看每个项目的独立消费,便于分析哪个团队/项目花得多
|
- **项目明细可查**:前端可展开查看每个项目的独立消费,便于分析哪个团队/项目花得多
|
||||||
- **非月度制**:额度不按月重置,是一次性划拨,用完再充
|
- **非月度制**:额度不按月重置,是一次性划拨,用完再充
|
||||||
- **可追加可扣减**:主账号可随时追加额度(+5万)或扣减额度(-3万),支持灵活调整
|
- **可追加可扣减**:主账号可随时追加额度(+5万)或扣减额度(-3万),支持灵活调整
|
||||||
@ -1055,12 +1056,12 @@ GET /api/v1/iam-users/{id}/policies/ # 查看权限策略
|
|||||||
POST /api/v1/iam-users/{id}/policies/attach/ # 附加权限策略
|
POST /api/v1/iam-users/{id}/policies/attach/ # 附加权限策略
|
||||||
POST /api/v1/iam-users/{id}/policies/detach/ # 移除权限策略
|
POST /api/v1/iam-users/{id}/policies/detach/ # 移除权限策略
|
||||||
|
|
||||||
# 子账号项目管理(多项目关联)
|
# 子账号项目管理(多项目关联 + 自动授权/回收)
|
||||||
GET /api/v1/iam-users/{id}/projects/ # 查看子账号关联的项目列表
|
GET /api/v1/iam-users/{id}/projects/ # 查看子账号关联的项目列表
|
||||||
POST /api/v1/iam-users/{id}/projects/ # 添加关联项目
|
POST /api/v1/iam-users/{id}/projects/add/ # 添加关联项目(自动在项目范围内授权默认策略)
|
||||||
PUT /api/v1/iam-users/{id}/projects/{pid}/ # 更新项目监测开关
|
PUT /api/v1/iam-users/{id}/projects/{pid}/ # 更新项目监测开关
|
||||||
DELETE /api/v1/iam-users/{id}/projects/{pid}/ # 移除关联项目
|
DELETE /api/v1/iam-users/{id}/projects/{pid}/delete/ # 移除关联项目(自动回收项目范围内的策略)
|
||||||
POST /api/v1/iam-users/{id}/projects/toggle-all/ # 全选/全不选监测开关
|
POST /api/v1/iam-users/{id}/projects/toggle-all/ # 全选/全不选监测开关
|
||||||
|
|
||||||
# 额度管理
|
# 额度管理
|
||||||
POST /api/v1/iam-users/{id}/allocate/ # 追加额度(正数)或扣减额度(负数)
|
POST /api/v1/iam-users/{id}/allocate/ # 追加额度(正数)或扣减额度(负数)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user